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>
在调试器级别,只需确保每个寄存器(包括堆栈指针)与入门时一样,就在您转到hooked函数之前。除了道德和合法性之外,我只想关注您问题的技术方面-但我确实认为您应该认真思考david.pfx提出的要点 写了一些与您描述的类似的项目后,仅出于个人知识,我推荐一个通用挂钩库。我使用源引擎(来自《半条命2》fame),并使用了一个名为的库。SourceHook是AlliedModder的metamod项目的一部分,该项目在SourceMod内部使用 当我尝试在源引擎项目之外编写通用钩子时,我发现SourceHook仍然有用,但也探索了其他选项。我很高兴使用另一个通用钩子库
<> P>重要的是,知道你正在钩住的方法的调用约定,正确地恢复你的钩子的安全性是至关重要的。<你好,谢谢你的回答,关于你的问题,它是一个游戏服务器文件,它在几年前泄露了,现在在论坛上公开了,关于我的C++项目,我不能分享一个完整的COD。e由于我没有权限共享它,但我确信它与您的第1点和第3点配合得很好。我在第2点失败了,您能否举例说明如何保存所有寄存器而不影响它们并在事后恢复它们?只需在堆栈上推送一些寄存器,然后按相反顺序弹出它们。使用调试器检查which寄存器会更改,因此需要保存哪些。