好吧,我尝试使用kernel32.dll中的DeleteFile方法(使用nasm汇编程序),但它不会删除该文件,并且会以错误退出。
extern _GetStdHandle@4
extern _WriteConsoleA@20
extern _DeleteFileA@4
extern _ExitProcess@4
section .data
msg: db "Could not delete the file", 10, 0
len: equ $- msg
section .bss
numCharsWritten resb 1
section .text
global _start
_start:
mov edx, [esp+8]
push dword [edx] ; pushes argument.
call _DeleteFileA@4 ; deletes file
add esp, 8 ; removes 2 arguments
cmp eax, 0 ; <cmp> = (eax == 0)
je _error ; if(<cmp>) jump to _error
push dword 0x0A ; exit value
call _ExitProcess@4 ; exit
_error:
push dword -0x0B
call _GetStdHandle@4
push dword 0 ; Arg4, unused
push numCharsWritten ; Arg3, POINTER to numCharsWritten
push dword len ; Arg2, length of the string
push msg ; Arg1, the string
push eax ; Arg0, _GetStdHandle@4
call _WriteConsoleA@20 ; Writes the string
push dword 0x0A ; exit code
call _ExitProcess@4 ; exit
它只是打印无法删除文件,然后退出。这段代码有错误吗?
答案 0 :(得分:1)
除非您链接到C库(使用gcc或类似的东西),否则Windows程序没有argc或argv,因此尝试使用esp访问params将无效。相反,您需要使用GetCommandLineW
,它将返回指向当前进程的命令行字符串的指针。要将其转换为argc和argv,请使用CommandLineToArgvW
。是的,Unicode版本。这是一个例子,我使用printf
使显示更容易一些。
%define STD_OUTPUT_HANDLE -11
; Shell32.dll
extern CommandLineToArgvW
; Kernel32.dll
extern ExitProcess, WriteConsoleW, LocalFree
extern GetStdHandle, GetCommandLineW
%define GetCommandLine GetCommandLineW
; msvcrt.dll
extern _printf
section .bss
stdout resd 1
szArglist resd 1
nArgs resd 1
section .data
fmtst db "%ws", 13, 10, 0
section .text
global _start
_start:
push STD_OUTPUT_HANDLE
call GetStdHandle
mov dword [stdout], eax
call GetCommandLine
push nArgs
push eax
call CommandLineToArgvW
mov dword [szArglist], eax
mov esi, eax
xor ebx, ebx
sub dword [nArgs], 1
.DisplayArgs:
push dword [esi + 4 * ebx]
push fmtst
call _printf
add esp, 4 * 2
inc ebx
cmp ebx, dword [nArgs]
jle .DisplayArgs
push dword [szArglist]
call LocalFree
push 0
call ExitProcess
输出: