尝试在C ++中调用ASM函数。常规函数
你可能会问这是什么类型的函数.. __cdecl,__ stdcall或__thiscall
我想我错过了像
这样的东西push ebp
mov ebp, esp
虽然我认为我不需要这个,但有人曾告诉过我,但我忘记了,所以我遇到了同样的问题。我通常会附加调试器并修复它..但我不能在我的情况下程序不允许调试器。
我有这个功能,它是 __ thiscall 功能
00458BDE 90 NOP
00458BDF 90 NOP
00458BE0 /$ 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00458BE4 |. 8B09 MOV ECX,DWORD PTR DS:[ECX]
00458BE6 |. E8 3589FCFF CALL Continuu.00421520
00458BEB \. C2 0400 RETN 4
00458BEE 90 NOP
00458BEF 90 NOP
这是我尝试过的,没有用的
int testFuncAddr = 0x00421520;
__declspec(naked) void Test(int buffer, int key)
{
__asm{
push edx
push ecx
mov edx, key
mov ecx, buffer
call [testFuncAddr]
ret
}
}
真的不知道如何做到总结它。
答案 0 :(得分:4)
首先,你的函数是__fastcall
(使用EDX),这意味着你可以在C中输入def:
typedef void (__fastcall * function_t)(int buffer, int key);
function_t pfTheFunc = (function_t)0x00421520;
然后您应该注意到push edx
和push ecx
是不需要的(它们也是易失性寄存器,因此不需要在调用之间保留,除非您将调用粘贴到代码中以前不是)。如果他们在哪里保存,他们需要一组匹配的pop
s
__declspec(naked) void Test(int buffer, int key)
{
__asm{
push edx
push ecx
mov edx, key
mov ecx, buffer
call [testFuncAddr]
pop ecx
pop edx
ret
}
}
也:
push ebp
mov ebp, esp
只是创建一个堆栈帧,它在实际函数中没有实际存在(除非你知道二进制文件是在没有帧指针的情况下编译的,在这种情况下它显示了在非裸函数中使用内联汇编)