JMP、Hook

  1. #include "stdio.h"  
  2. #include "tchar.h"  
  3. #include "windows.h"  
  4.   
  5.   
  6. //offset=目标地址-(jmp指令起始地址+5)  
  7. //跳转指令解码:[0xe9][offset]  
  8. //  offset:有符号整型,四字节.它等于jmp指令的下一指令地址到目标地址的相对距离  
  9. //  计算公式:  
  10. //  offset=目标地址-(jmp指令起始地址+5)  
  11. //其实还有0xeb等短跳转指令可用的,但用的最多的还是0xe9跳转  
  12.   
  13. BYTE jmp[5]={0};  
  14. BYTE enter[5]={0};  
  15. HANDLE hProcess=NULL;  
  16. DWORD pfnMsgBox=0;  
  17. DWORD dwOld=0;  
  18.   
  19. int WINAPI MessageBoxProxy(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType)  
  20. {  
  21.  int ret=0;  
  22.  printf("this is MessageBoxProxy begin!\n");  
  23.  printf("Caption:%s\n",lpCaption);  
  24.  printf("Text:%s\n",lpText);  
  25.   
  26.  memcpy((void*)pfnMsgBox,enter,5);//恢复入口指令  
  27.  FlushInstructionCache(hProcess,(void*)pfnMsgBox,5);  
  28.   
  29.  ret=MessageBox(hWnd,lpText,lpCaption,uType);//调用原函数  
  30.    
  31.  memcpy((void*)pfnMsgBox,jmp,5);//写入跳转指令  
  32.  FlushInstructionCache(hProcess,(void*)pfnMsgBox,5);  
  33.  printf("this is MessageBoxProxy end!\n");  
  34.  return ret;  
  35. }  
  36.   
  37. void SetupHook(void)  
  38. {  
  39.  pfnMsgBox=(DWORD)GetProcAddress(GetModuleHandle(_T("user32.dll")),_T("MessageBoxA"));  
  40.  memcpy(enter,(void*)pfnMsgBox,5);//保存入口指令  
  41.   
  42.  jmp[0]=0xe9;  
  43.  *(int*)&jmp[1]=(int)&MessageBoxProxy-((int)pfnMsgBox+5);  
  44.    
  45.  //写入跳转指令,调用MessageBoxA时会跳到MessageBoxProxy  
  46.  VirtualProtect((void*)pfnMsgBox,5,PAGE_EXECUTE_READWRITE,&dwOld);  
  47.  memcpy((void*)pfnMsgBox,jmp,5);  
  48. }  
  49.   
  50. void RemoveHook(void)  
  51. {  
  52.  DWORD dwtemp;  
  53.  memcpy((void*)pfnMsgBox,enter,5);  
  54.  FlushInstructionCache(hProcess,(void*)pfnMsgBox,5);  
  55.  VirtualProtect((void*)pfnMsgBox,5,dwOld,&dwtemp);  
  56. }  
  57.   
  58. int main(void)  
  59. {  
  60.  hProcess=GetCurrentProcess();  
  61.   
  62.  SetupHook();  
  63.  MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);  
  64.    
  65.  RemoveHook();  
  66.  MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);  
  67.  system("pause");  
  68.  return 0;  
  69. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值