小议“非法模块”与“第三方检测”的那些事儿(1)
铸矛之人,必精造盾之术。
造盾之人,必解铸矛之术。
本文略长,从(1)开始,一点点谈论那些年被人们深刻记住的各种传说中莫名奇妙的检测技术。
(1)主要内容:初级非法模块检测的方法和对抗
首先要知道非法模块的定义,一般来说,
对于模块的定义:DLL文件,PE文件,可执行的代码块
对于非法模块的定义:不符合某种正面规则的模块,或者符合某种负面规则的模块。
对于非法模块的检测,
初级的检测使用先枚举后检测的方法,所以第一步最重要的是枚举!
常用枚举法: 使用API枚举和通过PEB枚举。
API枚举常见的API:
1.CreateToolhelp32Snapshot Module32First Module32Next
2.EnumProcessModules GetModuleFileNameEx
3.RtlQueryProcessDebugInformation RtlCreateQueryDebugBuffer
PEB枚举多数基于PEB结构,这里就不提了,
因为API枚举基本都是依靠PEB实现的,所以只要对PEB断链就可以了。
于是有了新的枚举方法,非常规枚举和暴力枚举!
暴力枚举通常使用Api:ZwQueryVirtualMemory来实现。
当然也有暴力搜索PE头结构,
对于使用ZwQuery类api枚举的处理有两种
hook api
内核修改VAD结构(具体参考黑月教主的文章,这里就不重复了)
对于PE结构暴利搜索的,可以采取抹去PE头的方法(非常简单,改内存属性,然后RtlZeroMemory就可以实现了)。
非常规枚举可以通过各种HashList来枚举,比如GetModuleHandle所用的_LdrpHashTable
这种枚举其实和PEB一样,只要被发现了就可以被轻易的抹除。
不过也有通过HandleTable枚举进程内所有打开的文件路径,然后判断文件类型的枚举。
至于对模块的检测,通常有几种模型
路径名称检测,过滤掉属于系统的模块,然后处理不是系统的模块。
模块hash检测,读取模块的文件内容,然后计算hash对比。
模块特征检测,对模块所在的内存进行特征扫描。
第一种检测,可以通过修改模块显示路径来绕过(如果隐藏掉了就不用担心了)。
第二种检测,可以利用驱动修改文件路径来绕过(如果隐藏掉了也不用担心了)。
第三种检测,只能依靠动态的变形或者其他躲避特征码的手段(隐藏是无效的)。
好了(1)到这里就结束了。请期待(2)吧~