📄 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 + -