前言
研究过免杀的朋友们一定会碰到过自己的🐎今天还能用,明天就被秒的情况。这种情况大多数是被上传到沙箱然后被沙箱检测和分析发现是🐎,进而记录特征让咱们花好几天写的🐎直接废了。为了提高🐎的存活周期,咱们就需要抗沙箱这门技术。
未加抗沙箱
首先,作为演示我先写一个pingdnslog的程序,然后咱们加上一些抗沙箱手段来展示效果。
代码
#include <windows.h>
#include <stdio.h>int main()
{system("ping e22799d2.dnslog.biz");
}
这里没加任何反沙箱手段,程序运行。
检测文件夹
在vm虚拟机上安装了“vmware tools”就会生成对应名称的文件夹,路径:C:\Program Files\VMware\VMware Tools,这样就可以在代码上加上一个判断。同理我们也可以加个同目录检测,检测当前目录下有没有某一个文件夹或者文件,如若没有就不运行程序。
代码
if (PathIsDirectory(L"C:\\Program Files\\VMware\\VMware Tools") == 0){return flase;}else{return TRUE;}
}
这里检测到是沙箱便不在运行程序了。
检测进程
虚拟机运行会有vmtoolsd.exe这个进程,下面代码是检测进程中是否有vmtoolsd.exe。同理我们可以检测别的进程比如检测某个软件是否在运行,如果没运行程序就不运行。
代码
PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);if (hProcessSnap == INVALID_HANDLE_VALUE){return false;}while (Process32Next(hProcessSnap,&pe32)){if (wcscmp(pe32.szExeFile,L"vmtoolsd.exe") == 0){return true;}}CloseHandle(hProcessSnap);return false;
检测mac地址
由于vmware默认的mac地址是00开头的所以我们可以利用这个来检测是不是在虚拟机上运行,来判断是否运行程序。
代码
void GetMac(byte* mac)
{PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();unsigned long stSize = sizeof(IP_ADAPTER_INFO);int nRet = GetAdaptersInfo(pIpAdapterInfo, &stSize);if (nRet == ERROR_BUFFER_OVERFLOW){delete pIpAdapterInfo;pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];nRet = GetAdaptersInfo(pIpAdapterInfo, &stSize);}if (nRet == ERROR_SUCCESS){while (pIpAdapterInfo){memcpy(mac, pIpAdapterInfo->Address, 8);break;}}if (pIpAdapterInfo){delete pIpAdapterInfo;}
}BOOL VM()
{byte mac[8] = { 0 };GetMac(mac);if (mac[0] == 0x00 && mac[1] == 0x05 && mac[2] == 0x69){return TRUE;}else if (mac[0] == 0x00 && mac[1] == 0x0c && mac[2] == 0x29){return TRUE;}else if (mac[0] == 0x00 && mac[1] == 0x50 && mac[2] == 0x56){return TRUE;}else{return FALSE;}
}
检测是否开启测试模式
在看分析的时候偶然发现截图里面显示系统为测试模式(不清楚是什么的建议百度一下windows测试模式这里不做赘述),便想通过检测是否是测试模式来进行抗沙箱。
代码
HKEY hKey;
DWORD testModeValue;LPCWSTR regPath = L"SYSTEM\\CurrentControlSet\\Control\\CI\\Testing";
LPCWSTR regValue = L"TestSigning";if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, regPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {DWORD dwType;DWORD dwSize = sizeof(DWORD);if (RegQueryValueExW(hKey, regValue, NULL, &dwType, (LPBYTE)&testModeValue, &dwSize) == ERROR_SUCCESS) {RegCloseKey(hKey);if (testModeValue == 1) {return false;}elsereturn true;}RegCloseKey(hKey);
}
````![](https://img2024.cnblogs.com/blog/3330979/202501/3330979-20250119223559538-1949344240.png)#原文🔗
```
https://mp.weixin.qq.com/s?__biz=MzkzODM0OTE4OA==&mid=2247484411&idx=1&sn=d1c8f115f5b9843b8482cc1ce9e5d9af&chksm=c280c410f5f74d0687dd2ab436d04d346f75439b4f965e4b09886e0ae2a5757b2fe32f423f1b&cur_album_id=3440585169323933701&scene=189#wechat_redirect
```