有人可以帮我解释下这段代码吗!??
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;
问题点数:100、回复次数:9Top
1 楼bee2518(迷茫ing)回复于 2004-12-01 08:47:43 得分 0
ReadProcessMemory该函数允许你去读指定的进程的内存的数据
把读到的数据存在LT中,这个LT没看到声明,应该是TList类型的Top
2 楼surpassable()回复于 2004-12-01 09:08:49 得分 0
mark~~~~~~~
Top
3 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-01 10:11:30 得分 100
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;
Top
4 楼jyassassin(蓝血人)回复于 2004-12-01 11:11:10 得分 0
谢谢大龙驹的精彩解译!!按您这样解,这段代码就是残缺不全的代码了,还以为解开这段中的意思就可以找到基本的内存中查找数据的实现方法呢!
不知哪位大侠有相关的代码可以提供!? 静待一下午,晚上结贴前希望有朋友可以拉我一把!Top
5 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-01 11:17:21 得分 0
还以为解开这段中的意思就可以找到基本的内存中查找数据的实现方法呢!
// 其实内存中的数据 你再不知道其类型 格式的情况下 就算是取得了 也没有意义的。。
// 你这个代码已经实现了从内存中读取信息压。。只不过信息的处理方式可能不一样了
比如 里面一个 1111 可能是一个字符串 也可能是一个整数 之类的。。
重要的是你 对里面数据格式的了解 只有全面了解 你才能知道其意义
比如说 某个游戏中 某个地址偏移量<比如说86的地方>存放着金钱数,那么 你就可以读取出来<以金钱的意义去读取> 然后去修改,因为你明确的知道它是金钱,所以修改可能没有问题,否则 如果修改了某些不能修改的东西 会出问题的。。Top
6 楼jyassassin(蓝血人)回复于 2004-12-01 15:07:30 得分 0
我知道了内存中某个地方的所存的是什么数据...但我想修改的游戏每次启动那地方所分配到这数据的地址都不一样...我不知道应该怎么办!!只有做个查找的工具来查了~头大中....Top
7 楼jyassassin(蓝血人)回复于 2004-12-01 15:09:52 得分 0
我现在的主要问题是
知道地址后我会写内存也会读内存....但是知道数据类型同值但不会从内存中查它的地址!!Top
8 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-01 17:27:28 得分 0
当然了 每次加载的虚拟空间地址是不一样的 可是某个代码 某个值的偏移量应该是不变的。。
但你还是要每次都需要找到首地址Top
9 楼jiangmenghen(江梦痕)回复于 2004-12-01 20:44:24 得分 0
首地址???
就是加载这个要修改的程序时,系统动态分配给它的首地址吗?? 我不找 可以指教下吗!?
每次加载的虚拟空间地址是不一样的 可是某个代码 某个值的偏移量应该是不变的。。
也就是说,找到首地址,把首地址+上偏移量就=想要的地址了对吧!?
Top




