【发布时间】:2013-12-14 19:28:43
【问题描述】:
我想写一个类似于下面C++程序的MASM程序:
#include <Windows.h>
#include <iostream>
typedef UINT (_stdcall *FuncPtr)(LPCSTR lpCmdLine, UINT uCmdShow);
int main(void)
{
HMODULE hDll = LoadLibrary(TEXT("Kernel32.dll"));
FuncPtr func_addr = reinterpret_cast<FuncPtr>(GetProcAddress(hDll, "WinExec"));
(*func_addr)("C:\\WINDOWS\\system32\\calc.exe", SW_SHOWDEFAULT);
FreeLibrary(hDll);
return (0);
}
如您所见,此代码执行微软计算器。我只想使用 MASM 做同样的事情,但执行失败。
这是 MASM 源代码:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\include\msvcrt.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\msvcrt.lib
.data
LpFileName db "kernel32.dll", 0
procName db "WinExec", 0
display db "addr_func = 0x%x", 0
.data?
hModule HMODULE ?
procAddr FARPROC ?
.code
start:
invoke LoadLibrary, offset LpFileName
mov hModule, eax
invoke GetProcAddress, hModule, ADDR procName
mov procAddr, eax
INVOKE crt_printf, ADDR display, procAddr
mov esi, procAddr
call esi
db "C:\WINDOWS\system32\calc.exe"
invoke FreeLibrary, hModule
invoke ExitProcess, NULL
end start
crt_printf 输出是正确的。与 C++ 程序一样打印相同的地址。所以传递给call的地址是同一个。但是执行失败。
这是一个 MASM32 代码,但这次函数 WinExec 的地址是这样硬编码的:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
.code
start:
jmp _Debut
_Final:
TCHAR 233
dword 42424242h
_Suite:
mov esi, 779e304eh
call esi
jmp _Final
_Debut:
xor eax, eax
push eax
call _Suite
db "C:\WINDOWS\system32\calc.exe"
end start
请参阅mov esi, 779e304eh 行。但是动态的,就有问题了。如果我反汇编上面的代码,我们可以看到字节顺序是颠倒的。
8EEH047E379
也许动态情况并非如此,也许我需要以下行中的关键字(在逗号和 procAddr 之间):
mov esi, procAddr
我找不到解决方案。我迷路了。谁能帮帮我?
非常感谢您的帮助。
【问题讨论】:
标签: windows assembly x86 masm masm32