我必須呼叫 WinApi SHFileOperationW 函式,但在此之前我需要填充這個結構
typedef struct _SHFILEOPSTRUCTW {
HWND hwnd;
UINT wFunc;
PCZZWSTR pFrom;
PCZZWSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
PCWSTR lpszProgressTitle;
} SHFILEOPSTRUCTW, *LPSHFILEOPSTRUCTW;
在 MASM 中,我這樣定義:
SHFILEOPSTRUCT struct
hwnd dq ?
wFunc dd ?
pFrom dq ?
pTo dq ?
fFlags dw ?
fAnyOperationsAborted dd ?
hNameMappings dq ?
lpszProgressTitle dq ?
SHFILEOPSTRUCT ends
在 .data 部分我初始化我的結構:
fos SHFILEOPSTRUCT <?>
因此,當我用 mov 操作填充我的結構并在 rcx(1 arg of function) 中加載地址時,它會導致錯誤,但如果我將結構欄位推送到堆疊中并傳遞給函式 RSP,它的作業就很好。為什么這樣?即使是 0,我也需要填寫所有欄位嗎?(無效↓)
mov [fos.hwnd], 0 ; hWnd
mov [fos.wFunc], FO_DELETE ; Delete
mov rax, offset filename
mov [fos.pFrom], rax ; Filename
mov [fos.fFlags], FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT
lea rcx, fos
vs(它的作業↓)
push 0
push 0
push 0
push FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT
push 0
pushaddr filename
push FO_DELETE
push 0
mov rcx, rsp
然后我在堆疊中分配一些空間并呼叫函式:
sub rsp, 28h
call SHFileOperationW
uj5u.com熱心網友回復:
Windows SDK 中的 C/C 標頭假定使用平臺的默認對齊方式。
這由msvc 和ML/ML64中的/Zp(結構成員對齊)選項控制(對齊可以是 1、2、4、8 或 16)
看看align 如何與資料打包一起作業
MSVC 和 ML64 之間的區別:MSVC 使用/Zp16作為x64和ARM64的默認值,但 ML64 不使用。
所以你需要或直接在 ML64 命令列中設定 /Zp16 (最好)或在STRUCT宣告中直接設定對齊:
喜歡SHFILEOPSTRUCTW struct 16
還在 .data 部分宣告變數 - 意味著使用全域變數和錯誤的解決方案。這必須是區域變數,所以在堆疊中。代碼看起來像
.code
SHFILEOPSTRUCTW struct 16
hwnd dq ?
wFunc dd ?
pFrom dq ?
pTo dq ?
fFlags dw ?
fAnyOperationsAborted dd ?
hNameMappings dq ?
lpszProgressTitle dq ?
SHFILEOPSTRUCTW ends
FO_DELETE EQU 03h
FOF_NOCONFIRMATION EQU 10h
FOF_ALLOWUNDO EQU 40h
FOF_SILENT EQU 04h
EXTERN __imp_SHFileOperationW:QWORD
VarSize EQU ((SIZEOF SHFILEOPSTRUCTW 15) and not 15)
fos EQU [rsp 20h]
er_ff proc
sub rsp, 28h VarSize
xor eax,eax
mov fos[SHFILEOPSTRUCTW.hwnd],rax
mov fos[SHFILEOPSTRUCTW.wFunc],FO_DELETE
mov fos[SHFILEOPSTRUCTW.pFrom],rcx
mov fos[SHFILEOPSTRUCTW.pTo],rax
mov fos[SHFILEOPSTRUCTW.fFlags],FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT
lea rcx,fos
call __imp_SHFileOperationW
add rsp, 28h VarSize
ret
er_ff endp
end
所以SHFILEOPSTRUCTW struct 16最好使用ml64 /c /Cp /Zp16 "$(InputFileName)"
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/527222.html
標籤:Intel Collective 部件温纳皮结构x86-64masm
上一篇:使用WinHTTPlib下載shellcode(二進制資料)
下一篇:需要提升權限的檔案
