从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注入,所以测试程序被加载到这个程序。
您需要保留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
}
}
相关文章:
- 为什么 memcpy() 和其他类似的函数使用汇编?
- 英特尔汇编与内部函数,AVX
- 混合 c++ 和汇编不能将多个参数从C++函数传递到程序集
- 汇编错误:调用基本型构造函数时无效的转换
- C 汇编错误:无匹配的构造函数以进行初始化
- 如何在 x86 汇编中调用函数并将参数传递给它
- 在 GDB - C++ 中反汇编重载成员函数
- 内联函数如何编译为汇编?
- C 成员函数的汇编定义在班级主体之外
- 指示汇编时间叫什么构造函数
- 传递variadic arg to模板函数时的汇编误差
- 汇编错误C 在标题文件中添加函数时
- .cpp中.o文件的调用函数的汇编问题
- C 汇编错误:对构造函数的引用是模棱两可的
- 汇编函数调用是否会导致所有寄存器被推送到堆栈中
- assert()函数未在反汇编中显示
- 调用传递给 gcc 内联汇编器 (avr-gcc) 的 const 函数地址
- 为什么vsc++2010编译器会为类似的函数生成不同的汇编代码
- 如何通过反汇编从C++函数获取"lea"指令?
- 我的函数及其参数在反汇编视觉 c++ 中的名称