Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;?_C++_Visual C++_Assembly_Reverse Engineering - Fatal编程技术网

C++ c++;?

C++ c++;?,c++,visual-c++,assembly,reverse-engineering,C++,Visual C++,Assembly,Reverse Engineering,大家好, 我是一个C++新手,但我已经成功地创建了自己的DLL,并将它注入到我的GAMESEVER。 我已经尝试了好几天去钩住一个用户调用函数,但我总是失败,因为它属于汇编:( 我想让你们告诉我如何编写一个合适的行来钩住这个函数: 0048C1AF |. 8B9B 4C010000 MOV EBX,DWORD PTR DS:[EBX+14C] 0048C1B5 |. 8B13 MOV EDX,DWORD PTR DS:[EBX] 0048C1B7 |. 8B82 EC

大家好,
我是一个C++新手,但我已经成功地创建了自己的DLL,并将它注入到我的GAMESEVER。 我已经尝试了好几天去钩住一个用户调用函数,但我总是失败,因为它属于汇编:(
我想让你们告诉我如何编写一个合适的行来钩住这个函数:

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] -> %s\n", playername, msg);

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

当调用了9000C1CE时,我将其放入我的C++中,并将其参数移到全局()中。 在此之前,一切正常,但在Global()中,我无法将参数成功回调到x00444040中,即使它在控制台窗口中显示一个奇怪的值,有时还会显示播放器消息的一部分

如果可能的话,请给我一个关于装配线如何运作的解释


对不起,我说的是英语,提前谢谢。

关于你为什么要这样做的问题,我不提了。可能是其他人的软件,他们可能没有给你许可。你可能在某个地方违反了许可证

您的描述非常复杂。汇编程序的行不是一个函数,它们是包含3个函数调用的代码。我猜您的意思是要拦截对函数0x00444040的调用,以便执行您自己的代码。您还没有演示如何执行

< C++代码需要做大约三件事。< /P>
  • 在输入时,它必须符合调用者期望的调用序列。似乎有两个参数,在ESI和EDI中
  • 如果您想调用C++库函数,则必须保存可能通过调用这些调用而恢复的所有寄存器,并在以后恢复它们。
  • 退出时,应该准确地恢复堆栈和寄存器在进入时的状态,并将其分支(JMP not CALL)到挂钩函数,以便它可以返回到原始调用方,而不是挂钩代码

  • 在调试器级别,只需确保每个寄存器(包括堆栈指针)与入门时一样,就在您转到hooked函数之前。

    除了道德和合法性之外,我只想关注您问题的技术方面-但我确实认为您应该认真思考david.pfx提出的要点

    写了一些与您描述的类似的项目后,仅出于个人知识,我推荐一个通用挂钩库。我使用源引擎(来自《半条命2》fame),并使用了一个名为的库。SourceHook是AlliedModder的metamod项目的一部分,该项目在SourceMod内部使用

    当我尝试在源引擎项目之外编写通用钩子时,我发现SourceHook仍然有用,但也探索了其他选项。我很高兴使用另一个通用钩子库


    <> P>重要的是,知道你正在钩住的方法的调用约定,正确地恢复你的钩子的安全性是至关重要的。<你好,谢谢你的回答,关于你的问题,它是一个游戏服务器文件,它在几年前泄露了,现在在论坛上公开了,关于我的C++项目,我不能分享一个完整的COD。e由于我没有权限共享它,但我确信它与您的第1点和第3点配合得很好。我在第2点失败了,您能否举例说明如何保存所有寄存器而不影响它们并在事后恢复它们?只需在堆栈上推送一些寄存器,然后按相反顺序弹出它们。使用调试器检查which寄存器会更改,因此需要保存哪些。