加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在c中挂钩呼叫功能?

发布时间:2020-12-16 07:09:37 所属栏目:百科 来源:网络整理
导读:大家好, ???????????????我是c的新手,但我已设法创建自己的DLL并将其注入我的gameserver.exe 好吧,我已经尝试了几天挂钩用户调用功能,但我总是失败,因为它属于程序集:( 我希望你们能告诉我如何编写一个合适的行来挂钩这个函数: 0048C1AF |. 8B9B 4C010000 M
大家好,
???????????????我是c的新手,但我已设法创建自己的DLL并将其注入我的gameserver.exe

好吧,我已经尝试了几天挂钩用户调用功能,但我总是失败,因为它属于程序集:(
我希望你们能告诉我如何编写一个合适的行来挂钩这个函数:

0048C1AF  |. 8B9B 4C010000  MOV EBX,DWORD PTR DS:[EBX+14C]
0048C1B5  |. 8B13           MOV EDX,DWORD PTR DS:[EBX]
0048C1B7  |. 8B82 EC000000  MOV EAX,DWORD PTR DS:[EDX+EC]
0048C1BD  |. 8BCB           MOV ECX,EBX
0048C1BF  |. FFD0           CALL EAX
0048C1C1  |. 8BF8           MOV EDI,EAX
0048C1C3  |. E8 789EF8FF    CALL SR_GameS.00444040
0048C1C8  |. 8B7C24 1C      MOV EDI,DWORD PTR SS:[ESP+1C]
0048C1CC  |. 8BF0           MOV ESI,EAX
0048C1CE  |. E8 6D9EF8FF    CALL SR_GameS.00444040

到目前为止我在c上写的是:

void __cdecl Global()
{

    __asm
    {

           mov msg,edi; //msg

           push ebx;
           mov ebx,dword ptr[esp+1C]; //playername
           mov playername,ebx;
           pop ebx;
    }

    printf("Global [%s] -> %sn",playername,msg);

    //then calling func entry
    CALL((DWORD)0x00444040);
}

当0048C1CE被调用时,我将它放入我的c并将其参数移动到Global()
直到这里一切顺利但在Global()内部我无法回调成功进入x00444040的参数,即使它在控制台窗口中显示奇怪的值,有时也会显示玩家消息的一部分.

附:如果有可能解释装配线的情况.

对不起我的英文,提前致谢.

解决方法

我会抛开你为什么要这样做的问题.它可能是其他人的软件,他们可能没有给你许可.您可能在某处违反了许可证.

你的描述很纠结.汇编程序行不是函数,它们是具有3个函数调用的代码.我猜你的意思是你要拦截对函数0x00444040的调用以执行你自己的代码.你还没有表明你是如何做到的.

C代码需要做大约三件事.

>进入时,它必须符合其调用者所期望的调用顺序.在ESI和EDI中似乎有两个参数.
>如果要调用C库函数,则必须保存所有可能受到影响的寄存器,然后再进行恢复.
>当你退出时,你应该恢复堆栈并准确记录它们在进入时的状态,并将分支(JMP而不是CALL)注册到钩子函数,这样它就可以返回到原始调用者,而不是你的挂钩代码.

在调试器级别,只需确保每个寄存器(包括堆栈指针)与进入时相同,就在分支到钩子函数之前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读