伊始
各位小伙伴们好呀!不知道小伙伴们在遇到过,原需求我不想动,但我扩展新功能,但你不能影响以前的功能,构架不能动,总之我只要扩展,能不动的就别动。那这可怎么办呢,哎!
为了解决这个需求,我要思考下。umm,分为两种。
序号 | 需求 |
---|---|
1 | 在业务中间加统计、校验 |
2 | 在弃用的接口做新的东西 |
这两种都可以看作为,函数执行顺序要变化。
这里我们就可以用到API HOOK技术了,此技术在于修改IAT(导入地址表),然后先执行我们扩展的的业务,至于是否要继续在走接下来的业务就看实际需求了。
主体
不墨迹了,直接干货!
需要用到的API如下:
序号 | API&其他 |
---|---|
1 | GetCurrentProcess() |
2 | LoadLibrary() |
3 | VirtualProtectEx |
4 | WriteProcessMemory |
5 | _asm(嵌入汇编) |
这次,我们打算以最简单的方式来扩展接口,我先就以”User32.dll“,因为大多数程序都会加载它。如果你想hook自己的dll,那么就请换成自己的。
第一步:获取当前“空间”
获取当前进程
HANDLE WINAPI GetCurrentProcess(
VOID
);
第二步:获取User32.dll加载的地址
HMODULE WINAPI LoadLibraryW(
_In_ LPCWSTR lpLibFileName
);
第三步:获取MessageBox的地址
FARPROC WINAPI GetProcAddress(
_In_ HMODULE hModule,
_In_ LPCSTR lpProcName
);
第四步:就要修改入口地址了`,如果还需要保留原来的业务,请先备份一下地址
_asm
{
lea edi, oldAddr // 保存旧地址
mov esi, oldMSGBox // 获取到旧地址
cld
movsd
movsb
}
Code[0] = 0xe9; //这个汇编的jmp跳转指令,相对跳转
_asm
{
lea eax, MyMSGBox
mov ebx, oldMSGBox
sub eax, ebx
sub eax, LEN
mov dword ptr[Code + 1], eax
}
第五步:将修改好的地址,放到IAT(导入地址表)中。
开辟空间
BOOL WINAPI VirtualProtectEx(
_In_ HANDLE hProcess,
_In_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flNewProtect,
_Out_ PDWORD lpflOldProtect
);
写入
BOOL WINAPI WriteProcessMemory(
_In_ HANDLE hProcess,
_In_ LPVOID lpBaseAddress,
_In_reads_bytes_(nSize) LPCVOID lpBuffer,
_In_ SIZE_T nSize,
_Out_opt_ SIZE_T * lpNumberOfBytesWritten
);
至此完毕,调用函数即可执行我们的新业务代码。
注:如果需要取消API Hook,请恢复原入口即可。
扫描二维码关注公众号,回复:
10652821 查看本文章
`