文章目录
- 免杀对抗——第一百五十四天
-
- C2远控篇&C&C++&抗沙箱虚拟机&抗逆向调试&动态密钥抗分析&对抗VT云感知
-
- 前置知识
-
- 蓝队如何对文件进行分析
* 参考资料
* 参考项目
- 蓝队如何对文件进行分析
- C2远控 - 抗沙盒沙箱-机器特征&真机判断
- C2远控 - 抗逆向调试-API&调试器行为功能
-
- 前置知识
免杀对抗——第一百五十四天
C2远控篇&C&C++&抗沙箱虚拟机&抗逆向调试&动态密钥抗分析&对抗VT云感知
前置知识
蓝队如何对文件进行分析
- 蓝队人员如何对可疑文件进行分析呢,一般有三种方式:
- 杀毒软件扫描分析
- 上传威胁感知平台分析
- 人工的去逆向调试分析
- 因此我们要逃脱他们的分析,就需要去进行抗沙盒沙箱、抗逆向调试
参考资料
- https://github.com/a0rtega/pafish/
- https://github.com/Arvanaghi/CheckPlease
- https://github.com/wanttobeno/AntiDebuggers
- https://github.com/LordNoteworthy/al-khaser
- https://github.com/ZanderChang/anti-sandbox
- https://github.com/nek0YanSu/CheckVM-Sandbox
- https://github.com/sunn1day/malware-anti-techniques
- https://bbs.kanxue.com/thread-225740.htm
- https://anti-debug.checkpoint.com/techniques/debug-flags.html
参考项目
- https://github.com/ZanderChang/anti-sandbox
- 这个项目比较老了,主要就是看如何去区别真机和虚拟机,可以学习一下它的思路
C2远控 - 抗沙盒沙箱-机器特征&真机判断
- 蓝队常用的分析平台像微步、VT、哈勃等等,基本都具有静态分析、动态分析、行为检测等手段去调试上传的文件:

- 有时候你有一些反调试、反沙箱的行为,它也会检测出来有这种可疑的行为:

- 上面那个项目的这样一些行为可能就直接被检测出来了,我们就需要发挥自己的想象,比如就是之前讲过的三种思路:
- 让程序一开始休眠一段时间再运行恶意代码 => 使用垃圾执行代码浪费时间
- 检测目录文件是否正确 => 判断真机常用软件或者自己创建的文件是否存在
- 检测目标特征是否正确 => 判断真机目标IP地址或计算机名,用户名等特征
- 总之一句话,如何让这个沙箱在调试的时候无法运行我们的恶意代码,但是满足一定条件之后这个代码就执行了
- 比如让程序休眠一段时间,简单代码如下:
1#include <stdio.h> 2 3void loader() { 4 // 加载恶意代码 5} 6 7int main() { 8 // 延时操作 9 for (int i = 0; i < 10000; i++) { 10 for (int j = 0; j < 100; j++) { 11 printf("%d", i + j); 12 } 13 } 14 15 // 执行恶意代码 16 loader(); 17 return 0; 18} 19
- 这个代码之前已经演示过,它会标记为未知应用,不会报毒,动态调试也没有任何异常,所以起到了抗沙盒的一个作用
- 再比如我们将ShellCode分离出来放到文件当中,然后判断如果有这个文件就运行恶意代码,没有就运行正常代码:
1#include <fstream> 2#include <iostream> 3#include <Windows.h> 4#include<stdio.h> 5#include <string> 6using namespace std; 7 8int main() { 9 // 1. 创建ifstream对象并打开文件 10 ifstream file(".\\1.txt"); 11 12 // 2. 检查文件是否成功打开 13 if (!file.is_open()) { 14 std::cerr << "错误:无法打开文件!" << std::endl; 15 return 1; 16 } 17 18 // 3. 逐行读取 19 std::string line; 20 while (std::getline(file, line)) { 21 std::cout << line << std::endl; 22 } 23 24 // 4. 检查是否因错误终止 25 if (file.bad()) { 26 std::cerr << "错误:读取文件时发生错误!" << std::endl; 27 } 28 29 // 5. 关闭文件(也可自动关闭) 30 file.close(); 31 32 // 恶意代码写在这 33 ... 34 return 0; 35} 36
- 这样一混淆之后,直接0/28检出率,并且也没有任何异常行为,但是他还是定性为未知:

- 可能是它对这个程序进行了逆向调试,对某些操作或者字段有疑问;也有可能是这里我们没有加签名,所以它还是觉得这个程序不太可信,所以定性为未知:

C2远控 - 抗逆向调试-API&调试器行为功能
- 上面是抗沙箱的思路演示,有些杀毒软件和云平台可能也会对程序进行逆向调试来对其定性,所以我们也需要有这种抗逆向的手段
- 参考文章:
- 对于反调试,我们一般用到的就是几种思路:API反调试、PEB反调试、TLS反调试、时间戳反调试等等
- 比如API反调试中,Windows内部提供了一些用于检测调试器的API:
1BOOL IsDebuggerPresent(); 2BOOL CheckRemoteDebuggerPresent(HANDLE hProcess, PBOOL pbDebuggerPresent); 3...... 4
- 那我们在上面那个“未知“的代码中加上这些抗调试的代码,再看看有没有什么区别:
1#include <fstream> 2#include <iostream> 3#include <Windows.h> 4#include<stdio.h> 5#include <string> 6using namespace std; 7 8int main() { 9 // 加入反调试代码 10 if (IsDebuggerPresent()) { 11 cout << "正在被调试!" << endl; 12 return 1; 13 } 14 15 // 1. 创建ifstream对象并打开文件 16 ifstream file(".\\1.txt"); 17 18 // 2. 检查文件是否成功打开 19 if (!file.is_open()) { 20 std::cerr << "错误:无法打开文件!" << std::endl; 21 return 1; 22 } 23 24 // 3. 逐行读取 25 std::string line; 26 while (std::getline(file, line)) { 27 std::cout << line << std::endl; 28 } 29 30 // 4. 检查是否因错误终止 31 if (file.bad()) { 32 std::cerr << "错误:读取文件时发生错误!" << std::endl; 33 } 34 35 // 5. 关闭文件(也可自动关闭) 36 file.close(); 37 38 // 恶意代码写在这 39 ... 40 return 0; 41} 42
- 我们加了这个代码然后再上传检测,可以很明显的看到它就没有上面的静态分析了:

- 本节课讲的这两个技术都是针对威胁感知平台、以及蓝队分析人员的,对实实在在的免杀作用比较小
《免杀对抗——C2远控篇&C&C++&抗沙箱虚拟机&抗逆向调试&动态密钥抗分析&对抗VT云感知》 是转载文章,点击查看原文。