什么样的问题取决于什么样的解决方式,如果考虑X64点话,用库会比较方便点,这种纯X32小玩意直接不解释连招
下面的代码,有一点点仿Detours的味道,之前的帖子也分析过,不多解释,这次算补充
另外有一个点没有考虑,线程安全,这个的话,用原子操作即可,非常简单
后续看情况补充这些不足之处,最近确实有点没时间搞这些小东西
另外其实也可以加个回调函数,看你自己
获取到值以后就触发回调,这些都是很简单东西
这里提一下只是避免有人不知道而已
以前这玩意卖E模块,还卖挺贵的 自己实现以后发现也就那么回事儿
不懂的同学可以回帖问,对代码不理解的话,我觉得挺简单的
代码适用于release模式,debug模式无法使用,原因如下
https://www.cnblogs.com/uu102/p/4695026.html
https://www.cnblogs.com/iBinary/p/14148137.html
#include <iostream>
#include<windows.h>
DWORD _CalcLen(DWORD x, DWORD y)
{
return x - y - 5;
}
void* apiaddr = MessageBoxW;
void* jmpaddr = (void*)((int)(apiaddr) + 5);
void* MyESP = nullptr;
BYTE New_Data[5] = { 0xE9 };
void __declspec (naked) TransFun()
{
_asm
{
nop //这里会被覆盖API头部的5个字节,我这里用NOP替代
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
jmp jmpaddr
}
}
void __declspec (naked) MiddleFun()
{
_asm
{
pushad //push以后增加4*8字节
mov eax, [esp + 0x20] //这里的计算也要多增加32,也可以取消pushad 随你自己
mov MyESP, eax
popad
jmp TransFun //恢复函数
}
}
void inhook()
{
*(DWORD*)(New_Data + 1) = _CalcLen((DWORD)MiddleFun, (DWORD)apiaddr);
DWORD prot;
VirtualProtect(MiddleFun, 5, PAGE_EXECUTE_READWRITE, &prot);
memcpy(TransFun, apiaddr, 5);
VirtualProtect(apiaddr, 5, PAGE_EXECUTE_READWRITE, &prot);
memcpy(apiaddr, New_Data, 5);
}
int main()
{
MessageBoxW(NULL, L"我是HOOK前", L"测试", MB_OK);
inhook();
MessageBoxW(NULL, L"HOOK_API后", L"测试", MB_OK);
return 0;
}