在C ++中调用ASM函数

时间:2011-09-13 06:26:27

标签: c++ assembly

尝试在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
    }
}

真的不知道如何做到总结它。

1 个答案:

答案 0 :(得分:4)

首先,你的函数是__fastcall(使用EDX),这意味着你可以在C中输入def:

typedef void (__fastcall * function_t)(int buffer, int key);
function_t pfTheFunc = (function_t)0x00421520;

然后您应该注意到push edxpush 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

只是创建一个堆栈帧,它在实际函数中没有实际存在(除非你知道二进制文件是在没有帧指针的情况下编译的,在这种情况下它显示了在非裸函数中使用内联汇编)