windows下rundll32介绍
最近看书介绍rundll32可以加载dll文件并执行其中导出函数,在MSDN中我们可以看到绍http://support.microsoft.com/kb/164787/zh-cn
rundll32调用的函数要有特定的格式如下图:
![](http://images0.cnblogs.com/blog/339657/201308/29223806-88683f01a9ac41d4a21bb0f7e63b7b67.png)
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调用出现错误
调用使用:![]()
![](//images0.cnblogs.com/blog/339657/201308/29223822-e4421da05c7e4ca0940955514845a3f4.png)
![](http://images0.cnblogs.com/blog/339657/201308/29223822-e4421da05c7e4ca0940955514845a3f4.png)
成功调用,其实windows下DLL和EXE文件区别并不大,都是PE文件格式,rundll32也就是动态加载了我们输入中的dll文件,并执行我们指定的函数(函数格式必须按照它指定的格式),其实就是调用了LoadLibrary加载动态库,GetProcAddress根据函数名获取函数地址,然后通过FreeLibrary卸载动态库.