乾坤大挪移inline hook inline hook的一般步骤是计算并生成跳转到hook function的指令,将原函数将被覆盖的部分指令copy出来,hook function执行完毕后跳转到copy出来的指令,最后跳转到原函数被copy出来执行的指令之后执行。 乾坤大挪移inline hook是指copy的是整个模块(多为dll)的内存,这样可以减少跳转的次数,难度也就大大降低了,只需hook原函数头部,再在hook function中调用原函数的拷贝即可。 下面简单演示下这个过程: // Copy hDllModule = GetModuleHandle(_T("xxx.dll")); GetModuleInformation(GetCurrentProcess(), hDllModule, &moduleInfo, sizeof(moduleInfo)); pNewBaseOfDll = malloc(moduleInfo.SizeOfImage); memcpy(pNewBaseOfDll, moduleInfo.lpBaseOfDll, moduleInfo.SizeOfImage); // Hook pOrgFunc = GetProcAddress(hDllModule, "func"); VirtualQuery(pOrgFunc, &mbi, sizeof(mbi)); VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &dwOldProtect); memcpy(pOrgFunc, pShellCode, sizeof(ShellCode)); // 省略shell code的计算及恢复保护属性 pNewFunc = pNewBaseOfDll + (pOrgFunc - moduleInfo.lpBaseOfDll); // Hook Function pNewFunc() // 做好Hook工作后调用原函数的拷贝即可