small-q 发表于 2017-10-19 11:02:54

自由地址 HOOK 二则 for X86

本帖最后由 small-q 于 2017-10-19 11:05 编辑

这个是MS的,老东西了
PY_DWORD addr2;
double MyFunc()
{
      __asm pop edi \
      __asm pop esi \
      __asm pop ebx \
      __asm pop ebp \
      __asm pushad
      //函数头恢复达堆栈平衡
/////////////////////////////////////////////////////////////////////////////////////
      //自由代码区
      MessageBoxW(NULL,L"Detour Addr HOOK 测试",L"PYG提示:",NULL);

/////////////////////////////////////////////////////////////////////////////////////
      UnHookAPI1();//恢复原地址,配合下面的代码进行返回
      __asm popad \
      __asm jmp addr1
}

VOID HookAPI1()
{
      DetourTransactionBegin();
      DetourUpdateThread(GetCurrentThread());
      DetourAttach(&(PVOID&)addr1, MyFunc);
      if(DetourTransactionCommit() == NO_ERROR)
      {
                //error
      }
}

VOID UnHookAPI1()
{
      DetourTransactionBegin();
      DetourUpdateThread(GetCurrentThread());
      DetourDetach(&(PVOID&)addr1, MyFunc);
      if(DetourTransactionCommit() == NO_ERROR)
      {
                //error
      }
}

这个是老飘那X64改的,感谢飘
// HOOK指令长度
#define HOOK_LEN 0x8
// 保存原始指令
BYTE Ori_Code = {0x00};

// Hook代码

/*   方式一
pushad
MOV EAX, 0x90909090
JMP EAX
*/

BYTE HookCode =
{
      0x60, 0xB8, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0
};


INT32 MyHOOK32()
{
      ///自由代码区////////////////////////////////////////////////////////////////////
      MessageBoxW(NULL,L"Addr 自定义HOOK 测试",L"PYG提示:",NULL);

      /////////////////////////////////////////////////////////////////////////////////////
      UnHookAPIQ();
      __asm pop edi \
      __asm pop esi \
      __asm pop ebx \
      __asm pop ebp \
      __asm popad \
      __asm jmp addr1
      //EDI为0达到破解效果
}

VOID HookAPIQ()
{
      DWORD OldProtect;
      ::VirtualProtect((LPVOID)addr1, HOOK_LEN, PAGE_EXECUTE_READWRITE, &OldProtect);
      // 得到原始指令
      memcpy(Ori_Code, (LPVOID)addr1, HOOK_LEN);
      // 填充跳转地址
      *(PINT32)(HookCode+2) = (INT32)&MyHOOK32;
      memcpy((LPVOID)addr1, &HookCode, sizeof(HookCode));
}

VOID UnHookAPIQ()
{
      memcpy((LPVOID)addr1, &Ori_Code, sizeof(HookCode));      
}



说明:addr1可以硬编码,我的是用KMP

andydau 发表于 2017-10-19 11:05:06

国际惯例,抢沙发

feiche 发表于 2017-10-19 11:12:20

来个板凳,谢谢表哥分享!

不破不立 发表于 2017-10-19 11:27:31

这个一定要支持,跟着Q婶学技术

wgz001 发表于 2017-10-19 12:40:07

感谢Q神
期待KMP

Superhero 发表于 2017-10-19 16:19:49

虽然我并看不懂,但是也觉得很牛逼。

MAYL8822 发表于 2017-10-19 17:05:37

感谢分享

cxqdly 发表于 2017-10-19 17:50:48

KMP layer路过{:lol:}

170077000 发表于 2017-10-19 19:43:32

有易语的吗

qinccckencn 发表于 2017-10-19 20:15:47

高大上谢谢q婶学习了
页: [1] 2
查看完整版本: 自由地址 HOOK 二则 for X86