CreateProcessA函数在MASM64(ml64.exe)中不起作用中不、函数、CreateProcessA、exe

由网友(在湖边捞月亮)分享简介:我想编写启动另一个程序(进程)的程序。我使用的是来自Visual Studio 2015的MASM64(ml64.exe)。程序不工作。没有显示任何内容。在调试器中,我遇到访问冲突。我不知道我的代码出了什么问题。我的代码:extrn ExitProcess : procextrn MessageBoxA : proc...

我想编写启动另一个程序(进程)的程序。我使用的是来自Visual Studio 2015的MASM64(ml64.exe)。

程序不工作。没有显示任何内容。在调试器中,我遇到访问冲突。

恶意代码分析实战 实验练习

我不知道我的代码出了什么问题。

我的代码:

extrn ExitProcess : proc
extrn MessageBoxA : proc
extrn CreateProcessA : proc

PROCESS_INFORMATION    struct 
hProcess    DWORD    ?
hThread    DWORD    ?
dwProcessId    DWORD    ?
dwThreadId    DWORD    ?
PROCESS_INFORMATION    ends

STARTUPINFOA    struct 
cb    DWORD    ?
lpReserved    DWORD    ?
lpDesktop    DWORD    ?
lpTitle    DWORD    ?
dwX    DWORD    ?
dwY    DWORD    ?
dwXSize    DWORD    ?
dwYSize    DWORD    ?
dwXCountChars    DWORD    ?
dwYCountChars    DWORD    ?
dwFillAttribute    DWORD    ?
dwFlags    DWORD    ?
wShowWindow    WORD    ?
cbReserved2    WORD    ?
lpReserved2    DWORD    ?
hStdInput    DWORD    ?
hStdOutput    DWORD    ?
hStdError    DWORD    ?
STARTUPINFOA    ends

.const
MB_ICONINFORMATION equ 40h
ERROR_ALREADY_EXISTS equ 0B7h
NORMAL_PRIORITY_CLASS equ 020h

.data
szText db "This is first application which creates new process using CreateProcessA.", 00h
szCaption db "Information",00h
processInfo PROCESS_INFORMATION <>
startupInfo STARTUPINFOA <>
szProcName db "D:AppsSampleApp.exe", 00h

.code
    Main proc
        ;not sure if correct - begin
        lea rax, processInfo
        lea rbx, startupInfo


        sub rsp, 60h 
        push rax
        push rbx
        push 00h
        push 00h
        push NORMAL_PRIORITY_CLASS
        push 00h
        mov r9, 00h
        mov r8, 00h
        mov rdx, 00h
        lea rcx, szProcName
        call CreateProcessA
        add rsp, 60h 
        ;not sure if correct - end

        sub rsp, 28h
        mov r9, MB_ICONINFORMATION
        lea r8, szCaption
        lea rdx, szText
        xor rcx, rcx
        call MessageBoxA
        add rsp, 28h

        Exit:
        xor rcx, rcx
        call ExitProcess
    Main endp
end

Build.bat

@echo off

ml64.exe prog1.asm /link /entry:Main /subsystem:windows /defaultlib:"kernel32.Lib" /defaultlib:"user32.Lib"

pause

提前感谢您的帮助。

推荐答案

除了初始化STARTUPINFO并确保使用正确的数据类型(指针在64位Windows中为64位宽,而DWORD始终为32位)外,还需要正确分配参数区域(有时也称为"阴影空间"):

参数区域始终位于堆栈的底部(即使使用alloca),因此在任何函数调用期间它都将始终与返回地址相邻。 它至少包含四个条目,但始终有足够的空间来存放可能被调用的任何函数所需的所有参数。 请注意,始终为寄存器参数分配空间,即使参数本身从未驻留到堆栈;被调用方保证已为其所有参数分配了空间。

我的重点,来自here

假设正确初始化所需的所有数据结构,则可能调用CreateProcessA

; Stack is assumed aligned here

push rax                     ; Not aligned (08h)
push rbx                     ; Aligned     (10h)
push 00h                     ; Not aligned (18h)                    
push 00h                     ; Aligned     (20h)
push NORMAL_PRIORITY_CLASS   ; Not aligned (28h)
push 00h                     ; Aligned     (30h)

; Make room for the first four (register) parameters
; Stack is aligned, not need to subtract 28h, just 20h (4*8)

sub rsp, 20h

mov r9, 00h                  
mov r8, 00h
mov rdx, 00h
lea rcx, szProcName
call CreateProcessA

add rsp, 50h
请注意,调用方负责在调用后清理堆栈。

您使用sub rsp, ...在堆栈上保留空间的想法并非完全错误。 当然,您必须正确计算,但最重要的是,该技术不能立即与ES兼容。

设置参数需要sub rsp, ...类型的一个或多个间接存储。 pushES只会再次移动堆栈指针,使以前的所有工作毫无用处。

阅读全文

相关推荐

最新文章