⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 systemscan.cpp

📁 网络安全原理方面的小程序:基本tcp/ip通信、原始套接字程序、DES/RSA/MD5、木马、缓冲区溢出、网络嗅探、扫描器、WEB安全等
💻 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 + -