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. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 inline hook 示例代码,可以用于 hook 指定的函数,在调用该函数时打印日志信息: ```c++ #include <stdio.h> #include <unistd.h> #include <stdint.h> #include <sys/mman.h> #define HOOK_SIZE 12 // 用于 hook 的函数 void my_function() { printf("my_function called\n"); } // 原始函数 void (*original_function)(); void original_function_impl() { // 执行原始函数实现 } // Hook 函数 void hook_function() { printf("hook_function called\n"); // 调用原始函数 original_function(); } // Hook 函数的字节码 unsigned char hook_code[HOOK_SIZE] = { 0x68, 0x00, 0x00, 0x00, 0x00, // push 0x00000000 0xe9, 0x00, 0x00, 0x00, 0x00, // jmp hook_function 0x90 // nop }; // inline hook 函数 void inline_hook(void *target, void *hook) { // 将目标函数的前 HOOK_SIZE 字节设置为可写 mprotect(target, HOOK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC); // 保存原始函数地址 original_function = (void (*)())target; // 将 Hook 函数地址写入 Hook 代码中 *(uint32_t *)(hook_code + 1) = (uint32_t)hook - (uint32_t)target - HOOK_SIZE; // 将 Hook 代码写入目标函数中 memcpy(target, hook_code, HOOK_SIZE); // 将目标函数的前 HOOK_SIZE 字节设置为只读可执行 mprotect(target, HOOK_SIZE, PROT_READ | PROT_EXEC); } int main() { // 执行原始函数 original_function_impl(); // inline hook 目标函数 inline_hook((void *)original_function_impl, (void *)hook_function); // 再次执行原始函数 original_function_impl(); return 0; } ``` 请注意,该示例代码仅用于演示 inline hook 的原理,实际使用中可能需要更加复杂的实现。此外,inline hook 可能会涉及到一些风险,需要谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值