Nasm kernel32.dll DeleteFile

时间:2014-03-10 00:29:40

标签: assembly nasm kernel32

好吧,我尝试使用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

它只是打印无法删除文件,然后退出。这段代码有错误吗?

1 个答案:

答案 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

输出:

enter image description here