注意：本篇文章仅用于学习以及笔记记录，不得用于其他违规用途。一、什么是免杀免杀，也就是病毒与反间谍的对立面，英文为Anti-AntiVirus（简写Virus AV），翻译为“反杀毒技术”。这是一种能使病毒木马免于被杀毒软件查杀的技术。==由于免杀技术涉及到很多方面，包括反汇编、逆向工程、系统漏洞等技术，难度很高，所以本篇文章内容基本上都是修改病毒、木马的内容改变特征码，从而躲避杀毒软件的查杀。==二、为什么有免杀当我们在做安全测试的过程中，经常会自己编写一些脚本或者制作一些工具，其中用到的一些命令或者代码函数的特征已经被各大杀毒软件给识别到了自己的木马病毒库中，所以我们经常需要对自己编写的脚本或者工具进行免杀。三、常见的免杀方法1、加壳 2、ShellCode混淆，加密 3、各种语言的加载器 4、powershell混淆免杀 5、分离免杀（远程加载）shellcode和加载器不写在一个文件中，远程加载等。 6、白加黑（白名单程序执行恶意样本） 7、套接字免杀 8、使用一些免杀工具 9、自己写加载器 10、自己写远控四、杀软介绍1、杀软的基本原理常见的杀毒软件对程序的划分大致分为三种：无害没有任何的可疑行为，没有任何的特征符合病毒或木马可疑存在可疑行为：操作注册表，打开powershell，修改用户，操作敏感文件等存在病毒特征符合病毒或木马杀软常用识别恶意样本的方式静态查杀，动态查杀2、静态查杀特征码杀软会通过反编译的方式查看源代码，可以看到里面的一些函数和汇编代码exe→函数→汇编（1）代码中的函数virtualalloc，rtlmovememory，ntcreatthread等主要都是windows api函数，尤其是和内存、堆、线程相关的函数，当然在python中如果存在cmd等关键词也是会被识别的。危险函数，远控关键词（msf,conbalt strike）一些关键字（shellcode）（2）shellcode的特征以msf的shellcode举例，杀毒软件最常用的就是判断一部分的代码来识别，通常汇编层级下的代码要深入识别查杀堆杀毒软件来说有一定误判的风险，所以一般的杀毒引擎都是通过shellcode中的特征码来识别。（3）文件名和MD5如果这个文件名使用了rlo翻转的话，无论是否是病毒都会直接杀，MD5值的话就是匹配样本库中的MD5值，看是否存在，这个一般都能规避掉。（4）加密（可疑）使用加密解密行为对文件有额外保护措施（5）数字签名判断当前程序的数字签名是否正常，可以使用签名伪造。3、动态查杀通常这一步都是静态分析之后做的，部分杀毒软件会有沙盒，相当于开一个虚拟机运行一下恶意样本，看一下运行效果。（1）计算机相关通常由r1或r2层挂监控的方式（类似于hook）当触发这些条件就会产生事件，例如：360会在系统的内核层对注册表和cmd进行监控，注册表的监控相对不那么严格，可以通过win32 api添加用户，通常杀软监控的有：服务、注册表、组策略、放回去、敏感程序、用户敏感操作、敏感文件夹。常见的绕过思路：替换方法，cmd用不了就用powershell（混淆，编码，加密），换函数api，或者用shellcode。（2）网络相关IP，域名，证书匹配，查找通讯的IP活域名是否之前存在攻击行为流量内容，事件特征，内容特征，结构特征。常见的绕过思路：TCP分段，内容加密，使用合法证书4、样本启动流程五、具体姿势1、加壳加壳的全称应该是可执行程序资源压缩，压缩后的程序可以直接运行。加壳的另一种常用的方式是在二进制的程序中植入一段代码，在运行的时候优先取得程序的控制权，之后再把控制权交还给原始代码，这样做的目的是隐藏程序真正的OEP（入口点，防止被破解）。大多数病毒就是基于此原理。加壳就是隐藏程序的入口文件。通过对恶意样本的加壳处理，把原本的入口函数，再封装一层，让杀软无法找到我们程序的正常入口文件，进而躲避杀软分析我们的恶意样本，进而免杀。2、什么是shellcodeshellcode为16进制的机器码，因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写，可在暂存器eip溢出后，塞入一段可以让CPU执行的shellcode机器码，让电脑可以执行攻击者的任意指令。shellcode就是能够执行命令的机器码，不是一个exe，常见的exe木马是可以脱离内存存在硬盘中的，但是shellcode不可以，他必须在内存中才可以运行。为了方便阅读，大部分的shellcode都是16进制显示给用户的。本质：二进制-16进制-汇编代码msf和cs生成的raw格式的payload就是一个二进制格式的文件。3、shellcode加载器原理shellcode加载器：简单来说，就是一个执行shellcode可执行文件。加载器就是你用编程语言写出来的那个程序，shellcode是这个程序里面的一部分，在程序中就是一段字符，不能直接运行，而加载器的作用就是让他可以运行起来，最后shellcode执行后就是简历一个stager（建立目标和攻击者之间通信的道路，cs中的beacon指的就是stager）常见加载器的主要功能1、获取shellcode2、virtualalloc函数申请内存3、将shellcode载入内存4、createthread函数创建新线程5、等待创建的线程运行结束==为什么要有加载器？==默认情况下你的shellcode就是一堆字符，无法在内存中运行，所以需要加载器帮助他放到内存中运行，这也是加载器干的活。==本来想举例子，但想了想不放出来了。==