我尝试在 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),这表明它失败了。
这适用于我的电脑。
我添加了
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```