CreateFileA в Windows API в NASM 64 вновь: неверный параметр - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю файл в NASM 64, используя CreateFileA в Windows API. Вчера я опубликовал вопрос по этому вопросу, который принес несколько полезных комментариев. Сегодня я написал этот раздел на C и скомпилировал его с помощью компилятора Pelles C, и получил разборку из x64dbg, чтобы я мог использовать вывод в NASM. Я поместил код разборки в свой проект NASM, и вот программа в NASM, какая она есть сейчас:

CreateAuditFile:
sub rsp,38
xor eax,eax
mov qword [rsp+30],rax
mov eax,80
mov dword [rsp+28],eax
mov eax,2
mov dword [rsp+20],eax
xor r9,r9
xor r8d,r8d
mov edx,40000000
mov rcx,FileName_1
;lea rcx,[rel FileName_1]
call CreateFileA
call GetLastError
mov rdi,FileAuditString ; not from the disassembly
mov [rdi],rax ; not from the disassembly
xor eax,eax
add rsp,38
ret

Это разборка этого кода C (выполняется как консольное приложение):

int main(void)
{
    char* File_Name ="C:\\Audit_File_P1";
    HANDLE hFile;

    hFile = CreateFileA(
        File_Name, 
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS, 
        FILE_ATTRIBUTE_NORMAL, 
        NULL);
}

Это работает в C, но в NASM возвращает код ошибки 87, «неверный параметр». Я заметил две вещи: (1) первая строка - это sub rsp, 38, которая является нечетным числом и не выровнена по 16 байтам; (2) для имени файла (FileName_1), разборка показывает "lea rcx, qword ptr ds: [140006270]", но в NASM мы используем "mov rcx, FileName_1" вместо lea, где строка имени файла определена в разделе .data, как здесь (FileName_1: db "c: \ AuditFile_1.txt», 0). Кроме того, он вставляет параметр qword в [rsp + 30] и dword в [rsp + 28], но dword требуется четыре байта, а не два, что кажется неправильным, но это работает в версии C.

Итак, мой вопрос: какой параметр (параметры) неверен?

Большое спасибо.

1 Ответ

0 голосов
/ 05 апреля 2019

Эта проблема была решена с помощью других выше, и я публикую ниже полный правильный код для тех, кому нужна эта информация в будущем:

CreateAuditFile:
mov rcx,FileName_1
sub rsp,56  ; 38h
xor eax,eax
mov qword [rsp+48],rax ; 30h
mov eax,80
mov dword [rsp+40],eax ; 28h
mov eax,2
mov dword [rsp+32],eax ; 20h
xor r9,r9
xor r8d,r8d
mov edx,40000000
call CreateFileA
mov rdi,OutputFileHandle
mov [rdi+r15],rax
xor eax,eax
add rsp,56 ;38h
ret

Вот что изменилось (за изменениями следуют комментарий и ***):

CreateAuditFile:
sub rsp,38 - should be sub rsp,56 ***
xor eax,eax
mov qword [rsp+30],rax - should be mov qword [rsp+48],rax ***
mov eax,80
mov dword [rsp+28],eax - should be mov dword [rsp+40],eax ***
mov eax,2
mov dword [rsp+20],eax - should be mov dword [rsp+32],eax ***
xor r9,r9
xor r8d,r8d
mov edx,40000000
mov rcx,FileName_1
call CreateFileA
call GetLastError - do not call this without testing the result of CreateFileA ***
mov rdi,FileAuditString - not needed ***
mov [rdi],rax - not needed ***
mov rdi,OutputFileHandle - use this to capture the file handle ***
mov [rdi+r15],rax - use this to capture the file handle ***
xor eax,eax
add rsp,38 - should be add rsp,56 ***
ret

Большое спасибо всем, кто откликнулся.

...