Code:
/*
wif.c by D-oNe
BIG THANKS to GriYo of 29A for his article:
"Scanning for Wireless Networks"
In 29A Issue 8!
Feel free to use this code as you want as long as CREDITS are given!
*/
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define NUMBEROFSSIDS 10
#define _NDIS_CONTROL_CODE(request, method) \
CTL_CODE(FILE_DEVICE_PHYSICAL_NETCARD, request, method, FILE_ANY_ACCESS)
#define IOCTL_NDIS_QUERY_GLOBAL_STATS _NDIS_CONTROL_CODE(0, METHOD_OUT_DIRECT)
#define OID_802_11_BSSID 0x0D010101
#define OID_802_11_SSID 0x0D010102
#define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0D010203
#define OID_802_11_NETWORK_TYPE_IN_USE 0x0D010204
#define OID_802_11_TX_POWER_LEVEL 0x0D010205
#define OID_802_11_RSSI 0x0D010206
#define OID_802_11_RSSI_TRIGGER 0x0D010207
#define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
#define OID_802_11_FRAGMENTATION_THRESHOLD 0x0D010209
#define OID_802_11_RTS_THRESHOLD 0x0D01020A
#define OID_802_11_NUMBER_OF_ANTENNAS 0x0D01020B
#define OID_802_11_RX_ANTENNA_SELECTED 0x0D01020C
#define OID_802_11_TX_ANTENNA_SELECTED 0x0D01020D
#define OID_802_11_SUPPORTED_RATES 0x0D01020E
#define OID_802_11_DESIRED_RATES 0x0D010210
#define OID_802_11_CONFIGURATION 0x0D010211
#define OID_802_11_STATISTICS 0x0D020212
#define OID_802_11_ADD_WEP 0x0D010113
#define OID_802_11_REMOVE_WEP 0x0D010114
#define OID_802_11_DISASSOCIATE 0x0D010115
#define OID_802_11_POWER_MODE 0x0D010216
#define OID_802_11_BSSID_LIST 0x0D010217
#define OID_802_11_AUTHENTICATION_MODE 0x0D010118
#define OID_802_11_PRIVACY_FILTER 0x0D010119
#define OID_802_11_BSSID_LIST_SCAN 0x0D01011A
#define OID_802_11_WEP_STATUS 0x0D01011B
#define OID_802_11_RELOAD_DEFAULTS 0x0D01011C
typedef enum _NDIS_802_11_NETWORK_TYPE
{
Ndis802_11FH,
Ndis802_11DS,
Ndis802_11NetworkTypeMax
} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;
typedef LONG NDIS_802_11_RSSI;
typedef struct _NDIS_802_11_CONFIGURATION_FH
{
ULONG Length;
ULONG HopPattern;
ULONG HopSet;
ULONG DwellTime;
} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH;
typedef struct _NDIS_802_11_CONFIGURATION
{
ULONG Length;
ULONG BeaconPeriod;
ULONG ATIMWindow;
ULONG DSConfig;
NDIS_802_11_CONFIGURATION_FH FHConfig;
} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION;
typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE
{
Ndis802_11IBSS,
Ndis802_11Infrastructure,
Ndis802_11AutoUnknown,
Ndis802_11InfrastructureMax
} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE;
typedef enum _NDIS_802_11_AUTHENTICATION_MODE
{
Ndis802_11AuthModeOpen,
Ndis802_11AuthModeShared,
Ndis802_11AuthModeAutoSwitch,
Ndis802_11AuthModeMax
} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE;
typedef UCHAR NDIS_802_11_RATES[8];
typedef UCHAR NDIS_802_11_MAC_ADDRESS[6];
typedef struct _NDIS_802_11_SSID
{
ULONG SsidLength;
UCHAR Ssid[32];
} NDIS_802_11_SSID, *PNDIS_802_11_SSID;
typedef struct _NDIS_WLAN_BSSID
{
ULONG Length;
NDIS_802_11_MAC_ADDRESS MacAddress;
UCHAR Reserved[2];
NDIS_802_11_SSID Ssid;
ULONG Privacy;
NDIS_802_11_RSSI Rssi;
NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
NDIS_802_11_CONFIGURATION Configuration;
NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
NDIS_802_11_RATES SupportedRates;
} NDIS_WLAN_BSSID, *PNDIS_WLAN_BSSID;
typedef struct _NDIS_802_11_BSSID_LIST
{
ULONG NumberOfItems;
NDIS_WLAN_BSSID Bssid[1];
} NDIS_802_11_BSSID_LIST, *PNDIS_802_11_BSSID_LIST;
BOOL wif_adapterget(HKEY hKey, char *szPath, char *szKey, char *szBuffer, DWORD dwSize)
{
HKEY rk = NULL;
if (RegOpenKeyEx(hKey, szPath, 0, KEY_READ, &rk) != ERROR_SUCCESS) return FALSE;
if (RegQueryValueEx(rk,
szKey,
NULL,
NULL,
(unsigned char *)szBuffer,
&dwSize) != ERROR_SUCCESS) return FALSE;
RegCloseKey(rk);
return TRUE;
}
BOOL wif_adapterlist()
{
char szAdapter[128], szDescription[128], szKey[128], szServiceName[128];
DWORD dwSize = 256;
HKEY rk = NULL;
int i = 0;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards",
0,
KEY_READ,
&rk) == ERROR_SUCCESS)
{
while (RegEnumKeyEx(rk,
i,
szKey,
&dwSize,
NULL,
NULL,
NULL,
NULL) == ERROR_SUCCESS)
{
_snprintf(szAdapter,
sizeof(szAdapter) - 1,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\%s",
szKey);
wif_adapterget(HKEY_LOCAL_MACHINE,
szAdapter,
"Description",
szDescription,
sizeof(szDescription));
wif_adapterget(HKEY_LOCAL_MACHINE,
szAdapter,
"ServiceName",
szServiceName,
sizeof(szServiceName));
printf("[+] %s - %s (%s)\n", szKey, szDescription, szServiceName);
dwSize = 256;
i++;
}
RegCloseKey(rk);
}
if (!i)
return FALSE;
return TRUE;
}
HANDLE wif_adapteropen(char *szAdapterName)
{
HANDLE hAdapter;
char szAdapter[MAX_PATH];
_snprintf(szAdapter, sizeof(szAdapter) - 1, "\\\\.\\%s", szAdapterName);
hAdapter = CreateFile(szAdapter,
GENERIC_READ,
FILE_SHARE_READ |
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
return hAdapter;
}
BOOL wif_networkconnect(HANDLE hAdapter, char *szSSID)
{
DWORD dwBytes, dwOIDCode;
dwOIDCode = Ndis802_11Infrastructure;
//Dissassociate
if (!DeviceIoControl(hAdapter,
OID_802_11_INFRASTRUCTURE_MODE,
&dwOIDCode,
sizeof(dwOIDCode),
NULL,
0,
&dwBytes,
NULL)) return FALSE;
dwOIDCode = Ndis802_11AuthModeOpen;
if (!DeviceIoControl(hAdapter,
OID_802_11_AUTHENTICATION_MODE,
&dwOIDCode,
sizeof(dwOIDCode),
NULL,
0,
&dwBytes,
NULL)) return FALSE;
//Set SSID
// START CODING FROM HERE, NUBZ. -D-oNe
return TRUE;
}
BOOL wif_networklist(HANDLE hAdapter)
{
DWORD dwBytes, dwOIDCode;
int i;
NDIS_802_11_BSSID_LIST *pList;
pList = (NDIS_802_11_BSSID_LIST *)VirtualAlloc(NULL,
sizeof(NDIS_802_11_BSSID_LIST) * NUMBEROFSSIDS,
MEM_RESERVE |
MEM_COMMIT,
PAGE_READWRITE);
if (!pList)
return FALSE;
else
{
memset(pList, 0, sizeof(NDIS_802_11_BSSID_LIST) * NUMBEROFSSIDS);
dwOIDCode = OID_802_11_BSSID_LIST_SCAN;
DeviceIoControl(hAdapter,
IOCTL_NDIS_QUERY_GLOBAL_STATS,
&dwOIDCode,
sizeof(dwOIDCode),
NULL,
0,
&dwBytes,
NULL);
Sleep(2000);
memset(pList, 0, sizeof(NDIS_802_11_BSSID_LIST) * NUMBEROFSSIDS);
dwOIDCode = OID_802_11_BSSID_LIST;
if (!DeviceIoControl(hAdapter,
IOCTL_NDIS_QUERY_GLOBAL_STATS,
&dwOIDCode,
sizeof(dwOIDCode),
pList,
sizeof(NDIS_802_11_BSSID_LIST) * NUMBEROFSSIDS,
&dwBytes,
NULL)) return FALSE;
}
system("cls");
printf("[+] Found %i network(s)!\n", pList->NumberOfItems);
for (i = 0; i < (int)pList->NumberOfItems; i++)
{
printf("[+] ID: %i - MAC: %02X-%02X-%02X-%02X-%02X-%02X - Signal: %d dBm - SSID: %s - OPEN: %i\n",
i,
pList->Bssid[i].MacAddress[0],
pList->Bssid[i].MacAddress[1],
pList->Bssid[i].MacAddress[2],
pList->Bssid[i].MacAddress[3],
pList->Bssid[i].MacAddress[4],
pList->Bssid[i].MacAddress[5],
pList->Bssid[i].Rssi,
pList->Bssid[i].Ssid.Ssid,
pList->Bssid[i].Privacy);
}
return TRUE;
}
int main(int argc, char *argv[])
{
char szAdapter[128], szDescription[128], szServiceName[128];
HANDLE hAdapter;
printf("\nwif by D-oNe\n\n");
if (argc < 2)
{
printf("usage:\n");
printf("%s <adapter> <filepath>\n", argv[0]);
printf("%s -l to list available network adapters.\n", argv[0]);
printf("[-] Exiting...\n");
return 0;
}
if (strcmp(argv[1], "-l") == 0)
{
wif_adapterlist();
return 0;
}
if (argc < 3)
{
printf("usage:\n");
printf("%s <interface> <filepath>\n", argv[0]);
printf("%s -l to list network adapters.\n", argv[0]);
printf("[-] Exiting...\n");
return 0;
}
printf("[+] Getting adapter: %s...\n", argv[1]);
memset(szDescription, 0, sizeof(szDescription));
memset(szServiceName, 0, sizeof(szServiceName));
_snprintf(szAdapter,
sizeof(szAdapter) - 1,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\%s",
argv[1]);
wif_adapterget(HKEY_LOCAL_MACHINE,
szAdapter,
"Description",
szDescription,
sizeof(szDescription) - 1);
wif_adapterget(HKEY_LOCAL_MACHINE,
szAdapter,
"ServiceName",
szServiceName,
sizeof(szServiceName) - 1);
printf("[+] Opening adapter: %s...\n", szDescription);
hAdapter = wif_adapteropen(szServiceName);
if (hAdapter == INVALID_HANDLE_VALUE)
{
printf("[+] Failed to open adapter: %s!\n", szDescription);
return 0;
}
printf("[+] Scanning for networks...\n");
if (!wif_networklist(hAdapter))
{
printf("[+] No networks found!\n");
return 0;
}
return 0;
}