Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303389
  • 博文数量: 47
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 558
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-25 15:43
文章分类

全部博文(47)

文章存档

2016年(2)

2012年(10)

2011年(13)

2010年(1)

2009年(19)

2008年(2)

分类: WINDOWS

2012-11-08 16:51:55

根据 , 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的命令.
阅读(1486) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~