Loading... > 自己在网上查阅的免杀相关的资料,其实自己对这部分也不是很了解。 --- ## 静态对抗 - 代码混淆,如llvm。 - 添加花指令。 - 加壳加密,使用虚拟机等。 - 修改特征码,配合其他方法,提高静态检测难度。 - 只对关键信息进行加密,减少程序的整体的信息熵。 ## 动态对抗 - 恶意进程是否被调试 反调试、凡虚拟机检测 - 加载虚拟dll库 如果我们尝试加载虚拟dll,正常情况下,返回值是NULL,一些杀软的动态分析机制就会利用这个返回值来进一步观察程序的运行情况。以便做出更准确的判断。 - 内核数检测 检查系统的处理器核心数。因为杀软产品不会占用太多主机系统的资源。大部分沙盒系统只会分配1个处理器核心。 - 大内存分配 当程序内存在运行时增大到一定程度时,就会触发杀软结束扫描,以免在一个文件上消耗太多时间。 ```c #define TOO_MUCH_MEM 100000000 int main() { char * memdmp = NULL; memdmp = (char *) malloc(TOO_MUCH_MEM); if(memdmp!=NULL) { memset(memdmp,00, TOO_MUCH_MEM); free(memdmp); decryptCodeSection(); startShellCode(); } return 0; } ``` - 尝试打开不存在的URL WanaCry利用ms17-010,为什么不能绕过沙箱:一种可能是蠕虫作者有丰富的病毒检测对抗经验,目前的沙箱分为在线检测和离线检测两种,要做"离线病毒分析"会对沙箱环境做很多处理,在离线的情况下为了保证病毒的网络连通,可能会加入Fake DNS Responses(欺骗DNS响应)的技术,作者使用这个开关来识别沙箱环境是否有网络欺骗行为,保护蠕虫不被沙箱进一步的分析检测发现。部分蜜罐环境会接管样本的网络流量,如HTTP访问都返回成功,因此通过一个不存在的域名来校验是否运行在蜜罐环境下) - 已知受害者 如果受害者已知,则可以使用针对名字的行为,比如在用户目录下创建并写文件,反病毒软件通常不会去创建和写入一个路径中的文件。??? - NUMA 非均匀内存访问Non Uniform Memory Access,是微软提供的一种方法来进行多进程系统内存管理的方法。 这些非常用的api在pc上通常能运行成功,但是在沙箱里通常不行。 ```c int main( void ) { LPVOID mem = NULL; mem = VirtualAllocExNuma(GetCurrentProcess(), NULL, 1000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE,0); if (mem != NULL) { decryptCodeSection(); startShellCode(); } return 0; } ``` - FLS 纤程局部存储Fiber Local Storage,用来操作和纤程有关的数据,纤程是线程执行过程中运行的基本单元,在某些反病毒软件中,FlsAlloc 函数总是返回FLS_OUT_OF_INDEXES。 ```c int main( void ) { DWORD result = FlsAlloc(NULL); if (result != FLS_OUT_OF_INDEXES) { decryptCodeSection(); startShellCode(); } return 0; } ``` - 互斥触发WinExec: 创建一个条件来判断互斥对象是否已经存在于系统上。如果“CreateMutex”函数没有把已经存在的错误进行返回,我们将再次执行恶意程序,因为大部分杀软产品不会让正在分析的程序启动新进程和访问沙盒以外的文件。当出现错误运行时,恶意软件就可以开始执行解密了。 ```c int main() { HANDLE mutex; mutex = CreateMutex(NULL, TRUE, "muuuu"); if (GetLastError() == ERROR_ALREADY_EXISTS) { decryptCodeSection(); startShellCode(); } else { startExe("test.exe"); Sleep(100); } return 0; } ``` - 重写api 完全重写系统API功能(通过逆向),实现自己的对应功能API,对于ring3的行为拦截非常有效。比如实现MoveFile等。 - 检测程序名 因为代码是被模拟的,不是直接执行的,这种方法在[DeepSec](http://blog.deepsec.net/?p=1613)会议中被提出。 ```c int main(int argc, char * argv[]) { if (strstr(argv[0], "test.exe") >0) { decryptCodeSection(); startShellCode(); } return 0; } ``` - 多线程 不管是对杀软产品还是对免杀程序来说,逆向分析多线程的PE文件都非常困难。多线程的方法不单单适用于 shellcode,还 可以用在上述所有的方法中。我们可以在执行 shellcode 的同时继续执行 “AV Detect” 功能 利用上述代码可以创建新线程并运行shellcode,只是在创建线程后有一个无限whlie循环来绕过杀软检测,可以说多线程方法是一种非常完美的免杀方法,既绕过了沙盒系统又绕过了动态分析,同时还能躲避启发式引擎的检测。 - 伪造数字签名 2018年5月8日,火绒实验室截获新型后门病毒。该病毒破坏性极强,入侵用户电脑后会执行多种病毒模块,以窃取用户比特币、门罗币等主流虚拟货币的数据信息,同时利用用户电脑疯狂挖矿(生产“门罗币”),并且还会通过远程操控伺机对用户进行勒索。 另外,病毒团伙非常狡猾,不仅使用了隐蔽性很强的“无文件加载”技术,令普通用户难以察觉,而且还伪造了亚马逊、微软以及火绒的数字签名,成功躲过了国内绝大多数安全软件的查杀。 - 利用代码空闲空间 几乎所有编译的二进制文件都有代码洞,我们可以利用这些即有的代码洞实现后门植入。由于这种方法利用的是现有的空间,即便在植入后门以后,整个PE文件的大也不会改变。借助于Cminer工具,我们可以很容易找到这些PE二进制文件的所有代码洞,例如,通过命令./Cminer putty.exe 300,我们可以找到putty.exe中所有长度大于300字节的代码洞, - 利用用户交互 绕过沙盒和动态分析最重要一点就是要延迟shellcode的运行时间和避免shellcode触发沙箱的检测机制。但是植入后门时,我们是没有这么多的空间来在PE文件中添加这些免杀代码的。 由于使用汇编语言设计防检测机制所耗费的成本过大,所以我们使用了隐藏在用户交互下这个方法,这个方法可以很方便的实现后门免杀的功能。由于该方法在重定向时,必须要求用户亲自开启流程的重定向才能激活后门功能。所以如果这个方法可以正确实现,那免杀将100%的实现,且这种办法还不会增加后门代码的大小。 ## 参考资料 [免杀艺术1: 史上最全的免杀方法汇总](https://www.4hou.com/technology/3853.html) [免杀艺术2:PE文件后门的植入](https://www.4hou.com/technology/3882.html) [免杀艺术3:史上最全的汇编Shellcode的技巧](https://www.4hou.com/technology/3893.html) [WanaCrypt0r勒索蠕虫完全分析报告](https://www.anquanke.com/post/id/86092) [伪造微软等企业签名的恶性病毒入侵用户电脑后偷比特币](https://www.4hou.com/system/11397.html) [NUMA Support](https://docs.microsoft.com/zh-cn/windows/win32/procthread/numa-support) [BypassAVDynamics](https://www.cs.virginia.edu/~cr4bd/4630/S2017/BypassAVDynamics.pdf) ``` ``` Last modification:January 16th, 2021 at 01:13 pm © 允许规范转载 Support 确定不打赏一下支持博主吗 ×Close Appreciate the author Sweeping payments Pay by AliPay