有人可以帮我解释下这段代码吗!??

jyassassin 2004-12-01 08:38:59
var
p : Pointer;
mi : MEMORY_BASIC_INFORMATION;
x,GG : longword;
lPbaseAddr : Pointer;
lPBuffer : array[0..3] of BYTE;

while longword(p)<$80000000do
begin
if (x<>VirtualQueryEx(Handle_Share,p,mi,x)) then break;
if (mi.State = MEM_COMMIT) and (mi.Protect = PAGE_READWRITE) then begin
GG := mi.RegionSize;
lPbaseAddr := p;
while GG > 0 do begin
if ReadProcessMemory(Handle_Share,lPbaseAddr,@lpBuffer,4,j) then
begin
agm := @lpBuffer;
if agm^ = ShareData then begin
New(op);
op^.Data := LongWord(agm^);
op^.Address := Longword(lpBaseAddr);
LT.Add(op);
end;
end;
inc(longword(lpbaseaddr),4);
Dec(GG,4);
end; end;
inc(longword(p),mi.RegionSize);
end;
...全文
82 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
beyondtkl 2004-12-01
  • 打赏
  • 举报
回复
还以为解开这段中的意思就可以找到基本的内存中查找数据的实现方法呢!

// 其实内存中的数据 你再不知道其类型 格式的情况下 就算是取得了 也没有意义的。。
// 你这个代码已经实现了从内存中读取信息压。。只不过信息的处理方式可能不一样了
比如 里面一个 1111 可能是一个字符串 也可能是一个整数 之类的。。

重要的是你 对里面数据格式的了解 只有全面了解 你才能知道其意义
比如说 某个游戏中 某个地址偏移量<比如说86的地方>存放着金钱数,那么 你就可以读取出来<以金钱的意义去读取> 然后去修改,因为你明确的知道它是金钱,所以修改可能没有问题,否则 如果修改了某些不能修改的东西 会出问题的。。
jyassassin 2004-12-01
  • 打赏
  • 举报
回复
谢谢大龙驹的精彩解译!!按您这样解,这段代码就是残缺不全的代码了,还以为解开这段中的意思就可以找到基本的内存中查找数据的实现方法呢!

不知哪位大侠有相关的代码可以提供!? 静待一下午,晚上结贴前希望有朋友可以拉我一把!
beyondtkl 2004-12-01
  • 打赏
  • 举报
回复
var
p : Pointer;
mi : MEMORY_BASIC_INFORMATION;
x,GG : longword;
lPbaseAddr : Pointer;
lPBuffer : array[0..3] of BYTE;

while longword(p)<$80000000do // $80000000的值不允许存取
begin // 估计 Handle_Share是某一个FileMapping或者为一个EXE之类的句柄
if (x<>VirtualQueryEx(Handle_Share,p,mi,x)) then break;// x没有初始化.. 获得相应进程虚拟地址空间,返回为空间的BYTE数
if (mi.State = MEM_COMMIT) and (mi.Protect = PAGE_READWRITE) then begin // 1表示已经被分配物理内存 2.表示可以页面写
GG := mi.RegionSize; // 获得所有相同属性<上述属性>的空间大小
lPbaseAddr := p; // 保存本段区域的首地址
while GG > 0 do begin // 大小>0
if ReadProcessMemory(Handle_Share,lPbaseAddr,@lpBuffer,4,j) then // 从首地址读取4byte的数据到lpBuffer
begin // 下面就是你自己的操作了
agm := @lpBuffer;
if agm^ = ShareData then begin
New(op);
op^.Data := LongWord(agm^);
op^.Address := Longword(lpBaseAddr);
LT.Add(op);
end;
end;
inc(longword(lpbaseaddr),4); // 继续读取
Dec(GG,4); // 继续读取
end; end;
inc(longword(p),mi.RegionSize); // 继续循环
end;
surpassable 2004-12-01
  • 打赏
  • 举报
回复
mark~~~~~~~
bee2518 2004-12-01
  • 打赏
  • 举报
回复
ReadProcessMemory该函数允许你去读指定的进程的内存的数据
把读到的数据存在LT中,这个LT没看到声明,应该是TList类型的
jiangmenghen 2004-12-01
  • 打赏
  • 举报
回复
首地址???

就是加载这个要修改的程序时,系统动态分配给它的首地址吗?? 我不找 可以指教下吗!?


每次加载的虚拟空间地址是不一样的 可是某个代码 某个值的偏移量应该是不变的。。

也就是说,找到首地址,把首地址+上偏移量就=想要的地址了对吧!?
beyondtkl 2004-12-01
  • 打赏
  • 举报
回复
当然了 每次加载的虚拟空间地址是不一样的 可是某个代码 某个值的偏移量应该是不变的。。

但你还是要每次都需要找到首地址
jyassassin 2004-12-01
  • 打赏
  • 举报
回复
我现在的主要问题是

知道地址后我会写内存也会读内存....但是知道数据类型同值但不会从内存中查它的地址!!
jyassassin 2004-12-01
  • 打赏
  • 举报
回复
我知道了内存中某个地方的所存的是什么数据...但我想修改的游戏每次启动那地方所分配到这数据的地址都不一样...我不知道应该怎么办!!只有做个查找的工具来查了~头大中....

1,183

社区成员

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

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