首页
社区
课程
招聘
[原创]调戏:Anti切屏器
发表于: 2014-11-19 07:35 10603

[原创]调戏:Anti切屏器

2014-11-19 07:35
10603
以前在看雪写过一次,暴力切屏器Anti方案,现在想象,好肤浅。
anti方法:正常情况下鼠标不会出现断电off,也不会出现没有vid标识的鼠标(rdp的鼠标不是鼠标)。
当用切屏器从当前pc切换到其他pc的时候,有2种情况发生:
1.鼠标off,但是鼠标还在;
2.鼠标不见了,即vid类鼠标不见了。

于是有了下面粗糙的POC,吓写的代码~
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <functional>
#include <algorithm>
#include <chrono>
#include <windows.h>
#include <SetupAPI.h>

typedef std::function<bool(LPCGUID guid)> fp_test;


#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
        EXTERN_C const GUID DECLSPEC_SELECTANY name \
                = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }

DEFINE_GUID(GUID_DEVINTERFACE_MONITOR, 0xe6f07b5f, 0xee97, 0x4a90, 0xb0, 0x76, 0x33, 0xf5, 0x7b, 0xf4, 0xea, 0xa7);

DEFINE_GUID(GUID_DEVINTERFACE_MOUSE, 0x378de44c, 0x56ef, 0x11d1,
	0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd);

#pragma comment(lib,"setupapi.lib")

bool check_device_by_guid(LPCGUID Guid)
{
	HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(Guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
	SP_DEVINFO_DATA DeviceInfoData;
	DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	bool is_no_device = true;
	for (DWORD dwDeviceIndex = 0; SetupDiEnumDeviceInfo(DeviceInfoSet, dwDeviceIndex, &DeviceInfoData); dwDeviceIndex++)
	{
		SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
		DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
		for (DWORD dwMemberIndex = 0; SetupDiEnumDeviceInterfaces(DeviceInfoSet, &DeviceInfoData, Guid, dwMemberIndex, &DeviceInterfaceData); dwMemberIndex++)
		{
			DWORD dwDeviceInterfaceDetailDataSize = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA, DevicePath) + MAX_PATH * sizeof(TCHAR);
			PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)new BYTE[dwDeviceInterfaceDetailDataSize];
			pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
			if (SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, &DeviceInterfaceData, pDeviceInterfaceDetailData, dwDeviceInterfaceDetailDataSize, NULL, NULL))
			{
				HANDLE hMonitor = CreateFile(pDeviceInterfaceDetailData->DevicePath, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
				std::cout << pDeviceInterfaceDetailData->DevicePath << std::endl;
				//std::cout << GetLastError() << "\r\n";
				auto s = std::string(pDeviceInterfaceDetailData->DevicePath);
				std::transform(s.begin(), s.end(), s.begin(), ::tolower);
				if(s.find("vid_")!=std::string::npos && GetLastError()==32)
				{
					is_no_device = false;
				}
				delete[] pDeviceInterfaceDetailData;

				if (hMonitor != INVALID_HANDLE_VALUE && hMonitor)
				{
					BOOL result;
					if (GetDevicePowerState(hMonitor, &result))
					{
						std::cout << "Result = " << result << "\n";
						if (result == TRUE){
							std::cout << "Monitor is on!: \n";
							is_no_device |= false;
						}
						else{
							std::cout << "Monitor is off!: \n";
							is_no_device |= true;
						}
					}
					CloseHandle(hMonitor);
				}
				if (is_no_device == true)
				{
					break;
				}
			}
		}
	}
	return is_no_device; 
}
void CheckDevice()
{
	fp_test fp = fp_test(&check_device_by_guid);
	bool ret = false;
	do 
	{
		std::this_thread::sleep_for(std::chrono::seconds(5));
		ret = fp(&GUID_DEVINTERFACE_MOUSE);
	} 
	while (!ret);
	
	std::cout << "find MT-KVM\r\n" << std::endl;
	return ;
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::thread t(CheckDevice);
	t.join();
	system("PAUSE");
	return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 4
支持
分享
最新回复 (24)
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
坐等加精!!
急急忙忙抢了个沙发...哈哈,第一次离老V这么近啦。
2014-11-19 07:52
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
学习了~~~~
2014-11-19 08:03
0
雪    币: 615
活跃值: (530)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
啥意思?  这是检测外挂还是检测挂机呀
2014-11-19 08:28
0
雪    币: 1555
活跃值: (3032)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
5
检测双屏幕的吧
2014-11-19 08:36
0
雪    币: 3330
活跃值: (1662)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
6
老v也用c++11啦,共同学习,提高生产力啊
2014-11-19 08:45
0
雪    币: 114
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
前排支持
2014-11-19 08:46
0
雪    币: 3714
活跃值: (2059)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
虽然看不懂,但是支持了
2014-11-19 09:01
0
雪    币: 62
活跃值: (946)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
V校,你广告忘加了....
2014-11-19 09:51
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
10
怪不得看着这么别扭。。
2014-11-19 09:55
0
雪    币: 349
活跃值: (125)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
无语,没看懂
2014-11-19 10:27
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
12
就是切屏后,鼠标设备的VID不见了或者鼠标power off了~
这2个状态很搞笑,我测试的几个切屏器经常出,其他的不知道。
2014-11-19 10:29
0
雪    币: 1305
活跃值: (213)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
13
切屏是啥,不懂呢
2014-11-19 10:37
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
淘宝输入KVM可以得真相~
2014-11-19 10:54
0
雪    币: 6
活跃值: (1509)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
游戏连用切屏 也检测   真蛋疼了
2014-11-19 13:37
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
16
没办法,大家都要混日子,不检测就没日子混了~
2014-11-19 15:30
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
什么游戏呢?我等立马放弃
2014-11-19 16:34
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
混日子就是搞技术对抗啊
2014-11-19 17:32
0
雪    币: 349
活跃值: (125)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
19
不打游戏,用不着这玩意儿
2014-11-20 11:50
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
20
话说,写代码也常用切屏器,测试,调试,代码,三机分离~~
2014-11-20 19:41
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
21
思路不错,不过一般我也只用一大屏就完事了~~~
2014-11-20 20:08
0
雪    币: 349
活跃值: (125)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
22
可我不是写代码的。。。。。
2014-11-21 08:28
0
雪    币: 210
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
如果是ps/2的他没法检测到的。。 例如dell hp的那些kvm over ip的

迈拓那些一般都不会用吧 经常掉鼠标键盘的
2014-11-23 22:25
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
24
kvm over ip确实好~
2014-11-24 12:57
0
雪    币: 26
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
像我这种 一台机器工作 一台机器游戏的玩家 ,使用一台显示 一个鼠标设备 不是要倒霉了? ^_^
2014-11-24 17:35
0
游客
登录 | 注册 方可回帖
返回
//