首页
社区
课程
招聘
3
[原创]纯R3超强检测虚拟机 秒杀99%虚拟机隐藏
发表于: 2019-6-10 15:34 8643

[原创]纯R3超强检测虚拟机 秒杀99%虚拟机隐藏

2019-6-10 15:34
8643
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#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编辑 ,原因:
收藏
免费 3
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-1-25 05:47
junkboy
为你点赞~
2019-6-10 16:01
黑手鱼
为你点赞~
2019-6-10 15:54
最新回复 (20)
雪    币: 1044
活跃值: (1360)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
2
直接爆搜 VM 关键字也是6。  这就不能算误伤了。 应该是杀敌800 自损1000
2019-6-10 16:33
0
雪    币: 261
活跃值: (547)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
StriveXjun 直接爆搜 VM 关键字也是6。 这就不能算误伤了。 应该是杀敌800 自损1000
命中率还是很高的啊  能搜到30+ 总不会每个都错的 也可以增加关键词的长度
2019-6-10 16:39
0
雪    币: 5084
活跃值: (5078)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
写了一大堆 仅仅只是检测了一个  Vmware  虚拟机  
2019-6-10 16:55
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果仅仅是检测vmware虚拟机,哪里用得着这么麻烦啊。来个文件遍历不是更好?像everything这样的工具,分分钟就把整个硬盘的文件给拿出来了。至于行不行,我也不晓得,因为我也是瞎说的,哈哈
2019-6-10 18:39
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
宁可杀错不可放过,成规模用不现实。
2019-6-10 20:00
0
雪    币: 12876
活跃值: (9332)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7

真机


虚拟机


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

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

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

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册