首页
论坛
课程
招聘
雪    币: 247
活跃值: 活跃值 (20)
能力值: ( LV2,RANK:50 )
在线值:
发帖
回帖
粉丝

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

2019-6-10 15:34 4269

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

2019-6-10 15:34
4269
#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();
	}

}

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

真机


虚拟机


我就是那幸运的1%?
最后于 2019-6-10 20:36 被hzqst编辑 ,原因:
雪    币: 1482
活跃值: 活跃值 (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Rookietp 活跃值 2019-6-10 21:39
8
0
我以为会是什么未公开的API之类的猥琐流
雪    币: 247
活跃值: 活跃值 (20)
能力值: ( LV2,RANK:50 )
在线值:
发帖
回帖
粉丝
chengqiyan 活跃值 2019-6-11 13:27
9
0
hzqst 真机虚拟机我就是那幸运的1%?
是WCHAR类型的  CE勾上UNICODE
雪    币: 756
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whathhh 活跃值 2019-6-11 13:42
10
0
为什么老检测虚拟机啊
雪    币: 8561
活跃值: 活跃值 (473)
能力值: ( LV5,RANK:250 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2019-6-11 14:11
11
0
chengqiyan 是WCHAR类型的 CE勾上UNICODE
都说了这种方法杀敌800自损1000

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

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