обычная функция ExitProcess
(windows api) и должна вызываться с общим соглашением о вызовах для x64.в частности, стек должен быть с 16-байтовым выравниванием , поэтому вызывайте ExitProcess
, как и любой другой API.инструкция add rsp, 48h
перед call ExitProcess
неверна
также некоторые общие примечания: импортированный API всегда вызывается косвенно - если вы хотите вызвать SomeApi
- объявить переменную (код для x64)
extern __imp_SomeApi : QWORD
и вызовите
call __imp_SomeApi
, если мы объявим
extern SomeApi : proc
и сделаем
call SomeApi
компоновщик создания заглушки
SomeApi:
jmp qword ptr __imp_SomeApi
так лучше прямое использование __imp_SomeApi
формы.
также всегда намного лучше использовать W вместо A 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