首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

发现 HOOK注入DLL到目标程序后,DLL中的指针不能正常读出目标程序某地址内容解决办法

2012-02-11 
发现 HOOK注入DLL到目标程序后,DLL中的指针不能正常读出目标程序某地址内容我用HOOK方式把一个DLL注入到目

发现 HOOK注入DLL到目标程序后,DLL中的指针不能正常读出目标程序某地址内容
我用HOOK方式把一个DLL注入到目标程序中,要求DLL读出目标程序一级基址(0x00925484)中的内容

DLL中代码如下:

DWORD a = *(DWORD*)0x00925484; //读出目标程序的一级基址的内容给变量a(一级基址内容固定不变的)
TCHAR* x = new TCHAR; //以下三句用于输出该内容
wsprintf((LPWSTR)x,TEXT("%d"),i);  
MessageBox(NULL,(LPCWSTR)x,NULL,0);

运行后发现 输出:35e70d0(不是我想要的内容)

通过CE查看目标程序中一级基址(0x00925484)的内容为: 56520932 (是我想要的正确内容)

难道是 DWORD a = *(DWORD*)0x00925484 这种用指针读内存的方法哪里出错了?

我再试一下用汇编方法读
改DLL 中代码为:

DWORD a =0x00925484;
__asm{
  pushad
  mov eax,dword ptr ds:[a]; 
  mov a,eax
  popad  
}
TCHAR* x = new TCHAR; //以下三句用于输出该内容
wsprintf((LPWSTR)x,TEXT("%d"),i);  
MessageBox(NULL,(LPCWSTR)x,NULL,0);


运行后发现 输出:35e70d0(还是这个内容)

这两个方法都读不出一级基址的内容,难道是我用HOOK方法注入后,指针就不能正确读到目标程序基地址的内容,还是
DLL注入后,DLL中的代码要读目标程序地址,这个地址必须加上一个偏移值。

于是又改了一下DLL中代码,用ReadProcessMemory()
代码如下:
  DWORD a =0x00925484;
  HWND GamehWnd;
DWORD PID;
HANDLE GameHandle;
GamehWnd=::FindWindow(NULL,TEXT("Element Client")); //目标程序"Element Client")
::GetWindowThreadProcessId(GamehWnd,&PID);
GameHandle=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
ReadProcessMemory(GameHandle,(LPCVOID)a,&a,4,0);

  TCHAR* x = new TCHAR; //以下三句用于输出该内容
  wsprintf((LPWSTR)x,TEXT("%d"),i);  
  MessageBox(NULL,(LPCWSTR)x,NULL,0);

运行后 输出: 56520932 (是我想要的正确内容)


用了三个方法,只有最后一个方法可以正确读出。想了好久都不明白,哪位朋友遇过这问题的,第一种方法要怎么做才能正确
读到内存地址内容呢?


[解决办法]
好复杂啊。。。 。。。晕死了。。。

[解决办法]
顶........
[解决办法]
那就用ReadProcessMemory喽。。。鬼才知道MS内部怎么搞的
[解决办法]
是不是你的dll没有hook入指定进程?
[解决办法]
第一种方法应该可以,看看dll注入指定进程没

热点排行