现在的位置: 首页 > 综合 > 正文

delphi7 跨进程 读写内存总结

2013年02月05日 ⁄ 综合 ⁄ 共 1809字 ⁄ 字号 评论关闭

今天突然间心血来潮,想研究一下以前看了几十回都没看懂的内存读写部分的 代码

本人蠢笨,于时历经几个小时,外加 搜索了 网上无数个贴子后,再加个人 实战,终于 理解和明白了 80%, 大概知道应该如何运用 了。

还有一些细节可能需要以后实战的时候比较容易理解吧。

delphi 测试内存读写需要搞二个exe 来玩。

以下是

project1.exe

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
  s:='abcd';
  showmessage(IntToHex(Integer(s),8)); //转换成16进制,我测试的时候调用这个地址,下面那个是什么地址我也不清楚。
  showmessage(s);
  showmessage(IntToHex(Integer(@s),8)); //转换成16进制。

end;

project1.exe 代码简单,这个要设置它的标题为 testme 下面要用到

目标是得到 变量  s 的地址,等一下,通过project2.exe 对其进行读写

下面是 project2.exe

procedure TForm1.Button1Click(Sender: TObject);
const
ResourceOffset: dword = $00452200; //结果是十进制 4530688 ,这个地址就是 project1.exe 点击后,自动换算出来 变量 s 的地址,16进制才好使

var
ss:dword;
nn:string;
hw:hwnd;
pid:dword;
h:Thandle;
tt,tt1:cardinal;
news:string;
begin
hw:=FindWindow(nil,'testme'); //取得窗口
//showmessage(inttostr(hw));
if hw=0 then
exit;

GetwindowthreadProcessid(hw,@pid); //得到进程id
//showmessage(inttostr(pid));
h:=OpenProcess(PROCESS_ALL_ACCESS,false,pid); //打开进程
if h=0 then
  exit;
//showmessage(inttostr(h));

ReadProcessMemory(h,Pointer(ResourceOffset),pointer(@ss), sizeof(ss), tt); //得到变量s 所在地址上内存保存的数据,初定是 abcd
edit1.text:=pchar(@ss);  //显示 内存数据,@ss 表示,刚才读取到的数据地址。 上一句是将搞到的数据,放到@ss地址。 pchar(@ss) 应该是字符化这个数据

//tt 是实际上搞到的数据长度。这个长度 影响了下面写内存的可写长度。你给再长的数据,它就只能写入tt这么长的数据到变量 s

news:=edit2.text;
//nn:=inttohex(integer(news),8); //这个变量的地址 ,开始用这个地址好像失败了?原因?为什么呢?

WriteProcessMemory(h, Pointer(ResourceOffset),pchar(news), sizeof(pchar(news)), tt1); //修改这个地址的数据,能写入的长度受上一个tt影响

// pchar(news) 用这个就可以将数据写到 指定内存地址了。 为什么用 pchar?不是用 pointer(nn)? 为什么呢?tt1 理论上和tt 一样。

closehandle(h);

end;

 

特别要注意的是  sizeof(ss) 和 sizeof(pchar(news)) 这二处,给限死了4个字节。

实际应用的时候,将这个长度限制希望读取的长度,以及希望保存进去的长度。

嗯,这个不在这里研究,高手就一笑而过吧。

 

另外一个就是,如果变量s 比较长,而写入比较短,则 修改后,project1.exe  点击显示的结果,将只是修改了前面部分。后面的不会改变。

这个要注意吧。

问题也蛮多的。不过至少大概知道如何使用。如果有大虾能指点一二就跪谢了。

值得一提的是,测试的时候,我破电脑上的 360 鬼一样使劲弹 病毒提示,尼玛360,这也叫病毒?日了。

另外一个就是,网上的相关资料,有的时候稍复杂了点,都是你抄我来,我抄你,极少一些人性化的教程,或者说明。

很多东西都只能靠自己不断地测试。唉。累。

无轩居士

2012.05.06

抱歉!评论已关闭.