该样本于去年6月份绝地求生wg泛滥时搜集到,根据pdb路径(ReadCFx64Win7ReleaseReadCF.pdb)推测该样本至少2016年PUBG没火时就已经出现而且当时是针对CF写的,直到2018年5月居然还有人把该样本用在自己的绝地求生wg上,曾经用过该样本的wg多达几十款(真的)。
涉及各种原因这里不细说,我们只谈技术,有兴趣的读者可以交流交流,私信(游戏辅助):
先从DriverEntry开始
先从ntos导出了一系列API,存放到g_Context结构中,这里g_Context被优化成了一个个独立的全局变量,实际上作者写的时候是用类似g_Context.PsGetCurrentProcess = MmGetSystemRoutineAddress( 这样的形式
然后是InitAll,先搜索 mouseservicecallback 回调函数
先找到mouhid / i8042和mouclass的驱动对象然后遍历mouhid / i8042 的设备栈
在其设备扩展中找到 servicecallback(特征是地址在DriverStart 到DriverStart+DriverSize 指定的驱动Image区域内并且可以访问)
存放进 g_Context.MouseServiceCallback 中,将来用于模拟鼠标操作
↓ pContext = MakeContext(RtlCopyMemory, 0i64, 1);的作用是复制当前驱动的g_Context结构到一片pool内存中,g_Context的大小是0x1E8。
因为该读写驱动加载完即释放,所以需要把本驱动Image空间中的 g_Context结构放到不会被释放的pool内存中。
WHAT = AllocCode(&unk_140005140, 0x400u);
↑这个WHAT变量也是分配到一块大小0x400的pool内存中,看起来是一个类似key或者key table的东西ÿ