?? systemscan.cpp
字號:
#include <stdio.h>
#include <memory.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")
#define MAX_RECV_LEN 4000 // 接收數據的最大長度
char TargetIP[20]; // 目標機IP地址
// 解析命令行
void ParseCmd(int argc, char *argv[])
{
if(argc !=2)
{
printf("usage : SystemScan.exe [TargetIP]");
exit(0);
}
strcpy(TargetIP,argv[1]);
}
// 主函數
int main(int argc, char *argv[] )
{
ParseCmd(argc,argv);
int target_port = 445; //目標機端口
int ret;
char recv_data[MAX_RECV_LEN]={0}; // 接收數據緩存區
WSADATA wsd;
SOCKET sock = 0 ; // 發送數據套接字
SOCKADDR_IN target_addr; // 目標機地址結構
// 初始化Winsock庫
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("加載Winsock失敗!\n");
return 0;
}
// 創建套接字
sock = socket(AF_INET, SOCK_STREAM,0);
if (sock == INVALID_SOCKET)
{
printf("創建socket失敗: %d\n", WSAGetLastError());
return 0;
}
target_addr.sin_family = AF_INET;
target_addr.sin_addr.S_un.S_addr = inet_addr(TargetIP);
target_addr.sin_port = htons(target_port);
// 連接目標機的445端口
ret = connect(sock, (LPSOCKADDR)&target_addr, sizeof(target_addr));
if(ret==SOCKET_ERROR) // 連接失敗
{
printf("連接目標機失敗: %d\n", WSAGetLastError());
return 0;
}
// 共享連接信息,探測Windows版本
char conninfo[] = "\x00\x00\x00\xA4\xFF\x53\x4D\x42\x72\x00\x00\x00\x00\x08\x01\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4D\x0B\x00\x00\x01\x01\x00\x81\x00\x02PC NETWORK PROGRAM 1.0\x00\x02MICROSOFT NETWORKS 1.03\x00\x02MICROSOFT NETWORKS 3.0\x00\x02LANMAN1.0\x00\x02LM1.2X002\x00\x02Samba\x00\x02NT LANMAN 1.0\x00\x02NT LM 0.12";
// 發送連接信息
ret = send(sock, conninfo, sizeof(conninfo), 0);
if(ret == SOCKET_ERROR)
{
printf("發送連接信息失敗: %d\n", WSAGetLastError());
return 0;
}
// 接收目標機返回的信息(這次信息對探測系統無用)
ret = recv(sock, recv_data, MAX_RECV_LEN, 0);
if(ret == SOCKET_ERROR)
{
printf("接收數據失敗: %d\n", WSAGetLastError());
return 0;
}
// 探測系統類型數據包
char fingerprint[]="\x00\x00\x00\x51\xFF\x53\x4D\x42\x73\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x13\x00\x00\x00\x01\x00\x0d\xFF\x00\x00\x00\xFF\xFF\x02\x00\xc7\x13\xc3\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x4D\x59\x47\x52\x4F\x55\x50\x00\x55\x6E\x69\x78\x00\x53\x61\x6d\x62\x61";
ret = send(sock, fingerprint, sizeof(fingerprint), 0);
if(ret == SOCKET_ERROR)
{
printf("接收數據失敗: %d\n", WSAGetLastError());
return 0;
}
memset(recv_data,0,MAX_RECV_LEN);
// 接收目標機返回的操作系統類型信息
ret = recv(sock, recv_data, MAX_RECV_LEN, 0);
if((ret==0) || ret==SOCKET_ERROR)
{
printf("無法探測到目標機操作系統!\n");
return 0;
}
// 尋找返回字符串中系統信息位置
char str = 'W'; // 標志位
char *pdest;
int result;
pdest = (char*)memchr( recv_data, str,MAX_RECV_LEN);
result = pdest - recv_data + 1;
if(pdest != NULL)
{
printf("\n目標機 %s 的操作系統類型 : %s \n",TargetIP,recv_data+result-1);
}
else
{
printf("\n無法判別目標機 %s 的操作系統類型\n",TargetIP);
}
closesocket(sock);
WSACleanup();
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -