在 Windows 上使用 MASM 在 x64 程序集中写入文件的问题

问题描述 投票:0回答:1

我尝试在 Windows 上使用 x64 程序集和 MASM 写入文件,但内容未正确写入。我在下面包含了我的代码,但我不确定问题出在哪里。我正在使用 CreateFileA 和 WriteFile 函数。有人可以帮我找出并解决问题吗?

汇编器:MASM 架构:x64 平台:Windows

代码片段:

INCLUDELIB kernel32.lib
ExitProcess PROTO
CreateFileA PROTO
WriteFile PROTO

clearRegisters MACRO
    XOR RAX, RAX
    XOR RDX, RDX
    XOR RCX, RCX
    XOR R8, R8
    XOR R9, R9
ENDM

GENERIC_WRITE    EQU 04000000h
FILE_SHARE_READ  EQU 1
FILE_SHARE_WRITE EQU 2
OPEN_ALWAYS      EQU 4
FILE_ATTRIBUTE_NORMAL EQU 128

.DATA
    filePath BYTE "D:/thanks/ASSEMBLY.txt", 0
    fileHandle QWORD ?
    txt BYTE "Learning Assembly for shellcode development.", 0
    num DWORD ?

.CODE
main PROC
    clearRegisters
    SUB RSP, 64
    
    LEA RCX, filePath
    MOV RDX, GENERIC_WRITE
    MOV R8, FILE_SHARE_READ OR FILE_SHARE_WRITE
    MOV R9, 0

    MOV QWORD PTR [RSP+32], OPEN_ALWAYS
    MOV QWORD PTR [RSP+40], FILE_ATTRIBUTE_NORMAL
    MOV QWORD PTR [RSP+48], 0

    CALL CreateFileA
    MOV fileHandle, RAX

    clearRegisters
    MOV RCX, fileHandle
    LEA RDX, txt
    MOV R8, LENGTHOF txt
    LEA R9, num
    MOV QWORD   PTR [   RSP+32  ],  0



    CALL WriteFile
    TEST RAX, RAX


    CALL ExitProcess
main ENDP

END

我已经正确实现了CreateFileA和Writefile的参数,但是在wirtefile调用之后,rax内容为零(0),这表明它失败了。

assembly x86-64 masm writefile createfile
1个回答
0
投票

这适用于我的电脑。

我添加了

CreateDirectoryA

GENERIC_WRITE
在您的代码中是
04000000h
,应该是
40000000h

https://learn.microsoft.com/en-us/windows/win32/secauthz/generic-access-rights

includelib "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\msvcmrt.lib"
includelib "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x64\kernel32.lib"
includelib "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\vcruntime.lib"
includelib "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\ucrt\x64\ucrt.lib"
    
ExitProcess PROTO
CreateFileA PROTO
CreateDirectoryA PROTO
WriteFile PROTO

clearRegisters MACRO
    XOR RAX, RAX
    XOR RDX, RDX
    XOR RCX, RCX
    XOR R8, R8
    XOR R9, R9
ENDM

GENERIC_WRITE    EQU 40000000h
FILE_SHARE_READ  EQU 1
FILE_SHARE_WRITE EQU 2
OPEN_ALWAYS      EQU 4
FILE_ATTRIBUTE_NORMAL EQU 128

.DATA
    pathName byte "D:\thanks",0
    fileName byte "D:\thanks\ASSEMBLY.txt", 0
    fileHandle QWORD ?
    txt BYTE "Learning Assembly for shellcode development.", 0
    num DWORD ?

.CODE
main PROC
    sub RSP, 56
    
    clearRegisters
    
;----------------------------------------------------------------------
; Create Directory
    
    LEA RCX,pathName
    MOV RDX,0
    
    CALL CreateDirectoryA
;----------------------------------------------------------------------
; Create File   
    
    LEA RCX, fileName
    MOV RDX, GENERIC_WRITE
    MOV R8, FILE_SHARE_READ OR FILE_SHARE_WRITE
    MOV R9, 0

    MOV QWORD PTR [RSP+32], OPEN_ALWAYS
    MOV QWORD PTR [RSP+40], FILE_ATTRIBUTE_NORMAL
    MOV QWORD PTR [RSP+48], 0

    CALL CreateFileA
    MOV fileHandle, RAX

    clearRegisters
    
;----------------------------------------------------------------------
; Write to the File     

    MOV RCX, fileHandle
    LEA RDX, txt
    MOV R8, LENGTHOF txt
    LEA R9, num
    MOV QWORD PTR [RSP+32],  0

    CALL WriteFile
    TEST RAX, RAX

    CALL ExitProcess
main ENDP

END```
© www.soinside.com 2019 - 2024. All rights reserved.