根据 , rundll.exe和rundll32.exe可以被用来调用指定dll中的指定方法, 其中该方法必须具有指定的接口形式. 其中rundll.exe是用于16位Windows的, 而rundll32.exe则用于32位和64位的Windows.
rundll.exe/rundll32.exe的调用语法为:
rundll.exe/rundll32.exe
,
一个简单的例子为:
rundll.exe/rundll32.exe setupx.dll,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
需要注意的有3点:
1 rundll/rundll32在标准的地方查找dll名字, 即如果相对路径名, 则相对当前路径, 绝对路径名则自然无需多言. 当不带路径"\"时, 先找当前, 再找PATH. 所以要精确指定, 则最好用全路径名. 该路径只识别Dos格式的短名字.
2 不能包含任何空格或者逗号或者引号.
3 在和必须有且只有一个逗号, 且中间只能有该逗号. 和后面的间必须要有空格隔开.
Rundll/rundll32的工作原理:
1 解析命令行
2 通过LoadLibrary()来载入指定的dll
3 通过GetProcAddress()来获得指定入口函数的地址.
4 调用入口函数, 解析命令行尾部的 传递给入口函数
5 当函数执行完毕, rundll/rundll32 卸载dll且退出 .
如何编写Dll
对于16位的dll, 入口函数应当有以下的格式:
void FAR PASCAL __loadds
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
对于32/64位的dll, 入口函数格式为:
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
注意点有3个:
1 入口函数名与dll的 DllEntryPoint函数毫无关系, 后者是用于处理进程线程的attach/detach通知的
2 入口函数必须具有_stdcall调用惯例(CALLBACK一般默认具有_stdcall属性)
3 入口函数的名字可能是_EntryPoint@16, 所以要正确指定入口函数. 最好用.def文件来显示export这些名字.
Rundll/rundll32的入口函数参数介绍如下:
hwnd - window handle that should be used as the owner window for
any windows your DLL creates
hinst - your DLL's instance handle
lpszCmdLine - ASCIIZ command line your DLL should parse
nCmdShow - describes how your DLL's windows should be displayed
在以下命令中:
rundll.exe setupx.dll,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
rundll将调用Setupx.dll中的InstallHinfSectio()函数, 并且传递如下参数:
hwnd = (parent window handle)
hinst = HINSTANCE of SETUPX.DLL
lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
nCmdShow = (whatever the nCmdShow was passed to CreateProcess)
解析的任务由函数自己完成.
在Win64中, C:\Windows\System32\rundll32.exe 用来载入64位的dll,
而C:\Windows\SysWOW64\rundll32.exe 则用来载入32位的dll
一些例子:
根据 , sqliteodbc driver可用rundll32.exe来安装, 且创建系统DSN:
rundll32.exe [path]sqliteodbc.dll,install [quite]
也可以删除:
rundll32.exe [path]sqliteodbc.dll,uninstall [quiet]
还可以在sqlite的database上打开一个shell:
rundll32 [path]sqliteodbc.dll,shell C:\bla\my.db
甚至可以执行一个SQL命令:
rundll32 [path]sqliteodbc.dll,shell -batch C:\bla\my.db "select * from table" NUL: >out.txt
还有大量的用于打开系统窗口的rundll32命令:
Open Control Panel: RunDll32.exe shell32.dll,Control_RunDLL
Add or Remove Programs: RunDll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0
Add or Remove Windows Components: RunDll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
Windows FireWall: RunDll32.exe shell32.dll,Control_RunDLL firewall.cpl
Add a Printer: RunDll32.exe SHELL32.DLL,SHHelpShortcuts_RunDLL AddPrinter
Connect To Printer: RunDll32.exe WINSPOOL.DRV,ConnectToPrinterDlg
Open Printers Folder: RunDll32.exe SHELL32.DLL,SHHelpShortcuts_RunDLL PrintersFolder
Print a Test Page: RunDll32.exe SHELL32.DLL,SHHelpShortcuts_RunDLL PrintTestPage
Share Manager: RunDll32.exe NTLANUI.DLL,ShareManage
Properties of the System: RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,#
Lock WorkStation: RunDll32.exe user32.dll,LockWorkStation
Close Session: RunDll32.exe SHELL32.DLL,SHExitWindow*** 0
Suspend and hibernate: RunDll32.exe powrprof.dll,SetSuspendState
Themes: RunDll32.exe shell32.dll,Control_RunDLL desk.cpl,,-1
WallPaper: RunDll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
Appearance: RunDll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
Display Settings RunDll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
更全的来自于 , 里面介绍了许多rundll32的命令.
阅读(1529) | 评论(0) | 转发(0) |