飞扬的Blog
主页
登录
c++ x64汇编
"date"
:
"2023-06-05 03:41:29"
"classfiy"
:
"c++"
"author"
:
"飞扬"
"viewTimes"
:
349
返回
>x64使用`masm`来实现汇编 ##简单介绍 ####asm声明变量: asm文件`.DATA`中 >文本:`_str DB "Teemo1" , 0` 数值:`_num DQ 123456h` ####操作c++中的变量和方法 c++: ```c++ extern "C" DWORD64 __g_player; extern "C" void __g_function1(); DWORD64 __g_player = 0; void __g_function1(){ //code... } ``` asm文件: ``` .DATA .CODE EXTERN __g_player : DQ EXTERN __g_function1 : PROC asm_test PROC mov rdx,[__g_player] call __g_function1 asm_test ENDP END ``` ##拿对比字符串举例: 新建一个`x64.asm`文件,右键此文件 属性>项类型 选择`Microsoft Macro Assembler` ``` .DATA _str1 DB "Teemo1" , 0 _str2 DB "Teemo" , 0 .CODE EXTERN _strcmpi : PROC asm_strcmpi PROC sub rsp,18h lea rdx,_str1 lea rcx,_str2 call _strcmpi add rsp,18h ret asm_strcmpi ENDP END ``` c++调用`asm_strcmpi`方法 ```c++ extern "C" int asm_func(); auto re = asm_func(); printf("cmp result: %d",re); ``` ##模仿 `__declspec(naked)` 方法 >x64调用约定为`__fastcall`,平栈方式为:`由调用者平栈`,所以在`do someting`中做复杂操作的时候可能会导致栈内数据更改导致进程崩溃。这时候需要模拟对局部变量开辟内存空间先开辟一段内存空间再做操作,操作完了再释放开辟的内存空间。 ```html ;由于x64没有 pushad popad,手动保存寄存器 pushfq push rax push rbx push rcx push rdx push rsi push rdi push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 push rbp sub rsp,100h ;do something sub rsp,100h pop rbp pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop r9 pop r8 pop rdi pop rsi pop rdx pop rcx pop rbx pop rax popfq ;back ```