反沙箱 反虚拟机的一些笔记
1.判断是否有虚拟机的文件
#include <Windows.h>
#include "shlwapi.h"
#pragma comment(lib, "shlwapi.lib")int main(int argc, CHAR* argv[])
{if (PathIsDirectoryA("C:\\Program Files\\VMware")){ MessageBox(NULL, TEXT("YES"), TEXT(""), MB_OK);}else{MessageBox(NULL, TEXT("NO"), TEXT(""), MB_OK);}return 0;
}
2.通常虚拟机中有一个进程叫做 因此判断是否存在该进程
#include <Windows.h>
#include "shlwapi.h"
#include <tlhelp32.h>
#pragma comment(lib, "shlwapi.lib")int main(int argc, CHAR* argv[])
{DWORD hlistmodules;HANDLE hsnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hsnapshot == INVALID_HANDLE_VALUE) {return false;}//该结构体用于存储一个进程信息PROCESSENTRY32 pe32;pe32.dwSize = sizeof(pe32);if (Process32First(hsnapshot, &pe32)){do{if (StrCmpW(pe32.szExeFile, L"vmtoolsd.exe") == 0){MessageBox(NULL, TEXT("YES"), TEXT(""), MB_OK);}} while (Process32Next(hsnapshot, &pe32));}CloseHandle(hsnapshot);return 0;
}
3.判断该进程的父进程是否是explore,因为当我们点击的时候父进程应该是explore.exe,如果不是的可能就是沙箱在运行(报毒!)
当在vs上运行的时候是不一样的
#include <Windows.h>
#include "shlwapi.h"
#include <tlhelp32.h>
#include <stdio.h>
#pragma comment(lib, "shlwapi.lib")int main(int argc, CHAR* argv[])
{DWORD hlistmodules;HANDLE hsnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hsnapshot == INVALID_HANDLE_VALUE) {return false;}DWORD currentProcessId = GetCurrentProcessId();PROCESSENTRY32 pe32;pe32.dwSize = sizeof(pe32);int parentId = 0;int explorerId = 1;if (Process32First(hsnapshot, &pe32)){do{//获取到当前遍历的进程的ID判断是否与当前exe进程是否相同,如果是的话则代表找到了。if (pe32.th32ProcessID == currentProcessId){//获取父进程的IDparentId = pe32.th32ParentProcessID;printf("parentId:%d ", parentId);}//获取explorer的IDif (StrCmpW(pe32.szExeFile, L"explorer.exe") == 0){explorerId = pe32.th32ProcessID;printf("explorerId:%d ", explorerId);}} while (Process32Next(hsnapshot, &pe32));}CloseHandle(hsnapshot);if (explorerId == parentId){//执行shellcodeMessageBox(NULL, TEXT("the same id"), TEXT(""), MB_OK);}else {exit;}return 0;
}
直接点击的话
4.沙箱中的进程数量不会太多与物理机不同 通过这种方式 来判断是不是沙箱
HANDLE snapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(INVALID_HANDLE_VALUE==snapShot){return; }PROCESSENTRY32 pe = { sizeof(pe) };int num=0;
for(BOOL ret=Process32First(snapShot,&pe);ret;ret=Process32Next(snapShot,&pe))
{num++;
}
if(num<=50)
{exit(1);
}
5.60秒之后运行
waitforsignleobject
sleep_for
ntdelayexcution
void delay(int seconds) {for (int i = 0; i < seconds; i++) {for (int j = 0; j < 100000000; j++) {// 空循环,增加延时时间}}
}
内存大于多少G运行
6.判断是否有一些物理接口/USB接口判断是否为虚拟机
7.判断沙箱的内存大小20G..
8.判断内存是否大于4g
9.判断当前exe是否名字被修改
10.申请500M的内存填充垃圾字符,绕过扫描,延长扫描的时间
11.钓鱼环境下用户模拟的角度:鼠标是否移动、是否有微信、钉钉
12.识别分析机、判断是否有ida.exe x64dbg.exe olldbg.exe
13.创建互斥体,确保一定时间只有一个进程在访问互斥资源
14.上木马之前,判断当前用户名,在loader中再判断是否与这个用户名相同不同则代表在另外一台主机上(getusername==whoami)
15.在白加黑的时候,沙箱运行dll的进程是rundll32.exe,就不是目标的白程序
16.判断操作系统语言是不是中文(不是中文则是国外的),国外一律是沙箱、或者判断时区