首页
论坛
专栏
课程

[调试逆向] [系统底层] [原创]纯R3超强检测虚拟机 秒杀99%虚拟机隐藏

2019-6-10 15:34 2883

[调试逆向] [系统底层] [原创]纯R3超强检测虚拟机 秒杀99%虚拟机隐藏

2019-6-10 15:34
2883
#include <iostream>
#include <vector>
using namespace std;
typedef struct __MemRleace
{
	byte souce[256];
	int in_len;
	byte out[256];
	int out_len;


}MemRplace;



//提权
bool EnableDebugPrivilege()
{
	HANDLE hToken;
	LUID sedebugnameValue;
	TOKEN_PRIVILEGES tkp;
	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
	{
		return   FALSE;
	}
	if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
	{
		CloseHandle(hToken);
		return false;
	}
	tkp.PrivilegeCount = 1;
	tkp.Privileges[0].Luid = sedebugnameValue;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
	{
		CloseHandle(hToken);
		return false;
	}
	return true;
}

#include <tlhelp32.h>
DWORD  FindProcessByName(char* Name)
{
	PROCESSENTRY32 PP;
	PP.dwSize = sizeof(PROCESSENTRY32);
	HANDLE H_p = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (H_p == INVALID_HANDLE_VALUE)
	{
		return 0;
		//	 printf("erro");
	}
	BOOL ret = ::Process32First(H_p, &PP);
	while (ret)
	{
		if (strnicmp(Name, PP.szExeFile, strlen(Name)) == NULL)
		{
			::CloseHandle(H_p);
			return PP.th32ProcessID;
		}
		ret = Process32Next(H_p, &PP);
	}

	::CloseHandle(H_p);
	return 0;
}
void FindMemory(DWORD pid, vector<MemRplace>& src)
{
	int findcount =0;
	MEMORY_BASIC_INFORMATION mbi;
	DWORD memoryAddress = 0;
	BYTE *dataBuffer = NULL;
	BOOL readReturn = 0;
	HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
	while (VirtualQueryEx(pHandle, (LPVOID)memoryAddress, &mbi, sizeof(mbi)))
	{
		if (mbi.Type == MEM_PRIVATE && mbi.Protect != PAGE_EXECUTE && mbi.Protect != PAGE_NOACCESS && mbi.Protect != 128)
		{
			dataBuffer = new BYTE[mbi.RegionSize];
			memset(dataBuffer, 0, mbi.RegionSize);
			readReturn = ReadProcessMemory(pHandle, (LPVOID)memoryAddress, dataBuffer, mbi.RegionSize, 0);
			if (readReturn != 0)
			{
				for (int i = 0; i< mbi.RegionSize; i++)
				{

					for each (auto var in src)
					{
						if (i+var.in_len<mbi.RegionSize)
						{
							if (memcmp(dataBuffer + i, var.souce, var.in_len) == 0)
							{
								DWORD  ol;
								//WriteProcessMemory(pHandle, (LPVOID)(memoryAddress+ i), var.out, var.out_len, &ol);
								findcount++;
								printf("地址:%x 找到:%d  %S size:%d\r\n", memoryAddress + i ,findcount, (WCHAR*)(dataBuffer + i),var.in_len);
								break;

							}
						}
						
					}
				
				}
			}
			else
			{
			}
			delete[]dataBuffer;
		}
		memoryAddress = memoryAddress + mbi.RegionSize;
	}
	CloseHandle(pHandle);
}

void  add_WCHAR_code(vector<MemRplace>&src, WCHAR* code,WCHAR* writecode)
{
	//编译器若是多字节 sizeof wchar的大小不同
	WCHAR* ZZ = L"1";
	int sizexor = wcslen(ZZ) == 1?sizeof(WCHAR):1;
	MemRleace xx;
	memcpy(xx.souce, code, wcslen(code));
	xx.in_len = wcslen(code)*sizexor;

	memcpy(xx.out, writecode, wcslen(writecode));
	xx.out_len = wcslen(writecode);

	src.push_back(xx);
	
}
int main()
{
	EnableDebugPrivilege();
	DWORD pid = FindProcessByName("services");
	if (pid !=0)
	{
		vector<MemRplace> FindArray;
		add_WCHAR_code(FindArray, L"VMware 物理磁盘助手服务", L"1");
		add_WCHAR_code(FindArray, L"VM", L"1");
		FindMemory(pid, FindArray);
		getchar();
	}

}



[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-6-10 16:06 被chengqiyan编辑 ,原因:
最新回复 (19)
StriveXjun 2019-6-10 16:33
2
0
直接爆搜 VM 关键字也是6。  这就不能算误伤了。 应该是杀敌800 自损1000
chengqiyan 2019-6-10 16:39
3
0
StriveXjun 直接爆搜 VM 关键字也是6。 这就不能算误伤了。 应该是杀敌800 自损1000
命中率还是很高的啊  能搜到30+ 总不会每个都错的 也可以增加关键词的长度
Mxixihaha 2019-6-10 16:55
4
0
写了一大堆 仅仅只是检测了一个  Vmware  虚拟机  
kongfubull 2019-6-10 18:39
5
0
如果仅仅是检测vmware虚拟机,哪里用得着这么麻烦啊。来个文件遍历不是更好?像everything这样的工具,分分钟就把整个硬盘的文件给拿出来了。至于行不行,我也不晓得,因为我也是瞎说的,哈哈
笨奔 1 2019-6-10 20:00
6
0
宁可杀错不可放过,成规模用不现实。
hzqst 3 2019-6-10 20:35
7
0

真机


虚拟机


我就是那幸运的1%?
最后于 2019-6-10 20:36 被hzqst编辑 ,原因:
Rookietp 2019-6-10 21:39
8
0
我以为会是什么未公开的API之类的猥琐流
chengqiyan 2019-6-11 13:27
9
0
hzqst 真机虚拟机我就是那幸运的1%?
是WCHAR类型的  CE勾上UNICODE
whathhh 2019-6-11 13:42
10
0
为什么老检测虚拟机啊
hzqst 3 2019-6-11 14:11
11
0
chengqiyan 是WCHAR类型的 CE勾上UNICODE
都说了这种方法杀敌800自损1000

我的真机都被你当成虚拟机了

VCKFC 2019-6-11 14:41
12
0
宁杀错 不放过
黑洛 1 2019-6-11 17:11
13
0
我真机都被你当成虚拟机了
我爱小三 2019-6-12 01:59
14
0
检测虚拟机加载的某些驱动
齐格弗里德 2019-6-12 09:24
15
0
还不如枚举驱动呢
chengqiyan 2019-6-12 13:10
16
0
齐格弗里德 还不如枚举驱动呢
枚举驱动抄一份代码都可以绕过去 这个是在应用层的全局变量
chengqiyan 2019-6-12 13:13
17
0
hzqst 都说了这种方法杀敌800自损1000我的真机都被你当成虚拟机了
没有这个进程的系统服务表定义 不然是可以无误差查询的
shun其自然 2019-6-12 13:16
18
0
Rookietp [em_2]我以为会是什么未公开的API之类的猥琐流
哈哈,你又来偷师学艺!
pushmop 2019-7-30 16:30
19
0
只负责找, 不负责判定真假。无差别攻击?
iamasbcx 2019-8-3 21:55
20
0
我都是判断硬盘大小(200G) 基本不会错   
游客
登录 | 注册 方可回帖
返回