gpt4 book ai didi

winapi - 汇编器 : Getting Win32's WinMain on-stack parameters

转载 作者:行者123 更新时间:2023-12-05 00:38:12 24 4
gpt4 key购买 nike

我需要访问 WinMain参数使用汇编,但我似乎无法这样做,尽管我应该知道它们在堆栈中的位置(DWORD 偏移 0 到 16,以及在操作之前推送 EBP 时为 0 到 20)。下面是显示 lpszCmdline 的示例包含程序命令行的字符串,但它似乎总是包含 0,因此没有显示任何内容。如果我尝试在汇编代码中使用其他参数,则似乎不存在有效的字符串指针和/或程序崩溃,如预期的那样。

;[esp+20]==nCmdShow
;[esp+16]==lpszCmdLine
;[esp+12]==0 in win32
;[esp+8]==hInst
;[esp+4]==EIP
;[esp+0]==EBP

push ebp
mov ebp,esp
mov eax,[ebp+16]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]
pop ebp

但是,如果我使用 GetCommandLine我可以获得指向命令行字符串的有效指针,它会显示出来。
call dword[GetCommandLineA@KERNEL32.DLL]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]

第一个代码块的错误在哪里?我需要什么来获取参数,并能够实现我自己的代码以返回指向 lpszCmdLine 的有效指针就像 GetCommandLine结果,到另一个WinMain参数? 如果我无法从堆栈中获取命令行指针,那么我可能无法获取其他参数,例如 nCmdShow , 对于其他重要的初始化。

如果您需要比上面提供的更多的代码,请告诉我。如果对您有用,我没有使用链接器,而是完全手动生成 EXE(它对 WinMain 有什么影响,比如更多的堆栈参数吗?),但基本上它只是一个 Windows 自动调用其入口点的程序以上将是它包含的程序的两个不同选项。

最佳答案

#include <Windows.h>

int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
__asm {
mov eax, [ebp+16]
push 0
push eax
push eax
push 0
call dword ptr ds:[MessageBoxA]
}

return ERROR_SUCCESS;
}

这对我来说在 Visual Studio 中运行得很好。奇怪的是,在调试器中运行它并且单步执行会在调用 MessageBox 时导致访问冲突。我不确定为什么会这样,但是在没有单步执行的情况下在调试中运行以及运行最终的二进制文件会给出预期的结果,即。带有标题/消息作为参数的消息框

关于winapi - 汇编器 : Getting Win32's WinMain on-stack parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com