一个基本的压缩壳体系上面附加点anti手段 加密之类的
应该勉强够上加密壳的范畴了

虽然 驱动本身加壳意义不大 减少了1点体积 但是牺牲来很多的稳定性
但是在某个情况的 有特殊的作用
比如 我们要逆向1个驱动 这里还是拿mj的那个360antiarp的例子(虽然偶逆的不好)

我们知道 360antiarp驱动是需要挂钩网卡设备的,挂钩设备有直接替换majorfunction
和inline hook2种方式,如果要在已有的设备上面挂钩 需要已知设备名 才能使用
ObReferenceObjectByName获得设备对象,然后我们才能定位MajorFunction修改之
但是 网卡设备名是NPF_一堆GUID,后面那个字符不是固定的,mj0011于是就hook
IoCreateDevice,并且检查strDeviceName前面是否含有NPF,是则直接替换掉
MajorFunction为自己的处理函数

mj0011这样做 其结果就是我们调试这个驱动很麻烦,hook需要重启才有效,因为如果
网卡已经创建了设备,我们再来启动360antiarp驱动,这个驱动什么也收不到了,我们
现在有1种办法,就是给360antiarp驱动加壳,在驱动启动之前,我们改变360antiarp驱动
的MajorFunction指向壳中的处理函数,我们就可以拦截,修改,记录IRP了,这样,上层
发来的IRP全部经过我们过滤,从而可以直接记录IoControlCode和SystemBufferIn ,然
后发下去IRP给360antiarp驱动,当返回的时候我们还可以记录SystemBufferOut
哈哈 以加壳的方式来帮助逆向,也算 以壳克壳 的另外1种思路吧

这个思路不知道可以用于NP或者HS之类的游戏保护等东西不,我们利用加壳大法,将NP驱动
载入以后,patch他,上次看到某人说最新HS挂钩了0x60端口,我们是不是可以去替换他的hook
处理函数?或者替换他的int3 int1处理函数?抑或来个inlinehook看看?
还有 不知道NP和HS怎么和应用层通信的,如果是IRP我们如法炮制,这个偶不清楚,还是大牛们
来说好了

说了一堆“废话”,下面开始正题吧
其实sys加载和dll加载有很多的相似之处,加载,重定位,输入表,jmp to oep
那么保护手段也应该相似,偶想了几个办法,还没来得及实现 大牛们看看可行不
以下手段都是加载完毕以后进行
1.清除重定位表
从理论上说 重定位表使用完以后不需要了,r3下面肯定有这种办法的壳,知名的relocx
就是来解决重定位表修复的
2.部分清除输入表
输入表本质上是1个地址表,加载之后 FirstThunk就是函数的真实所在地址表,也就是说
只有这个真正有用,其他的项目 加载完毕以后 从理论上面说 不需要了
3.清除PE头
加载完毕 PE头应该也不需要了,虽然偶不知道有无理论上的问题 系统大牛们指点
4.Import Table Elimination
这个名称是参考Armadillo的
输入表加密 也就是把那个地址表里面的函数地址替换成壳处理函数,壳自己实现部分API
功能,比如aspr就自己模拟了一些API,这个只能在理论上有用,偶驱动写的很少,不知道
那些api是驱动必须的,再说偶也不好怎么去模拟nativeapi,另外1个办法就是设置自己的IAT
转发函数,对于不同地址自动转发不同API,这个实现比较难,详细的可以看shoooo大牛的
ASPR分析文章,很牛很牛
5.Code Splicing
这个名称也是参考Armadillo的
Code Splicing?偶是不是想蓝屏了?听说驱动代码是要求极高的,代码变形,抽取
会不会直接蓝屏?是否对代码变形引擎要求很严?这里哦偶完全不懂了,
大牛多多指点
6.来自pjf的anti技术
查询模块syser.sys 和si 的ntice.sys,有就蓝或者重启

调用 KdDisableDebugger 和 恢复 INT1 和 INT3 的中断入口

sub_1B2A6 函数里面会修改 INT1 和 INT3 中断向量的入口为 IS 内部的例程,然后执行 INT 1 指令跳入中断程序,在中断例程中将 EIP+12 到
movzx    eax, ds:g_Cr4SomeBit
这样实现了跳转,然后在之后
call      ResetINT13Entry
恢复中断程序

上面很多anti都不知道能否能用 还需大牛指点 谢谢了