最近看书介绍rundll32可以加载dll文件并执行其中导出函数,在MSDN中我们可以看到绍
http://support.microsoft.com/kb/164787/zh-cn
rundll32调用的函数要有特定的格式如下图:

hwnd - 窗口句柄,它应该用作 DLL 创建的任何窗口的所有者窗口
hinst - DLL的实例句柄
hinst - DLL的实例句柄
pszCmdLine - DLL应分析的字符串
lnCmdShow - 描述DLL的窗口应如何显示
我们可以看到有的脚本中直接用rundll32.exe直接调用dll执行一些命令,我们也可以自己写一个dll进行测试
#include
<Windows.h>
_declspec
(
dllexport
)
void
__cdecl
MsgBox
(
HWND
hwnd
,
HINSTANCE
hinst
,
LPTSTR
lpCmdLine
,
int
nCmdShow
)
{
MessageBox
(
hwnd
,
lpCmdLine
,
"Title"
,
MB_OK
);
}
我在vs2008中使用msdn中所说的WINAPI在windowsNT中即:__stdcall调用出现错误
调用使用:

成功调用,其实windows下DLL和EXE文件区别并不大,都是PE文件格式,rundll32也就是动态加载了我们输入中的dll文件,并执行我们指定的函数(函数格式必须按照它指定的格式),其实就是调用了
LoadLibrary加载动态库,
GetProcAddress根据函数名获取函数地址,然后通过
FreeLibrary卸载动态库.