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退出进程。

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

  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的导出函数列表:
在这里插入图片描述

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: regsvr32 initpki.dll 是一个Windows系统命令,用于注册initpki.dll文件。initpki.dll是一个Windows系统文件,它包含了一些加密和证书相关的函数。在某些情况下,如果这个文件出现问题,可能会导致一些加密和证书相关的应用程序无法正常工作。通过运行regsvr32 initpki.dll命令,可以重新注册这个文件,从而解决一些相关的问题。 ### 回答2: regsvr32 initpki.dll 是一个系统文件,用于将 PKI 签名算法注册到系统中,以确保能够在计算机上进行数字签名操作。 PKI 签名算法是指使用公钥基础设施进行数字证书及其相关的签名和加密操作。这些证书和数字签名通常用于在互联网上进行安全通信和交易。 在运行 regsvr32 initpki.dll 命令时,该命令可以自动地加载和注册 initpki.dll 文件,以确保该文件可以在计算机上的系统中正常工作。这通常是在 Windows 操作系统中完成的,但是也可以在其他操作系统中使用。 在进行数字签名操作时,系统通常需要要求该文件的存在,因此这个文件在系统中的重要性不可忽视。 如果 regsvr32 initpki.dll 命令未能正常完成时,可能会导致系统无法正确地处理数字签名和证书,这将对系统的安全性产生重大影响,因此,确保该文件正常注册和工作至关重要。如果遇到了问题,可以在系统中使用“文件检查工具”进行修复,或在官方网站中获得相关的信息和帮助。 总之,regsvr32 initpki.dll 命令是确保 PKI 签名算法文件正确被系统识别和使用的重要步骤,是保证数字签名系统正常工作的关键之一。 ### 回答3: regsvr32 initpki.dll是一条Windows系统命令,它的作用是将initpki.dll文件注册到Windows系统中。initpki.dll是一个系统文件,它是一部分Windows系统安全组件,主要用于数字证书的信任管理,它可以验证数字证书的有效性和真实性。 数字证书是一种用于加密和保护数据传输的方式,例如在网上购物或银行转账等场景下,数字证书可以确保交易信息的安全性和完整性。但是,在数字证书的申请和传输过程中,有可能会出现一些问题,例如证书的过期、证书的伪造等问题,这时就需要initpki.dll这个组件来验证数字证书的有效性,防止恶意攻击和信息泄露等安全问题。 同时,initpki.dll也与Internet Explorer浏览器和Windows Update等组件密切相关,它可以帮助Internet Explorer浏览器识别和验证网站的数字证书,以确保用户所访问的网站是安全可靠的;而且,initpki.dll也可以为系统更新提供数字证书的认证,以确保系统更新的可靠性和安全性。 因此,当系统提示缺少或损坏initpki.dll文件时,我们可以使用regsvr32命令来将其重新注册到系统中,以确保系统安全组件的完整性和正常运行。具体操作步骤如下: 1.点击“开始”菜单,选择“运行”,输入cmd后回车打开命令提示符窗口。 2.在命令提示符窗口中,输入regsvr32 initpki.dll并按回车键。 3.等待几秒钟后,如果弹出注册成功的提示框,则说明操作成功。 需要注意的是,这个命令需要使用管理员权限运行,否则会提示“拒绝访问”错误。在使用这个命令时,也要确保initpki.dll文件是存在的并且没有被破坏或感染病毒等恶意程序。如果这个文件不存在或损坏,可以尝试从Windows系统安装盘或者其他可靠的渠道重新获取和安装这个文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呀呀呀浅汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值