簡體   English   中英

從C ++調用匯編函數

[英]Call assembly function from C++

在該函數的上方和下方添加了一些程序集,以使圖像更清晰

00427F38   . 50             PUSH EAX
00427F39   . 8975 08        MOV DWORD PTR SS:[EBP+8],ESI
00427F3C   . E8 0FFE0200    CALL Test.00457D50
00427F41   . 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
00427F44   . 51             PUSH ECX                                 ; /Arg1
00427F45   . 8D4D E8        LEA ECX,DWORD PTR SS:[EBP-18]            ; |
00427F48   . E8 13FE0200    CALL Test.00457D60                       ; \Test.00457D60
00427F4D   . 8B55 08        MOV EDX,DWORD PTR SS:[EBP+8]
00427F50   . 8D4D E8        LEA ECX,DWORD PTR SS:[EBP-18]
00427F53   . 52             PUSH EDX

IDA Pro生成了此函數聲明

void *__userpurge sub_457D60<eax>(void **a1<ecx>, int a2<ebx>, int a3)

這是我嘗試過的方法,不起作用。

int callAddress = (*This is calculated by me 100% correct*)

//void *__userpurge sub_457D60<eax>(void **a1<ecx>, int a2<ebx>, int a3)
__declspec(naked) void stepOneWrapped(int a1, char* a2, int a3)
{
    __asm{
        push ebp
        mov ebp, esp
        push a3
        mov ebx, [a2]
        mov ecx, a1
        call [callAddress]
        leave
        ret
    }
}

特別說明:這就像dll注入一樣,因此Test程序將與此程序一起加載。

您需要保留ebx,作為其非易失性寄存器:

__declspec(naked) void stepOneWrapped(int a1, char* a2, int a3)
{
    __asm{
        push ebp
        mov ebp, esp
        push ebx
        push a3
        mov ebx, [a2]
        mov ecx, a1
        call [callAddress]
        pop ebx
        leave
        ret
    }
}

但是根據您的IDA轉儲,您的參數是錯誤的,因此應該是這樣的(以匹配IDA):

__declspec(naked) void stepOneWrapped(void** a1, int a2, int a3)
{
    __asm{
        push ebp
        mov ebp, esp
        push ebx
        push a3
        mov ebx, a2
        mov ecx, a1
        call [callAddress]
        pop ebx
        leave
        ret
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM