rundll32.exe和regsvr32.exe
众所周知,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
退出进程。
看着是不是很简单,确实很简单,但涉及到了两个失败。
- LoadLibraryEx失败:
GetLastError获得失败原因,然后MessageBox错误弹窗,最后ExitProcess退出进程。
- GetProcAddress失败:
MessageBox错误弹窗,然后FreeLibrary卸载DLL,最后ExitProcess退出进程。
注意:MessageBox是有阻塞线程的作用的,关闭弹窗才能继续往下执行。
调试实例
以rundll32.exe "C:\\testDll.dll",DllMain
为例,看一下rundll32.exe的执行流程:
- 通过
LoadLibraryEx
加载该DLL,此时会调用DllMain,且第二参数是DLL_PROCESS_ATTACH
。
- 通过
GetProcAddress
获得指定的导出函数地址。
获得
DllMainW
失败后,又获得了DllMainA
的地址。
- 获得导出函数地址失败后,准备错误弹窗。
首先通过LoadStringW
获得资源ID为400的字符串("%s 出错\n丢失条目: %s");
然后格式化弹窗字符串:
然后通过LoadStringW
获得资源ID为0x402的字符串(“RunDLL”);
最后通过MessageBoxW弹窗。
弹窗后,如果不关闭对话框,线程会一直阻塞。 - 点击确定后rundll32会通过
FreeLibrary
卸载该DLL。 - 最后rundll32通过
ExitProcess
结束自身进程。
regsvr32.exe
regsvr32.exe用于注册/卸载COM组件。
COM组件:Component Object Mode,是微软提出的一种软件开发技术。组件其实是一些小的二进制可执行程序,它们可以用于给应用程序、操作系统及其他组件提供服务。COM组件由 以DLL或EXE形式发布的可执行代码
组成。
组件DLL的导出函数列表通常会包含DllRegisterServer
和DllUnregisterServer
。
- 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相关推荐
- python37.dll可能与您正在运行_模块可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86或x64...
今天一个网友群里留言,他win8的系统,下载我们的软件无法正常运行,原来他的win8是64位的系统,而我们的软件是32位,而且这个软件还需要一个dll文件,没有注册就无法使用,参考下面的方法解决了 1 ...
- regsvr32.exe
regsvr32.exe用于注册Windows操作系统的动态链接库和ActiveX控件. regsvr32.exe 文件建议修改权限,删除所有的用户只保存Administrators 和SYSTEM为 ...
- Regsvr32.exe 的用法
Regsvr32.exe 的用法 RegSvr32.exe 具有以下命令行选项: Regsvr32 [/u] [/n] [/i[:cmdline]] dllname /u – 取消注册服务器 /i – ...
- regsvr32.exe进程注册dll文件
regsvr32.exe用于注册Windows操作系统的动态链接库(dll)和ActiveX控件.这个程序对你系统的正常运行是非常重要的. dll文件即动态链接库,是一个不可执行的二进制程序文件, ...
- WIN10 注册.dll regsvr32.exe错误 VC6添加插件
VC6添加文件插件 1.将.dll复制到 C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\AddIns\FileTool.d ...
- regsvr32.exe使用详解
regsvr32.exe使用详解 Regsvr 32命令是Windows中控件文件(如扩展名为DLL.OCX.CPL的文件)的注册和反注册工具. 命令格式 Regsvr32 [/s] [/n] [/i ...
- c:\Windows\system32\ regsvr32.exe Windows无法访问指定设备、路径或文件,你可能没有适当的权限访问该项目
***c:\Windows\system32\ regsvr32.exe Windows无法访问指定设备.路径或文件,你可能没有适当的权限访问该项目 *** 当我们遇到这种问题怎么,多半分析是由于忙于 ...
- 模块“CHUSBDLL.DLL.dll“可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86或x64版本兼容 【已解决】
1.点击链接下载CHUSBDLL.DLL 2.把CHUSBDLL.DLL拷贝到系统的system32文件夹下 3.开始->运行->regsvr32 CHUSBDLL.DLL 因为我的系统是 ...
- 使用Rundll32.exe和Rundll.exe
福州 Pasic 常用Windows9x的朋友一定对Rundll32.exe和Rundll.exe这两个文件不 会陌生吧,不过,由于这两个程序的功能原先只限于在微软内部使用,因而真正 知道如何使用它们 ...
最新文章
- 深度揭秘AI换脸原理,为啥最先进分类器也认不出?
- textView代码设置文字居中失效 textView设置文字居中两种方法
- Python中的Mixin详解
- 如何防止线程死锁java_Java 并发编程:如何防止在线程阻塞与唤醒时死锁
- [贪心][高精度][NOIP]国王游戏
- 连续与离散变量的函数分布计算
- 节点文件将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML...
- Atitit 会话层和表示层的异同
- RouterOS利用(L2TP)实现异地组网
- MQTT、CoAP 还是 LwM2M?主流物联网协议如何选择
- 【电脑使用】插入SD卡图标是灰色的,点击显示“请将磁盘插入驱动器”
- 二进制乘法的booth算法
- [科技] 假装是ETT的ETT
- python中可迭代对象是什么意思_python可迭代对象概念讲解
- C语言正弦和余弦的值
- 编写一个程序,计算学生的总分和平均成绩(一)
- 『喜报』WoS数据C1和EM字段不再重复
- windows 本地搭建git仓库_Windows平台下Github远程仓库的搭建-Go语言中文社区
- vue + elemen可远程搜索select选择器的封装(思路及源码分享)
- Opencv4.0学习记录(Day1 图像读取与显示)
热门文章
- JPEG2000压缩DICOM文件的解压(一)
- php扩展ts和nts,浅谈php的TS和NTS的区别
- 关于一种新的空气内新冠病毒检测方式的诸多设想
- Xftp6XShell6下载地址
- Python基础(三) | Python的组合数据类型
- Python基础+数据科学入门(三)组合数据类型
- En-Tan-Mo(ETM)项目周报(7.5-7.11)
- 知识汇总二(简单光照模型)
- SitePoint播客#34:对斜线表示抱歉
- mongodb Timed out after 30000 ms while waiting for a server that matches WritableServerSelector.