Вызов функции ASM в C ++ - PullRequest
       3

Вызов функции ASM в C ++

0 голосов
/ 13 сентября 2011

Попытка вызова функции ASM в C ++ .. обычная функция

Вы можете спросить, что это за функция .. __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 Ответ

4 голосов
/ 13 сентября 2011

во-первых, ваша функция __fastcall (поскольку используется EDX), так что это означает, что вы можете ввести ее в C:

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

, который просто создает фрейм стека, он не имеет реального присутствия нафактическая функция (если вы не знаете, что двоичный файл был скомпилирован без указателей фреймов, в этом случае он показывает использование встроенной сборки в не голой функции)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...