winapi – 汇编程序:获取Win32的WinMain堆栈参数
发布时间:2020-12-14 04:30:33 所属栏目:Windows 来源:网络整理
导读:我需要使用程序集访问WinMain参数,但我似乎无法这样做,尽管我应该知道它们在堆栈中的位置(DWORD在操作之前按下EBP时偏移0到16和0到20) .下面是一个显示包含程序命令行的lpszCmdline字符串的示例,但它似乎总是包含0,因此不会显示任何内容.如果我尝试在汇编代
我需要使用程序集访问WinMain参数,但我似乎无法这样做,尽管我应该知道它们在堆栈中的位置(DWORD在操作之前按下EBP时偏移0到16和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自动调用它的入口点和以上将是它将包含哪个程序的2个不同选项. 解决方法#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时导致访问冲突.我不确定为什么会这样,但是在没有单步执行的情况下运行调试以及运行最终的二进制文件会产生预期的结果,即.带有标题/消息作为参数的消息框 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- iis – 此时服务无法接受控制消息
- powershell – 如何使用批处理或vbscript向Windows 7/8搜索
- 在Windows C或C#中,您可以询问操作系统当前是否正在关闭/重
- hyper-v – 个人虚拟桌面集:用户分配
- 可执行文件在Windows上以Mono内置
- 将输出重定向到Windows中另一个命令的命令行参数
- windows-runtime – 导航到其他页面后继续播放的Global Med
- .net – 如何使用Powershell在win7或win2008中自定义“区域
- windbg:在dll偏移处设置数据断点
- 在Windows中识别unicode编码的文本文件的最好方法是什么?