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 参考资料
市面上常见的压缩壳(UPX)、VM壳(VMP)已经非常完善,笔者认为重写这类壳没有太大的实用价值,不如有限的时间投入到更有价值的地方。便萌发了编写一款
FUD
免杀壳的念头。还有笔者没有反病毒引擎开发经验,对反病毒引擎的检测方法都是通过查阅相关资料、实践分析后猜测得出,无法保证真实性。描述有误的请大家在评论区指出。
写壳目标:
1、"FUD"。“FUD” 代表恶意软件完全不可被检测到”的意思。
2、希望通过攻击者的角度来研究病毒查杀技术。
由于编写该壳需要的前置知识较多,如果一一摊开解读每个知识点,就需要写一系列文章解释。因为笔者时间比较紧张的原因,此篇文章写得比较粗犷和偏方法论。想深入学习的同学可以论坛查找前辈们写的优秀文章,文章尾部也给了一些参考资料。
基础知识:
1、编程语言:C/C++、ASM、Shellcode编程;
2、PE相关:熟悉PE结构(PE头、区段、IAT表、重定位表);
3、其他: PE加载原理。
Ø 针对传统的特征码匹配引擎、启发式引擎,常用的免杀方式如下:
² 特征码免杀法:最基本的免杀技术,不解释
² 通用免杀法:替换资源、增加签名、加冷门壳、加多重壳
² 源码免杀法:当前主流免杀技术,需要有源代码才能操作。通过修改病毒的特征字符串、动态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结构(该免杀壳方案能有效针对该引擎,或许还能污染机器学习引擎的分析结果)
HEUR/Malware.QVM06.Gen 一般情况下加数字签名可过
HEUR/Malware.QVM07.Gen 一般情况下换资源
HEUR/Malware.QVM13.Gen 加壳了
HEUR/Malware.QVM19.Gen 杀壳
HEUR/Malware.QVM20.Gen 改变了入口点
HEUR/Malware.QVM27.Gen 输入表
HEUR/Malware.QVM18.Gen 加花
HEUR/Malware.QVM05.Gen 加资源,改入口点
简介:所谓“沙箱”安全技术,是指以计算机系统为基础对恶意软件的行为与特征进行分析并最终检测出恶意代码的方案。
解决方案:
1、通过检测沙箱(虚拟机)与物理机的差异化(参考:https://bbs.pediy.com/thread-225735.htm),检测到沙箱(虚拟机)则不执行恶意代码。
2、延时180+秒(效果比较好)加载恶意代码,沙箱(虚拟机)的检测结束后无法探测到恶意行为。笔者比较推崇此方法,因为此方法针对的是所有反病毒厂商的沙箱(虚拟机)检测。
3、挖掘开机启动程序的代码执行漏洞,配合白加黑技术来执行敏感行为。
Ø 主动防御:
简介:主动防御是基于程序行为自主分析判断的实时防护技术,不以病毒的特征码作为判断病毒的依据,而是从最原始的病毒定义出发,直接将程序的行为作为判断病毒的依据。
360主动防御模块经过做黑灰兄弟们的不懈努力,已经非常完善了,绝大部分常规、非常规的行为绕过方式均已被拦截,并弹出一个默认阻止的小框框。
1、继续挖掘非常规方法绕过主防的拦截,主防未监控到的区域。
2、白程序(包含在杀软白名单库中的程序)加黑程序方式来执行高危行为,写启动项、键盘记录等。(不过要注意的是360白程序判定逻辑,灰程序加载的白程序 = 灰程序,因此需要绕过主防的程序执行链监控)
经过10多年的发展,反病毒引擎已经在误报&查毒粒度之间取了一个比较好的平衡,常规的免杀技术(特征码免杀、源码免杀)处理成本越来越高。不过反病毒引擎天然存在某些"缺陷",例如正常软件会加商业保护壳,导致会受到商业壳的制约,无法将所有壳标记为病毒。
由于内存执行"被加壳程序"是壳的基础行为,而内存执行PE这个"壳的基础行为"可以很好的将"被加壳程序"的特征码隐藏起来。因此编写一款无特征码壳是一个非常好的反杀软查杀(特征码、启发式)的方案。
1. 模拟正常PE程序结构, 模拟正常PE程序结构, 模拟正常PE程序结构
2. 特征代码最小化,并且被查杀后可通过混淆引擎来混淆壳代码,达到快速变种、快速免杀的效果。
3. 笔者不建议进行任何可能提高程序熵值的操作,尽可能将壳程序的PE格式、数据结构、代码执行顺序与正常程序保持一致。
这个免杀壳的代码主要分为三部分:
加壳器:这部分代码用来将被加壳程序、傀儡程序、壳代码拼装处理,组合生成一个免杀的PE文件。
CodeLoader(壳代码):这部分代码用来反杀毒引擎、内存加载执行PeLoader,需要编译为Shellcode代码。
PeLoader(壳代码):这部分代码用来内存执行Shelled(被加壳程序),需要编译为Shellcode代码。
² 关键词解释
Ø Shelled:被加壳程序
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-7-24 19:05
被AYZRxx编辑
,原因: