Pnp即插即用设备驱动 自动安装程序 C C++实现

环境准备:

VMware Workstation 14 Pro
win10Pro x64 虚拟机
VS2019

虚拟机中安装:
VS远程调试程序 msvsmon
x64dbg

Windows驱动程序样本/devcon(源码)
下载后,在VS中打开,报一大堆错误,是因为缺少msg.h文件,无需理会,直接 release x64编译
会在生成目录生成msg.h文件,拷贝到代码目录,添加到头文件中,
Notepad++打开devcon.vcxproj,找到 删掉 保存,再次加载项目就不会出现以下错误:

VS 文件msg .h 包含在 ClInclude 和 ClInclude 项组中。项目项不允许这样做,它只能属于一个项组。

这些搞定,即可正常阅读代码。

这里只分析,Pnp即插即用设备驱动安装

将编译好的 devcon.exe 拷贝到虚拟机中
管理员权限启动 cmd
cd 到 devcon.exe 所在目录

cd C:\Users\win10\Desktop 

查看 安装 帮助
在这里插入图片描述
这里我插一条示例

devcon.exe install xxx.inf(指定包含设备安装信息的INF文件) hwid(指定设备的硬件ID) 

设备的硬件ID,打开inf文件,找到 Install 节,根据系统选择 [Standard.NTamd64] 或 [Standard.NTx86]

在这里插入图片描述
安装成功 返回:Drivers installed successfully.
在这里插入图片描述
查看 设备管理器 找到自己安装的驱动
在这里插入图片描述

代码分析

因为最早,没找到源码,是逆向的整体逻辑,上IDA截图
devcon 有个巧妙的结构

我猜测的结构
在这里插入图片描述
在这里插入图片描述
devcon中定义的为:

在这里插入图片描述
DispatchEntry结构的后两个DWORD为帮助语,
其中shortHelp,显示于 键入:devcon.exe help
其中longHelp, 显示于 键入:devcon.exe help install(对应操作)

main 函数中,v15 是输入的操作命令 如:install v17 是 DispatchTable[] 的序号
在这里插入图片描述
cmdInstall 中
在这里插入图片描述
在这里插入图片描述
cmdUpdate 中
在这里插入图片描述

自动安装与Windows安全

驱动在安装中弹出 windows 安全提示框,手动安装没有丝毫影响,但是当线上大规模部署时,就会产生效率问题
在这里插入图片描述
开始,猜测这个弹窗类似于 用户账户控制(UAC) 弹窗运行在“安全桌面”,整个桌面进入了 SYSTEM 账户,原用户账户下的所有程序都无法得知此时 UAC 弹窗的情况,也无法通过模拟用户操作来跳过这个 UAC 框
在这里插入图片描述
尝试发现,弹出 Windows 安全弹窗时,Spy++ 任务管理器 x64dbg都可以正常运行,获取窗口信息
在这里插入图片描述

这个弹窗归属rundll32.exe 进程,路径在 C:\Windows\System32\rundll32.exe
是在我的安装即插即用设备驱动程序 UpdateDriverForPlugAndPlayDevicesW API 中被调用的
想要在自动部署时,干掉这个窗口
我们先用 Spy++ 查看窗口属性,能不能获取到句柄
在这里插入图片描述
标题,句柄都可以获取到,那么我们给窗口发送 WM_LBUTTONDOWN 消息即可,
x64dbg 窗口下消息断点,断到后分析参数。
在这里插入图片描述
在这里插入图片描述

DWORD64 dwLparam = 0x0000000000030003; // 坐标
SendMessage(hwnd, WM_LBUTTONDOWN, 1, dwLparam);
SendMessage(hwnd, WM_LBUTTONUP, 1, dwLparam);

实际用代码查找窗口的过程中,发现枚举不到安装按钮的窗口,而他的父窗口没有标题,同一窗口类的窗口有4个
转换思路~
驱动在成功安装一次,卸载后再次安装,是没有这个安全弹窗的。
查找原因
开始猜测是,驱动在安装过程中修改了注册表项,手动模拟修改注册表——测试——失败
转化思路
再次分析弹窗,有一个单选框 始终信任来自“XXXXXXXX”的软件 还有可信发布者
猜测可能是证书存储CertificateStore
在这里插入图片描述
Win+R 运行 certmgr.msc 打开证书管理 查看 受信任的发布者 点证书 右边会显示出本机已信任的发布者
在这里插入图片描述
找到自己的驱动签名 右键导出
在这里插入图片描述
格式选择
在这里插入图片描述
其他的直接下一步就可以了。

在一个没有安装过驱动的机器上,
打开 certmgr.msc
在 受信任的发布者 中
右键 导入 添加证书,
再安装驱动时发现未弹出安全弹窗。
成功!

但是这里还有最后一个问题,手动导入签名,还不如点掉 安全提示框来得方便。
查相关资料,
certutil
在这里插入图片描述
在这里插入图片描述

运行cmd 执行以下指令

certutil -addstore "TrustedPublisher" 证书的全路径加文件名.cer

在这里插入图片描述
添加到代码中,
在这里插入图片描述

这里插一个调试实用小技巧

双机调试时
普通程序,入口点 main 加 MessageBox(0, 0, 0, 0);
驱动程序,入口点 DriverEntry 加 DbgBreakPoint();

总结

即插即用设备驱动的安装,需要:
1 首先,创建一个虚拟的设备
2 修改硬件ID属性
3 调用 SetupDiCallClassInstaller 将注册表元素转换为PnP硬件树中的实际设备节点
4 获取 UpdateDriverForPlugAndPlayDevicesW 地址
5 调用 UpdateDriverForPlugAndPlayDevicesW 更新我们刚刚创建的设备的驱动程序
6 删除设备

END

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值