该 ExitProcess 通常的函数(windows api),必须使用x64的公共调用约定进行调用。特别是堆栈必须 保持16字节对齐 所以打电话 ExitProcess 像任何其他api一样。该 add rsp, 48h 以前的指导 call ExitProcess 是错的
ExitProcess
add rsp, 48h
call ExitProcess
还有一些一般性说明: 导入的api总是称为间接 - 如果你想要通话 SomeApi - 声明变量(x64的代码)
SomeApi
extern __imp_SomeApi : QWORD
并打电话
call __imp_SomeApi
如果我们宣布
extern SomeApi : proc
并做
call SomeApi
链接器创建存根
SomeApi: jmp qword ptr __imp_SomeApi
所以更好的直接使用 __imp_SomeApi 形成。
__imp_SomeApi
也总是好多用 w ^ 代替 一个 api形式。所以所有代码都可以看起来像
FILE_FLAG_DELETE_ON_CLOSE = 04000000h CREATE_ALWAYS = 2 FILE_SHARE_READ = 1 GENERIC_READ = 080000000h INVALID_HANDLE_VALUE = -1 extern __imp_ExitProcess : QWORD extern __imp_CreateFileW : QWORD extern __imp_CloseHandle : QWORD WSTRING macro text FORC arg, text DW '&arg' ENDM DW 0 endm .const ALIGN 2 filePath: WSTRING <C:\Temp\test123.txt> .code Main proc sub rsp, 48h mov qword ptr [rsp + 30h], 0 mov qword ptr [rsp + 28h], FILE_FLAG_DELETE_ON_CLOSE mov qword ptr [rsp + 20h], CREATE_ALWAYS xor r9, r9 mov r8, FILE_SHARE_READ mov rdx, GENERIC_READ lea rcx, filePath call __imp_CreateFileW cmp rax, INVALID_HANDLE_VALUE je @@0 mov rcx, rax call __imp_CloseHandle @@0: xor ecx, ecx call __imp_ExitProcess add rsp, 48h ret Main endp end