1、起因
从哥们儿那找到了一个超级注入的工具,打开一看加了vmp,然后还有驱动的驱动,于是这里把驱动提取出来,简单分析一下。
1.1运行
让程序先把驱动释放出来,可以看到这里需要买卡,然后才会释放驱动加载 (简单破解一下就行,不是重点)
1.2破解之后
下一个CreateServiceA断点,让它在加载驱动之前断下,接着将驱动拷贝出来。从下图可以看到虽然驱动有签名,但是个过期签名,高版本windows10上是加载不上的。
2、驱动分析
好消息是驱动没有加壳,可以f5分析一下
2.1Wdf驱动
简单浏览一下发现驱动没有设备对象,也没有符号链接,不知道怎么通信的?
2.2初始化
主要是两个函数,第一个是利用系统的回调做自己的通信函数,第二个是注册一个ob回调保护自己。
2.3ob回调
有意思的是它的起始地址并不是在当前驱动中,而是去找ntos中的ffe1(jmp ecx),这里的ecx应该就是RegistrationContext(回调函数中的context),他把RegistrationContext替换成自己的回调。
回调函数很简单,就是当有其他进程打开自己的时候降权。
这里注册ob回调系统会检查驱动的签名,常见的方式是下面的代码。但他这里就不,它通过hookMmVerifyCallbackFunction返回1来绕过。
#ifdef _WIN64
PLDR_DATA_TABLE_ENTRY64 ldr;
ldr = (PLDR_DATA_TABLE_ENTRY64)pDriverObj->DriverSection;
#else
PLDR_DATA_TABLE_ENTRY32 ldr;
ldr = (PLDR_DATA_TABLE_ENTRY32)pDriverObj->DriverSection;
#endif
ldr->Flags |= 0x20;
2.4 r3和r0通信
驱动使用的通信方式不常见,利用的是ExRegisterAttributeInformationCallback函数中的两个回调函数ExpDisSetAttributeInformation和ExpDisQueryAttributeInformation做通信。
ExpDisQueryAttributeInformation在ExQueryAttributeInformation中被调用
ExQueryAttributeInformation在NtQueryInformationFile中FileInformationClass为FileUnusedInformation时会被调用。
ExpDisQueryAttributeInformation同理,说明这个驱动的作者还是很有心的,找到了两个可以被利用的回调函数作为驱动r0和r3通信。
2.5 提供给r3的功能函数
一个有七个,这里简单的看一下
1、查找模块基址
2、读取目标地址内存
3、写入数据到目标进程
这里如果ZwProtectVirtualMemory失败,之后会关闭cr0的页保护在试一下。
顺带提一下,使用MmCopyVirtualMemory没有必要自己手动附加到目标进程,因为函数内部会帮你附加,如下图所示。
4、查询目标进程内存信息
5、设置之前提到的保护进程的pid
6、在目标进程中申请内存
7、最重要的是如何执行代码,它并没有调用Createthread的一类函数,而是通过修改Trap_frame和Wow64_context来执行自己的代码。
获取目标进程的一个线程对象
接着暂停线程对象
在判断是x64还是x32
x32,获取到teb之后加了0x1488是什么意思?通过查找资料之后不难发现这个是 WOW64_CONTEXT的地址,修改它的eip就能控制查询的执行。
x64下eprocess+0x28是InitialStack,且InitialStack指向的是TrapFrame这个结构体,通过修改TrapFrame的rip就能控制x64 r3下进程的流程,这里的shellcode是保存寄存器和跳转,没详细去分析。
接着插入一个工作线程,用来回收之前申请的内存资源
最后恢复线程,执行shellcode加载dll
over,该驱动在启动线程和r3 r0通信上使用了不常见手法,该驱动作者还是很认真的学习了很多知识。
我真是太菜了!!呜呜呜!!