如何对程序内存数据进行读取和修改

Nancylee121 2008-11-05 11:40:16


比如我想读取程序名为yy.exe的程序里面的$11388A0 里面的数据.应该怎么写?
ar taskName:String;
i:integer;
TempHandle:Thandle;
TempID,tempAddress:Dword;
Ecode:integer;
hp:pansichar;
TempByte:Byte;



begin
if ListView1.Selected<>nil then
begin
Val(ListView1.Selected.SubItems[0],TempID,Ecode);
end;
TempHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,tempID);


Val('$009522B8',tempAddress,Ecode);
ReadMemory(CurrentProcessID,tempAddress,@tempByte,Byte_value);
edit1.text:=inttostr(tempByte);

我是先把进程和进程ID写进liseview1里面.然后来选择该进程.最后进行读取.我想读取的程序009522B8数值应该是55为什么edit显示的数字为0??
...全文
693 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nancylee121 2008-11-07
  • 打赏
  • 举报
回复
除了用timer就没有其它方法了吗?
「已注销」 2008-11-06
  • 打赏
  • 举报
回复
什么叫输入数值查找地址?如果给你一个数字.看你系统寻址地址如果是2G(FFFFFFFF)给你一个数,只要Integer64或Integer(数字)得到程序的内存起始地址+上你给定的地址就可以了!~取的都是堆中的相对地址.楼主的意思是不是取硬件单元上的地址?如果是的话可能需要操作系统配合下才可以!~
Nancylee121 2008-11-06
  • 打赏
  • 举报
回复
内存的锁定和按输入数值查找地址怎么实现????头大了?
evileagle 2008-11-06
  • 打赏
  • 举报
回复
哎,很明显嘛~~~
evileagle 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Nancylee121 的回复:]
我已经实现在读取和修改了?请问下.我如何来进行锁定我修改的值.比如我改成50了.我要让这个值锁到50.不论修改的那个程序怎么变化.这个值只是50
[/Quote]
锁定?你不停刷新不就行了隔0.5秒或者更快的速度把它改成50
Nancylee121 2008-11-05
  • 打赏
  • 举报
回复
怎么没有人回答?希望有人能帮到我.
Nancylee121 2008-11-05
  • 打赏
  • 举报
回复
希望有人能告诉我详细的方法?我自己查了好多资料自己试.怎么都没成功.已经两天了.

我希望知道.如何写才能正确的修改内存数据.如何写才能正确读出数据.如何写才能锁定修改的数据.谢谢.分不够我再加.
zhangxiaommmm 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 okmnji79513 的回复:]
lz 在diy金山游侠?这个要学习下。
[/Quote]

你也够厉害的,在哪看出楼主是diy金山游侠?
okmnji79513 2008-11-05
  • 打赏
  • 举报
回复
lz 在diy金山游侠?这个要学习下。
Nancylee121 2008-11-05
  • 打赏
  • 举报
回复
我已经实现在读取和修改了?请问下.我如何来进行锁定我修改的值.比如我改成50了.我要让这个值锁到50.不论修改的那个程序怎么变化.这个值只是50
Nancylee121 2008-11-05
  • 打赏
  • 举报
回复
我自己写了个测试程序.里面有个变量a

我写了几个button.

button1=A+2; BUUTON2=A+4;


我用CE找到了A的地址.009522B8'


用CE就可以看到这个地址的数字在变化
BUTOON1就可以看到
「已注销」 2008-11-05
  • 打赏
  • 举报
回复
为零说明没有读到数据或就是为零

BOOL ReadProcessMemory(
HANDLE hProcess, // handle of the process whose memory is read
LPCVOID lpBaseAddress, // address to start reading
LPVOID lpBuffer, // address of buffer to place read data
DWORD nSize, // number of bytes to read
LPDWORD lpNumberOfBytesRead // address of number of bytes read
);

你要考虑到你要读的那个数据是什么类型的数据.我们计算机都是高端存放数据.如果是$000A在内存中可能是 000A/0A00数据.如果你读了为零位当然是零拉!~~
dreamyuyu 2008-11-05
  • 打赏
  • 举报
回复
类似的我贴一个出来.

//读取某游戏的某个数据
function TMyCanMusic.GetScore: integer;
var
Num: cardinal;
PHND: THandle;
PID, Score: Integer;
D :DWord;
begin
Self.FXXCANH :=FindWindow(nil,'MyCanMusic Stand Alone by NDogXJ <Final Unicode ver>');
if self.FXXCANH=0 then
begin
Result :=0;
exit;
end;
GetWindowThreadProcessId(self.FXXCANH, @PID);
PHND := OpenProcess(PROCESS_ALL_ACCESS,False,PID);
if PHND <> 0 then
ReadProcessMemory(PHND, Pointer($00455a00), @D, 4, Num);
d :=d+$28;
ReadProcessMemory(PHND, Pointer(d), @score, sizeof(score), Num);
//1.0.0.5版本
CloseHandle(PHND);
result :=Score;
end;
fangsp 2008-11-05
  • 打赏
  • 举报
回复
帮你顶一个
没这样实现过
你可以转变一下思路
可以采用端口发送信息啊

1,183

社区成员

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

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