从 C++ 调用汇编函数

发布于 2024-12-03 18:41:08 字数 1263 浏览 0 评论 0原文

在函数的顶部和下面添加了更多的程序集以获得更清晰的图像

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 注入,因此测试程序会与该程序一起加载。

Added a bit more assembly on top of the function and below it to get a clearer image

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 produced this function declaration

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

Here is what I tried, doesn't work.

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
    }
}

Special note: this is like a dll injection so the Test program is loaded with this program altogether.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

把人绕傻吧 2024-12-10 18:41:08

你需要保留 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
    }
}

you need to preserve ebx, as its a non-volatile register:

__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
    }
}

but according to you IDA dump, your params are wrong, so it should be like this (to match 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
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文