卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章1829本站已运行4109

C&C++ HOOK_API获取对应的寄存器值

成熟的Detours固然好用,但是太繁琐了,像这种比较精细化的操作,直接裸hook可以解决

什么样的问题取决于什么样的解决方式,如果考虑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;
}
 
卓越飞翔博客
上一篇: 易语言 Q和V文字自动转换图片
下一篇: Python 某轻小说下载器
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏