【发布时间】:2014-10-22 22:22:48
【问题描述】:
大家好,
我是 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] -> %s\n", playername, msg);
//then calling func entry
CALL((DWORD)0x00444040);
}
当 0048C1CE 被调用时,我将它放入我的 c++ 并将它的参数移动到 Global() 直到这里一切正常,但在 Global() 内部,我无法成功将参数回调到 x00444040,即使它在控制台窗口中显示一个奇怪的值,有时还会显示一部分播放器消息。
附:如果可能的话,可以解释装配线的情况。
对不起我的英语,提前谢谢。
【问题讨论】:
标签: c++ visual-c++ assembly reverse-engineering