问一个快速内存遍历的问题

cuteant 2009-03-22 04:34:36
加精
想在内存里面搜索某个字节出现的所有位置,用指针遍历4G内存

但是大部分内存都是无效的,访问会出错,因此中间需要判断有效性

要怎么做才能做到快速?

var
L: TList;
begin
for I := 0 to $FFFFFFFF do
begin
if not IsBadReadPtr(PByte(I), 1) then
begin
if PByte(I)^ = $3F then
begin
//这里保存地址
end;
end;
end;
end;

上面的过程,我测试的时候只是用了$00FFFFFF,都用了一分钟左右
请问要怎么改进才能快速搜索0~$FFFFFFFF之间的内存?
...全文
3579 72 打赏 收藏 转发到动态 举报
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanyuxcm 2010-10-23
  • 打赏
  • 举报
回复
看来落伍了,要学习啊!!!
taick 2010-09-27
  • 打赏
  • 举报
回复
学习学习
zhuang_bx 2009-08-08
  • 打赏
  • 举报
回复
遍历内存的一段代码,数据就不整理了


procedure TForm1.cbxProcessClick(Sender: TObject);
var
info:MEMORY_BASIC_INFORMATION;
base,i,len,dMax,u:Longword;//,dAddress
strPAGE:string;
begin
if mhProcess<>0 then //如果进程句柄值不为0 ,则先释放原先的进程句柄
CloseHandle(mhProcess);
mhProcess:=OpenProcess(PROCESS_ALL_ACCESS,true,mProcessIDList[cbxProcess.ItemIndex]); //打开进程,即取得进程句柄
if mhProcess=0 then exit;
base:=0;i:=0;dMax:=0;u:=0;//dAddress:=0;
len:=sizeof(info);
sgAddress.RowCount :=1000;
While VirtualQueryEx(mhProcess, Ptr(Base), info, Len)<> 0 do //查找使用的虚拟内存
begin
//如果是想搜索游戏数据,一般只需要在PAGE_READWRITE类型的地址空间里搜索就行了。
If info.Type_9 <> 0 Then
If info.Protect = PAGE_READWRITE Then
begin
case info.Protect of
PAGE_NOACCESS: strPAGE:='PAGE_NOACCESS';
PAGE_READONLY: strPAGE:='PAGE_READONLY';
PAGE_READWRITE: strPAGE:='PAGE_READWRITE';
PAGE_WRITECOPY: strPAGE:='PAGE_WRITECOPY';
PAGE_EXECUTE: strPAGE:='PAGE_EXECUTE';
PAGE_EXECUTE_READ: strPAGE:='PAGE_EXECUTE_READ';
PAGE_EXECUTE_READWRITE: strPAGE:='PAGE_EXECUTE_READWRITE';
PAGE_EXECUTE_WRITECOPY: strPAGE:='PAGE_EXECUTE_WRITECOPY';
PAGE_GUARD: strPAGE:='PAGE_GUARD';
PAGE_NOCACHE: strPAGE:='PAGE_NOCACHE';
else
strPAGE:='未知类型: '+inttostr(info.Protect);
end;
inc(i); //加1
sgAddress.Cells[0,i]:=inttostr(i);
sgAddress.Cells[1,i]:=format('%.8x',[base]); //地址
sgAddress.Cells[2,i]:=format('%d',[info.RegionSize]);//大小
//sgAddress.Cells[3,i]:=strPAGE;//属性页类型
if dMax<info.RegionSize then
begin
inc(u,info.RegionSize);
dMax:=info.RegionSize;
//dAddress:= base;
sgAddress.Row := i;
end;
end;
base := base + info.RegionSize;
end;
if i>0 then
begin
sgAddress.RowCount :=i+1;
end
else begin
sgAddress.RowCount :=2;
sgAddress.Rows[1].Clear;
end;
StatusBar1.Panels[0].Text :=format('页数: %d 大小: %d',[i,u]);
end;
liruiu2u 2009-04-25
  • 打赏
  • 举报
回复
做个标记 以后来看
superdiablo 2009-03-26
  • 打赏
  • 举报
回复
mark
linzhen169 2009-03-26
  • 打赏
  • 举报
回复
还有其他好的算法吗??
linzhen169 2009-03-26
  • 打赏
  • 举报
回复
这个建议貌似不错。。
再路上tro 2009-03-26
  • 打赏
  • 举报
回复
很不错了。
chentx_123 2009-03-26
  • 打赏
  • 举报
回复
学习,顶
Simao 2009-03-26
  • 打赏
  • 举报
回复
学习...
zwh37333 2009-03-25
  • 打赏
  • 举报
回复
readmemory
wcwcwcwc1121 2009-03-25
  • 打赏
  • 举报
回复
高手云集?
alasea 2009-03-25
  • 打赏
  • 举报
回复
其实很简单。
更没必要开线程

听过SEH吧,设置自己的seh handler
直接foreach byte in 0x0 - 0xffffffff
在seh handler中处理内存访问缺页异常
zbing0203 2009-03-25
  • 打赏
  • 举报
回复
mmmm
野男孩 2009-03-25
  • 打赏
  • 举报
回复
用VirtualQueryEx来确认已提交的内存区域,然后搜索内存,哪有lz说得那么慢。不就是做类似游戏修改器的程序嘛,以前做过,很快的。不可能到分钟这种级别。
windriver3 2009-03-25
  • 打赏
  • 举报
回复
up
wenweifirst 2009-03-24
  • 打赏
  • 举报
回复
学习
Rainstorey 2009-03-24
  • 打赏
  • 举报
回复
有很多开源的"游戏修改器"可以参考一下
pengpzy 2009-03-24
  • 打赏
  • 举报
回复
学习了,
梦无痕123 2009-03-24
  • 打赏
  • 举报
回复
mark
加载更多回复(52)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧