[原创]过所有主流杀软查杀的“免杀壳”编写揭秘
目 录
1 序
2 基本原理
2.1 前置知识
2.2 免杀方法
3 免杀壳开发(BY: AYZRXX)
3.1 免杀壳核心思想-伪装
3.2 免杀壳的编写框架说明
3.3 加壳后程序的执行流程图
3.4 写壳的注意事项
4 主要技术
4.1 壳代码纯SHELLCODE开发
4.2 API字符串隐藏
4.3 SHELLCODE传参方式
4.4 SHELLCODE动态获取外部参数
4.5 简单图片隐写技术(最大化的压缩体积)
4.6 入口点模糊技术
4.7 反沙箱分析
4.8 内存加载PE&支持壳上壳
4.9 兼容性较好的修复IAT表方法
4.10 代码混淆
5 总结
6 参考资料
1 序
市面上常见的压缩壳(UPX)、VM壳(VMP)已经非常完善,笔者认为重写这类壳没有太大的实用价值,不如有限的时间投入到更有价值的地方。便萌发了编写一款 FUD 免杀壳的念头。还有笔者没有反病毒引擎开发经验,对反病毒引擎的检测方法都是通过查阅相关资料、实践分析后猜测得出,无法保证真实性。描述有误的请大家在评论区指出。
写壳目标:
1、"FUD"。“FUD” 代表恶意软件完全不可被检测到”的意思。
2、希望通过攻击者的角度来研究病毒查杀技术。
2 基本原理
2.1 前置知识
由于编写该壳需要的前置知识较多,如果一一摊开解读每个知识点,就需要写一系列文章解释。因为笔者时间比较紧张的原因,此篇文章写得比较粗犷和偏方法论。想深入学习的同学可以论坛查找前辈们写的优秀文章,文章尾部也给了一些参考资料。
基础知识:
1、编程语言:C/C++、ASM、Shellcode编程;
2、PE相关:熟悉PE结构(PE头、区段、IAT表、重定位表);
3、其他: PE加载原理。
2.2 免杀方法
? 针对传统的特征码匹配引擎、启发式引擎,常用的免杀方式如下:
? 特征码免杀法:最基本的免杀技术,不解释
? 通用免杀法:替换资源、增加签名、加冷门壳、加多重壳
? 源码免杀法:当前主流免杀技术,需要有源代码才能操作。通过修改病毒的特征字符串、动态API调用、修改编译环境、套程序外壳(MFC、SDK、QT)等
? 输入表(IAT)免杀法:启发式引擎会扫描目标程序的输入表中是否包含指定的函数特征序列(函数调用特征码)。
解决方案:(本段摘自未知作者)
1、 输入表函数移位法:输入这是最早也是比较简单的输人表免杀方法了,虽然效果已经不像当年那么好了,但却是学习免杀过程必须要掌握的基础知识。我们使用C32打开一个EXE文件,找到输入表段,找到我们定位出的特征输入表,比如ShellExecuteA就是,我们将其使用OO填充,然后在附近找到一片空白区域,将刚才找到的代码再粘贴到空白区域中,并记下新函数的地址,ShellExecuteA字符串最前面的那个“S”的地址减2,即00078925,这样就实现了转移,但是要想让程序知道我们转移的函数,我们还得告诉输入表,刚才那个地址是文件偏移地址,但不是内存地址,我们需要利用OC计算出新的输入表函数ShellExecuteA的内存位置,并在LoadPE中修改才行。
2、 输入表函数对调法:这个方法的原理就是将输入表函数名长度相同的函数在C32中进行对调,只有长度一样才不会出错,然后在LoadPE中做相应的修改即可。比如被查杀的函数是OpenFileA,存在于A.dll文件中,我们在b.dll中找到了一个GetATimeA函数,这两个函数名称长度一样,我们在C32中做了静态对换之后,还要将它们的RVA进行对换,操作很简单的,我就不演示了。
3、 手工重建输入表:关于输入表的重建,我想大家都非常熟悉了吧,这算是比较复杂的一种方法了,不过免杀效果非常好,这也是必须要掌握的方法哦!这个方法其实就是添加一个新区段,再把原来的输入表移到我们新建的区段上,重建主要是针对杀毒软件定位到大片输入表函数。
4、 输入表隐藏法:将输入表加密隐藏,然后内存解密修复输入表。属于保护壳常用的技术。
? 代码混淆、加花:通过对特征代码进行膨胀、乱序来干扰启发式引擎的分析,以及提升人工提取特征码的难度。
? 入口点模糊技术:参考"主要技术"目录下的"入口点模糊技术"
? 内存加载执行PE文件:壳的基本技术,论坛资料很多。
? 机器学习引擎(以360QVM为例),绕过方式如下:
模拟正常程序的PE结构(该免杀壳方案能有效针对该引擎,或许还能污染机器学习引擎的分析结果)
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
