fengyue.sys是Strong OD的驱动就不多做介绍。从0.4.8.892中抠出。
因无聊尝试脱其壳,从ep看使用了虚拟机,到了oep后,发现多处函数及oep皆被vm了。
不过该vm是十分标准的堆栈虚拟机,引擎代码和虚拟指令代码可读性极高。
x86代码也只是简单的转换为vm代码,所以觉得还原起来难度不大,
不过vm毕竟是vm,也需要蛮多时间,弄了几天之后没兴趣了,不过也还原得差不多了,
现将代码发出来,有兴趣的可以继续玩玩
首先简述下r3下脱驱动壳:
要在r3下利用OD脱驱动壳,只要写个loader,提供一些平台支持就行了
1) 在内核下,通过遍历DriverObject->DriverSection(LDR_DATA_TABLE_ENTRY)->InLoadOrderLinks获得ntoskrnl,hal等等模块。所以需要模拟此list。
2) 接管ExAllocatePoolWithTag和ExFreePoolWithTag,对应替换为VirtualAlloc与VirtualFree
3) 如需要,可连MmGetSystemRoutineAddress也接管了。
4) 构造DRIVER_OBJECT,调用DriverEntry。
也一起上传了loadsys代码。
OD载入后,bp VirtualFree,然后搜索vm_exit,断住返回即到oep
以下为vm还原的思路。
由于x86并未经过拆分,以代码表示
add eax,ebx -> mov reg_a, eax -> mov ryy|1, ryy|3
mov reg_b, ebx mov ryy|2, ryy
[popfd reg_c] calc, ryy|1, ryy|2 (之所以定义为calc是因为还有其他计算操作,比如xor等等)
add reg_a, reg_b mov ryy|3, ryy|1
mov eax, reg_a
利用此套规则便可线性的将vm代码块还原成x86代码了。
由于操作数还有rm和sib等等操作,所以涉及到ryy的推导。
由于没有使用语法树,所以依然线性的匹配规则进行子表达式合并。
1)分析vm handler table,将vm code建立成链表。
2)合并子表达式
3)生成x86汇编语句
4)按照skypatch生成对应格式文件
附件带有还原过后的sys,并没有处理更多,请见谅,仅供IDA参考
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课