众所周知,DLL文件是不能独自运行的,需要被进程加载到其地址空间后才能执行。
那怎么运行一个DLL呢?
答案:可以借助Windows所提供的rundll32.exe或regsvr32.exe。

rundll32.exe

通过rundll32.exe可以直接调用DLL的导出函数来执行功能。
命令行:rundll32.exe DllName,FuncName [Arguments]
但被指定的导出函数有格式要求,导出函数的格式如下,函数参数列表中的pCommand就是通过[Arguments]传入的。

void WINAPI FuncName(HWND hWnd, HINSTANCE hInst, LPCWSTR pCommand, DWORD nCmdShow);

执行流程

其内部通过LoadLibraryEx来加载该DLL,然后通过GetProcAddress来获取导出函数地址并调用,当该导出函数返回时,rundll32会通过FreeLibrary卸载该DLL并通过ExitProcess退出进程。

看着是不是很简单,确实很简单,但涉及到了两个失败。

  1. LoadLibraryEx失败:
    GetLastError获得失败原因,然后MessageBox错误弹窗,最后ExitProcess退出进程。
  2. GetProcAddress失败:
    MessageBox错误弹窗,然后FreeLibrary卸载DLL,最后ExitProcess退出进程。

注意:MessageBox是有阻塞线程的作用的,关闭弹窗才能继续往下执行。

调试实例

rundll32.exe "C:\\testDll.dll",DllMain为例,看一下rundll32.exe的执行流程:

  1. 通过LoadLibraryEx加载该DLL,此时会调用DllMain,且第二参数是DLL_PROCESS_ATTACH
  2. 通过GetProcAddress获得指定的导出函数地址。
    获得DllMainW失败后,又获得了DllMainA的地址。
  3. 获得导出函数地址失败后,准备错误弹窗。
    首先通过LoadStringW获得资源ID为400的字符串("%s 出错\n丢失条目: %s");
    然后格式化弹窗字符串:

    然后通过LoadStringW获得资源ID为0x402的字符串(“RunDLL”);

    最后通过MessageBoxW弹窗。

    弹窗后,如果不关闭对话框,线程会一直阻塞。
  4. 点击确定后rundll32会通过FreeLibrary卸载该DLL。
  5. 最后rundll32通过ExitProcess结束自身进程。

regsvr32.exe

regsvr32.exe用于注册/卸载COM组件。

COM组件:Component Object Mode,是微软提出的一种软件开发技术。组件其实是一些小的二进制可执行程序,它们可以用于给应用程序、操作系统及其他组件提供服务。COM组件由 以DLL或EXE形式发布的可执行代码 组成。

组件DLL的导出函数列表通常会包含DllRegisterServerDllUnregisterServer

  • DllRegisterServer:注册组件,在注册表中登记该DLL;
  • DllUnregisterServer:卸载组件,在注册表中取消该DLL的登记。

先来看一下官方给出的用法(在cmd里输入regsvr32.exe即可)。

看着有点迷糊,挨个来解释一下:

  • 默认情况下:即regsvr32.exe xxx.dll,此时调用DllRegisterServer来注册该DLL。
  • /u:Unregister,即调用DllUnregisterServer来卸载该DLL。
  • /s:Silent,静默,即不显示任何消息框。
  • /n:No(我猜的),不调用DllRegisterServer或DllUnregisterServer,/n必须和/i一起用。
  • /i:command:有/u时,调用DllInstall(FALSE, [cmdline])来卸载该DLL;没有/u时,调用DllInstall(TRUE, [cmdline])来注册该DLL。

应用场景

可以用regsvr32.exe来运行Scriptlet脚本:regsvr32.exe /s /u /n /i:http://127.0.0.1/file.sct scrobj.dll

该命令会调用scrobj.dll的DllInstall(FALSE, "http://127.0.0.1/file.sct"),此时会去下载file.sct并执行;
而scrobj.dll也不会被登记到注册表中,因为指定了/u

附上scrobj.dll的导出函数列表:

rundll32.exe和regsvr32.exe相关推荐

  1. python37.dll可能与您正在运行_模块可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86或x64...

    今天一个网友群里留言,他win8的系统,下载我们的软件无法正常运行,原来他的win8是64位的系统,而我们的软件是32位,而且这个软件还需要一个dll文件,没有注册就无法使用,参考下面的方法解决了 1 ...

  2. regsvr32.exe

    regsvr32.exe用于注册Windows操作系统的动态链接库和ActiveX控件. regsvr32.exe 文件建议修改权限,删除所有的用户只保存Administrators 和SYSTEM为 ...

  3. Regsvr32.exe 的用法

    Regsvr32.exe 的用法 RegSvr32.exe 具有以下命令行选项: Regsvr32 [/u] [/n] [/i[:cmdline]] dllname /u – 取消注册服务器 /i – ...

  4. regsvr32.exe进程注册dll文件

    regsvr32.exe用于注册Windows操作系统的动态链接库(dll)和ActiveX控件.这个程序对你系统的正常运行是非常重要的.   dll文件即动态链接库,是一个不可执行的二进制程序文件, ...

  5. WIN10 注册.dll regsvr32.exe错误 VC6添加插件

    VC6添加文件插件 1.将.dll复制到 C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\AddIns\FileTool.d ...

  6. regsvr32.exe使用详解

    regsvr32.exe使用详解 Regsvr 32命令是Windows中控件文件(如扩展名为DLL.OCX.CPL的文件)的注册和反注册工具. 命令格式 Regsvr32 [/s] [/n] [/i ...

  7. c:\Windows\system32\ regsvr32.exe Windows无法访问指定设备、路径或文件,你可能没有适当的权限访问该项目

    ***c:\Windows\system32\ regsvr32.exe Windows无法访问指定设备.路径或文件,你可能没有适当的权限访问该项目 *** 当我们遇到这种问题怎么,多半分析是由于忙于 ...

  8. 模块“CHUSBDLL.DLL.dll“可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86或x64版本兼容 【已解决】

    1.点击链接下载CHUSBDLL.DLL 2.把CHUSBDLL.DLL拷贝到系统的system32文件夹下 3.开始->运行->regsvr32 CHUSBDLL.DLL 因为我的系统是 ...

  9. 使用Rundll32.exe和Rundll.exe

    福州 Pasic 常用Windows9x的朋友一定对Rundll32.exe和Rundll.exe这两个文件不 会陌生吧,不过,由于这两个程序的功能原先只限于在微软内部使用,因而真正 知道如何使用它们 ...

最新文章

  1. 深度揭秘AI换脸原理,为啥最先进分类器也认不出?
  2. textView代码设置文字居中失效 textView设置文字居中两种方法
  3. Python中的Mixin详解
  4. 如何防止线程死锁java_Java 并发编程:如何防止在线程阻塞与唤醒时死锁
  5. [贪心][高精度][NOIP]国王游戏
  6. 连续与离散变量的函数分布计算
  7. 节点文件将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML...
  8. Atitit 会话层和表示层的异同
  9. RouterOS利用(L2TP)实现异地组网
  10. MQTT、CoAP 还是 LwM2M?主流物联网协议如何选择
  11. 【电脑使用】插入SD卡图标是灰色的,点击显示“请将磁盘插入驱动器”
  12. 二进制乘法的booth算法
  13. [科技] 假装是ETT的ETT
  14. python中可迭代对象是什么意思_python可迭代对象概念讲解
  15. C语言正弦和余弦的值
  16. 编写一个程序,计算学生的总分和平均成绩(一)
  17. 『喜报』WoS数据C1和EM字段不再重复
  18. windows 本地搭建git仓库_Windows平台下Github远程仓库的搭建-Go语言中文社区
  19. vue + elemen可远程搜索select选择器的封装(思路及源码分享)
  20. Opencv4.0学习记录(Day1 图像读取与显示)

热门文章

  1. JPEG2000压缩DICOM文件的解压(一)
  2. php扩展ts和nts,浅谈php的TS和NTS的区别
  3. 关于一种新的空气内新冠病毒检测方式的诸多设想
  4. Xftp6XShell6下载地址
  5. Python基础(三) | Python的组合数据类型
  6. Python基础+数据科学入门(三)组合数据类型
  7. En-Tan-Mo(ETM)项目周报(7.5-7.11)
  8. 知识汇总二(简单光照模型)
  9. SitePoint播客#34:对斜线表示抱歉
  10. mongodb Timed out after 30000 ms while waiting for a server that matches WritableServerSelector.