近日,我们发现一款内核注入型的外挂,使用类似火绒dtrampo.dll的早期注入技术(相关源码见1bfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8W2k6g2)9J5k6h3y4G2L8g2)9J5c8X3S2*7M7i4y4@1i4K6u0r3c8Y4g2U0K9#2c8b7i4K6u0r3j5X3I4G2j5W2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8V1k6#2j5$3E0f1f1q4)9J5c8X3W2F1K9X3g2U0N6q4)9J5k6h3y4Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
该外挂在游戏还未创建窗口时就已经加载完成,注入时机非常早,并且只需要加载一次驱动后便不需要依赖外部EXE即可完成注入。
该外挂会生成两份驱动(随机名且无后缀名,其中一个驱动带签名,另一个不带签名)到”我的文档”下,并且如果当前系统没有安装火绒的话,还会加载一份火绒的驱动(sysdiag.sys)
该外挂首先以正常的sc start方式加载带签名的驱动

截至发布本文时该样本所用的签名尚未吊销,该公司全名为河南忆之东科技有限公司,搜索其备案域名可以发现如下信息:


根据域名和发帖内容猜测该公司有经营一些提卡售卡(卡盟)和支付相关的业务。
该驱动未加壳,但是使用了O-LLVM(8a5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6c8M7X3W2D9k6h3g2Q4x3V1k6D9L8s2k6E0i4K6u0V1L8$3u0X3N6i4y4U0j5i4c8G2M7W2!0q4c8W2!0n7b7#2)9^5b7$3S2@1N6s2m8K6i4K6y4m8i4K6u0r3i4K6u0r3j5X3I4G2k6#2)9J5k6h3S2A6M7#2)9J5k6h3y4S2N6q4)9J5c8X3q4Q4x3V1k6$3M7#2)9#2k6X3!0T1k6Y4g2K6j5$3q4@1K9h3!0F1i4K6u0W2j5$3q4@1i4@1g2r3i4@1u0o6i4K6R3&6i4@1f1%4i4@1u0o6i4K6V1$3i4@1f1^5i4@1q4r3i4K6V1I4i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1#2i4K6W2n7i4@1p5H3i4@1f1$3i4@1q4p5i4@1p5@1i4@1f1@1i4@1u0o6i4K6W2m8i4@1f1#2i4K6W2o6i4@1p5^5i4@1f1$3i4@1u0m8i4K6V1H3i4@1f1%4i4@1p5H3i4K6R3I4i4@1f1&6i4K6R3%4i4K6S2o6i4@1f1$3i4K6S2r3i4K6V1J5i4@1f1#2i4K6R3#2i4@1p5#2i4@1f1#2i4@1u0q4i4K6R3^5i4@1f1#2i4@1p5@1i4K6W2m8i4@1f1$3i4K6V1%4i4@1p5H3i4@1f1%4i4K6V1@1i4@1p5^5i4@1f1#2i4K6R3^5i4K6R3$3i4@1f1$3i4K6V1@1i4@1q4r3i4@1f1K6i4K6R3H3i4K6R3J5
InitAll上来会碰到很多OLLVM插入的无用分支,我们手动忽略
往下继续分析,碰到第一个样本行为是动态禁用PatchGuard
其中win7PG第一段是手动加载ntos内核并使用特征码搜索一些PachGuard的东西
大致就是搜索到PatchGuard的加密context并解密,然后修改其中的关键函数如ExQueueWorkItem为空函数,然后再加密回去。相关的代码如下,这里不细讲。
然后是禁用win10的PatchGuard:
基本就是抄的ab7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6C8K9h3I4D9N6Y4S2C8i4K6u0r3c8r3W2K6j5h3u0D9k6g2N6A6L8U0p5H3f1r3q4@1j5$3S2Y4N6h3q4J5k6q4m8G2j5#2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4!0n7c8W2)9&6z5g2!0q4z5g2)9^5y4#2)9^5b7#2!0q4y4q4!0n7z5g2)9&6c8W2!0q4y4q4!0n7z5q4)9^5c8q4!0q4y4#2!0n7b7W2)9^5y4W2!0q4z5q4!0m8c8g2!0n7x3W2!0q4y4q4!0n7b7g2)9^5y4W2!0q4x3#2)9^5x3q4)9^5x3R3`.`.
需要注意的是他只处理了pool内存中的pgcontext,没有处理MmAllocateIndependentPages分配的内存,可能有几率导致蓝屏。
然后接下来该样本以手动map方式加载自身sys:
核心在于调用MmCreateSection和MmMapViewInSystemSpace,将一片可读可写可执行的虚拟内存映射到驱动所在的地址空间附近,效果类似于在ring3使用CreateFileMapping+MapViewOfFile映射一片内存,然后该样本自己完成节表的重定位、修复导入表等工作,最终在常规驱动所在的地址空间中得到一片可读可写可执行的内存,里面是手动加载的新的样本驱动,用PsLoadedModuleList链表无法枚举到,并且没有驱动对象。
手动加载的新驱动会劫持Null设备的fastio接口,让其跟R3程序通信。
特征码为0F B6 D0 48 8B BC 0B 28 04 00 00,在火绒的sysdiag.sys驱动中可以直接搜索到
跳板的模板如下:
跳板2:
FFFFF88003446FC0即是回调地址,可以看到回调确实处于常规驱动所在的空间附近:
回调地址由这里填充:
至此初始化全部完成,可以启动游戏。
游戏启动阶段,系统调用火绒的镜像回调时就会进入该样本的镜像回调。回调行为如下:
注入原理基本类似于火绒早期注入
(eacK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8W2k6g2)9J5k6h3y4G2L8g2)9J5c8X3S2*7M7i4y4@1i4K6u0r3c8Y4g2U0K9#2c8b7i4K6u0r3j5X3I4G2j5W2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8V1k6#2j5$3E0f1f1q4)9J5c8X3W2F1K9X3g2U0N6q4)9J5k6h3x3`. 和 73aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3P5h3W2X3K9g2)9J5c8Y4m8Q4x3V1j5$3x3K6R3&6x3U0f1I4i4K6u0W2K9s2c8E0L8q4!0q4c8W2!0n7b7#2)9^5z5b7`.`.
0、
使用OLLVM编译驱动加入很多混淆代码和无用分支干扰分析。
1、 利用MmCreateSection+MmMapViewInSystemSpace将自己映射到驱动空间,而不用使用pool内存,防止自己被Battleye扫描pool内存扫到。
2、 劫持null设备的fastio派遣函数与R3程序通信。
3、 劫持火绒镜像回调,获得早期注入时机。
4、 禁用PatchGuard,不过似乎在该样本中没有意义(不需要)。
0x02 分析
DriverEntry如下,没有什么特别的,核心功能在InitAll中
InitAll上来会碰到很多OLLVM插入的无用分支,我们手动忽略

往下继续分析,碰到第一个样本行为是动态禁用PatchGuard
其中win7和win10分别用了两种方式
其中win7PG第一段是手动加载ntos内核并使用特征码搜索一些PachGuard的东西

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-7-28 11:56
被hzqst编辑
,原因: