Pnp即插即用设备驱动安装程序
2019-12-05 19:06:56 Author: mp.weixin.qq.com(查看原文) 阅读量:82 收藏

本文为看雪论坛优秀文章

看雪论坛作者ID:随风行

环境准备
VMware Workstation 14 Pro
win10Pro x64 虚拟机
VS2019
 
虚拟机中安装:
  • VS远程调试程序 msvsmon

  • x64dbg

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

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

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

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


添加到代码中。
certutil -addstore "TrustedPublisher" 证书的全路径加文件名.cer。
双机调试时
  • 普通程序,入口点 main 加 MessageBox(0, 0, 0, 0);

  • 驱动程序,入口点 DriverEntry 加 DbgBreakPoint();

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

看雪ID:随风行

https://bbs.pediy.com/user-857955.htm 

*本文由看雪论坛  随风行  原创,转载请注明来自看雪社区

推荐文章++++

GandCrab v5.2 分析

恶意代码分析中一些常见的非PE样本分析

定制Xposed框架

通过一道pwn题详细分析retdlresolve技术

打造属于自己的渗透神器——WiFi-ducky

进阶安全圈,不得不读的一本书

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]
“阅读原文”一起来充电吧!

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458301691&amp;idx=1&amp;sn=bc1560e9aaac5a9a95b1a80bff012ac4&amp;chksm=b181847186f60d67a2eb87ce009096793fdce5b33873bb12e56ea450195182cc3b459940b39b#rd
如有侵权请联系:admin#unsafe.sh