首页
社区
课程
招聘
[求助]关于API HOOK的问题
发表于: 2009-7-28 18:03 4914

[求助]关于API HOOK的问题

2009-7-28 18:03
4914
我看到了一段程序:
char szOldMessageBox[5] = {0}; 
char szJmpMyMessageBox[5] = {(char)0xe9}; 
pMessageBoxDef pMessageBox = NULL; 
int WINAPI MyMessageBox(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) 
{
  wcout<<L"hWnd:"<<(int)hWnd<<endl; 
  wcout<<L"lpText:"<<lpText<<endl; 
  wcout<<L"lpCaption:"<<lpCaption<<endl; 
  wcout<<L"uType:"<<uType<<endl<<endl; 
  WriteProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL); 
  MessageBoxW(hWnd, lpText, lpCaption, uType); 
  WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL); 
  return 0; 


int main() 

  DWORD dwJmpAddr = 0; 
  HMODULE hModule = LoadLibrary("User32.Dll"); 
  pMessageBox = (pMessageBoxDef)GetProcAddress(hModule, "MessageBoxW"); 
  dwJmpAddr = (DWORD)MyMessageBox - (DWORD)pMessageBox -5; 
  memcpy(szJmpMyMessageBox + 1, &dwJmpAddr, 4); 
  FreeLibrary(hModule); 
  cout<<sizeof(DWORD);
  ReadProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);//读出原来的前5个字节 
  WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);//写入我们处理后的5个字节 
  MessageBoxW(GetForegroundWindow(), L"Inline Hook:MessageBox", L"HOOK API", MB_OK); 
  MessageBoxW(GetForegroundWindow(), L"Hello World", L"Win32", MB_OK);
  return 0;
}
请问为什么跳转地址是dwJmpAddr = (DWORD)MyMessageBox - (DWORD)pMessageBox -5;   它是怎么计算的,为什么不直接跳转到MyMessageBox的地址?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
先学汇编.
2009-7-28 18:15
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
学OpCode…
2009-7-28 18:47
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
不会计算可以mov reg,xxxx jmp reg,或者push xxxx/retn等等,不过这样就不是5个字节了
2009-7-28 18:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用w32dasm看了一下,call后面的偏移地址加上call指令的当前地址 和最终需要call到的地址刚好差了5个byte=call指令的字节数。
2009-7-29 13:01
0
雪    币: 227
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zpf
6
检测时jmp指令的第一个字节是0XE9 CALL指令第一个字节是0xe8....我们检测就是从函数地址开始读取五个字节....先判断第一个字节是否为0xe9或者0xe8......是的话就可疑了.....但正常的函数开头也可以是一条jmp指另....这就要看它跳到哪里了......如果跳的地址不在可信范围内,则是inline hook
2009-7-29 15:37
0
雪    币: 227
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zpf
7
顺便问下
ReadProcessMemory
WriteProcessMemory 的第一个参数为什么用(void*)-1
2009-7-29 16:34
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
8
-1==GetCurrentProcess()
2009-7-29 17:58
0
雪    币: 227
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zpf
9
从程序上理解是这样的 但为什么MSDN上查不到
2009-7-29 18:20
0
游客
登录 | 注册 方可回帖
返回
//