作者:航模特异_831 | 来源:互联网 | 2023-05-17 09:53
我想取得别的程序的StringGrid中的内容,我的思路是写一个dll插入到目标进程中,取得stringgrid的地址,然后在dll中取得stringgrid中cell的值。stringgri
我想取得别的程序的StringGrid中的内容,我的思路是写一个dll插入到目标进程中,取得stringgrid的地址,然后在dll中取得stringgrid中cell的值。
stringgrid的地址我已经取得了,和目标程序中比对过了, 是正确的,可是我在dll中引用的时候就出现内存访问错误了,
下面是在dll中的代码:
HANDLE hd=FindControlHandle();//找到目标程序stringgrid的句柄
TStringGrid *StringGrid1;
//把句柄转换成地址,这里参考delphi论坛中相关问题的解决方法,重写了FindControl函数。这里得到的stringgrid的地址是正确的。
StringGrid1= (TStringGrid*)(FindControl2(hd));
AnsiString s;
s.sprintf("%.8X",hd);
ShowMessage("stringgrid的句柄:"+s);
s.sprintf("%.8X",StringGrid1);
ShowMessage("stringgrid的地址:"+s);
ShowMessage(StringGrid1->Cells[2][2]); //这里出现内存访问错误.
7 个解决方案
StringGrid1= (TStringGrid*)(FindControl2(hd));
这一句执行完看看StringGrid1的值是否为NULL,就知道FindControl2有没有成功。
StringGrid1= (TStringGrid*)(FindControl2(hd));
这一句执行完看看StringGrid1的值是否为NULL,就知道FindControl2有没有成功。
------------------------------------------
stringgrid1的值我看过,就是在目标程序中的stringrid的值,所以这点我特别困惑,明明已经的到了这么内存地址,为什么引用的时候会出现错误呢?
必须将代码注入到目标进程中才可以那样访问。 否则跨进程的访问肯定要AV的。
我已经把dll注入到目标进程中去了,hook也提示成功,从一些工具中也可以看出目标进程中有这个dll
>>> ShowMessage(StringGrid1->Cells[2][2]); //这里出现内存访问错误.
你说的这一句,是在Dll中的代码还是App中的?
>>> ShowMessage(StringGrid1->Cells[2][2]); //这里出现内存访问错误.
你说的这一句,是在Dll中的代码还是App中的?
---------------------------------
放在dll中的
这个帖子原来放bcb区,不知道怎么解决,希望在vc区有人能帮忙解决