delphi如何通过其他程序的指针取得数据?(200分)

  • 主题发起人 主题发起人 小虫~
  • 开始时间 开始时间

小虫~

Unregistered / Unconfirmed
GUEST, unregistred user!
请教一下,如何用delphi调用另一个程序的指针的数据,
我现在只能做到查询另一个程序的内存的数据,知道了指针的偏移,如何取得呢?
push esi
mov esi, ecx
push dword ptr [esi+000000F4] ;获得对象的数据结构首址
push dword ptr [esi+000000B0]
call 0045D2CA
xor ecx, ecx
cmp eax, ecx ;是否成功,非零就成功
je 00425188 ;失败转
jmp 004D1640
.......//以下为源程序中取得数据并放入$4d1720处!
push dword ptr [eax+00000218] ;对象1的地址
push dword ptr [eax+00000214] ;对象1字符串指针
push 004D1720 缓存地址
push 004D1700
mov esi, dword ptr [0049CE32]
call dword ptr [esi]
add esp, 00000010
pop esi
pop edx
pop ecx
pop eax
cmp dword ptr [eax+000001DC], ecx
mov esp, ebx
jmp 0042515D
 
没有人回答???不行的话我在加分就是了阿!!!!!!
 
不是不回答,是我不懂啊。
密切关注。
 
如果对方不配合, 你无法可想. 你取到的所谓偏移是别人虚拟内存内的偏移, 如果针对
你到自己进程空间的相同偏移处, 当然那里根本没有别人程序的东西.
 
如果对方不配合, 你无法可想. 你取到的所谓偏移是别人虚拟内存内的偏移, 如果针对
你到自己进程空间的相同偏移处, 当然那里根本没有别人程序的东西.
我是先通过我的程序取得另一个程序的句柄,通过句柄得到它的内存地址,这两部我都实现
了!并且我也知道另一个程序我所需要的指针的偏移,以上的程序就是另一个程序的反汇编
,也就是通过这个指针算出数据的存放地址就可以取得!
希望大家帮忙!谢谢!
 
即使算出来了绝对地址又有什么用? 你无法调整你程序所在的的虚拟段寄存器(那是
操作系统特权指令), 因此你也就无法访问你想访问的内容. 即使你将那个绝对地址印
射成你程序的虚拟地址, 也绝对访问不到别人的内容, 肯定产生共享冲突错误(而且是
硬件--CPU产生的哦)
 
是的,就是这个原因,才来求教的阿!有其他的办法吗????
 
小虫~:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
兄弟真是高手
 
不使用VXD好像可以到达RING0级别阿!!
还有人帮忙吗???
 
不需要使用vxd这么高深的技术吧!
只要你知道目标进程中得指针偏移和数据结构的大小,就可以轻易的使用
ReadProcessMemory将目标进程的数据直接读到自己进程的地址空间中,
这样不就可以在自己的程序中使用了吗?
 
不同进程的数据在不同的进程空间,相互是透明的,这是操作系统规定的,也是Win32
和Win16的不同之处,除非两个程序有些一用什么进程间通讯的机制进行通讯,
否则的话,恐怕读不到吧...
 
有人能做个事例吗???
 
抱歉,这里实在太慢了,好不容易才上来一次 8(
to:Kent
Win32的特性确实如此,不同进程是相互透明的,因此在一个进程中直接使用
一般的读取内存的方法是读不到其他进程的数据的,所以Win32API中就提供了
ReadProcessMemory和WriteProcessMemory这两个函数来进行进程间的数据交换,
我编写的一个GameExpert游戏修改程序就是这样工作的,很方便的,可以到我主页
下载。
to:小虫~
其实使用ReadProcessMemory和WriteProcessMemory很容易的,你可以参考Win32.hlp
关键就是要正确区的进程的ID,然后用OpenProcess打开就可以得到进程句柄了,而进程
句柄是ReadProcessMemory必需的一个参数。
 
谢谢dxqsoft,我原来就试过了,没有成功:(
其实,就是写一个小程序,包含一个指针,并运行,在写一个程序,如果能将指针读出来就
行了.不过,不能使用com等沟通的方法!不知谁能做出来:)
 
估计是你调用的方法有问题,所以没有成功
可以这样写:
假设A程序中有一个指针P,现在要从B程序中读取A进程中P指针指向的内存
这是B程序中的代码
var ID,Result1:integer; ph,hA:THandle;
Buff:TDataType;//假设TDataType就是A进程中P指针指向的数据结构
begin
hA:=...;//假设我已经取得了A进程中某个窗体的句柄,可以使用FindWindow等方法
GetWindowThreadProcessID(hA,@ID);//获得A进程的Process ID
ph:=OpenProcess(PROCESS_ALL_ACCESS,true,ID);//取得进程句柄
if ReadProcessMemory(ph,P,@Buff,Sizeof(Buff),Result1) then//读出进程A中P指针指向的
//内存数据,返回的数据保存在Buff中
...
end;

至于使用Com等方法也是可以的,不过就很麻烦了,或者也可以使用CreateFileMapping来
实现,或者使用WM_CopyData也可以。
 
清结束或继续
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
753
import
I
I
回复
0
查看
548
import
I
I
回复
0
查看
816
import
I
后退
顶部