通过中间函数调用WriteConsole无法正常工作

Calling WriteConsole through an intermediate function does not work properly

本文关键字:常工作 工作 中间 函数调用 WriteConsole      更新时间:2023-10-16

我正在尝试学习assembly,所以我手动将CC++代码转换为assembly代码。

环境

  • x86

  • Visual Studio

目标

手动将以下C代码转换为assembly代码:

static HANDLE OUTPUT_HANDLE;
BOOL __stdcall InputConsole(const VOID *lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten)
{
    WriteConsoleA(OUTPUT_HANDLE, lpBuffer, nNumberOfCharsToWrite, lpNumberOfCharsWritten, 0);
}
int main()
{
    DWORD charsWritten;
    OUTPUT_HANDLE = GetStdHandle(STD_OUTPUT_HANDLE);

    InputConsole("Hello World!n", 13, &charsWritten);
}

尝试

.586
.model flat, stdcall
.stack 4096
EXTRN   ExitProcess@4       :   PROC
EXTRN   GetStdHandle@4      :   PROC
EXTRN   WriteConsoleA@20    :   PROC
.data
    STD_OUTPUT_HANDLE       DD  ?
    WRITE_CONSOLE_STRING    DB  "Hello World!", 10, 0
    CHARS_WRITTEN           DD  ?
.code
WriteConsole PROC   
    PUSH    0                   ; lpReserved
    MOV     EAX, [ESP + 16]     ; lpNumberOfCharsWritten
    PUSH    EAX
    MOV     EAX, [ESP + 16]     ; nNumberOfCharsToWrite
    PUSH    EAX
    MOV     EAX, [ESP + 16]     ; lpBuffer
    PUSH    EAX
    PUSH    STD_OUTPUT_HANDLE   ; hConsoleOutput
    CALL    WriteConsoleA@20
    ADD     ESP, 12             ; Restore stack
    RET
WriteConsole ENDP
main: NOP
    PUSH    -11
    CALL    GetStdHandle@4;
    MOV     STD_OUTPUT_HANDLE, EAX
    LEA     EAX, CHARS_WRITTEN
    PUSH    EAX
    PUSH    13
    LEA     EAX, WRITE_CONSOLE_STRING
    PUSH    EAX
    CALL    WriteConsole
    PUSH    0
    CALL    ExitProcess@4
END main

问题

到目前为止,它确实打印了实际的行,但是在ADD ESP, 12处抛出了Access Violation Exception。经过调试器的仔细检查,我似乎应该将16而不是12添加到ESP中以恢复堆栈。仍然在使其成为16之后,它在应用程序从procedure返回之后冻结该应用程序。

问题

  • 为什么我需要添加16而不是12,而我只在堆栈上推送三个4字节的参数
  • 使用ESP + xx访问"输入参数"是否正确
  • 为什么我的程序会冻结,即使我正在恢复堆栈,而且控制台上确实写了一些东西
  • 有没有其他方法可以在assembly中"通过引用传递参数",而不是使用全局.data地址

旁注

我知道你可以在Visual Studio(我正在使用的IDE)中为过程设置参数,但根据我的操作方式,这应该是可能的,对吧?

您没有';Don’不要用add esp那样做,你用ret 12那样做。–nbsp;Jester