在应用层和驱动的通讯中采用iocontrol的方式,应用层只要提供一个iocontrol码,就可以调用驱动中的内容。
Switch(iocontrol)
{
Case1:...
Case2:...
Case3:...
......
}
一般我们写程序,写好驱动和应用层,测试一下能用了就可以屁颠屁颠打游戏去了。但是这里面其实是存在一个问题的。
假如,别人写了一个应用层程序,他也需要一个驱动,但是他发现他想要实现的功能可以通过上面的case3里的内容实现,那他就不需要写驱动了,用别人的写的驱动就可以了。
总而言之,如果一个驱动不加校验,可以被任何应用层程序调用,这种驱动就有可能被利用。
今天我们要分析的驱动就是GPUZ驱动,从网上下载最新版GPUZ或者直接从我打包的文件里下载gpuz.sys文件。
Gpuz这种软件是肯定会加载驱动的,但是用pchunter只看到一个路径但是文件已经不存在
那是因为他加载完了就删除了,我们可以简单的写一个循环,对这个位置进行获取,可以使用以下代码
@echo off
set syspath=C:\Users\sword\AppData\Local\Temp\GPU-Z.sys
:loop
if exist "%syspath%" (copy "%syspath%" c:\sys.bak) else (
echo ...)
goto :loop
然后就获取到sys文件了。
接下来把sys文件拖到IDA里,找到driverentry一顿F5,就可以看到如下代码了
这里的MajorFunction14就是iocontrol函数,点进去之后,就找到了一开始说的switch结构了
这里的每个case我都瞟了一眼,挑有用的说
这个很简单就是readmsr的调用,只要调用的时候outlength和inputlength写成8和4就行。
还有一个有用的是这个
整个的代码可以以46行为分界线, 分为上半部分和下半部分。
根据这些API就可以把参数猜出来,我都已经把参数名改了,按照流程顺一遍
首先,outputlength=4 inputlenght=12这里简单的验证了一下
Output就是要一个四字节指针,input是struct{ULONG64 address;ULONG32 length;}这样的东西
MmMAPIOSPACE 是把一段物理内存映射到虚拟内存,这里的物理地址是应用层参数传过来的
MDL全称是memory descriptor list 内存描述符列表,网上有很多详细的介绍,而且一家有一种说法,反正知道他是描述内存的就行了
接下来的IoAllocateMdl MmBuildMdlForNonPagedPool MmMapLockedPagesSpecifyCache 就是mdl的一个配套用法,这里的mdl描述的就是那一段物理内存
看下MmMapLockedPagesSpecifyCache这个函数的第二个参数,
他这里指定的是1,也就是说是usermode,意思是把mdl描述的内存映射到用户空间
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)