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

📄 netbiosscan.cpp

📁 “网络安全技术实践与代码详解”实例代码
💻 CPP
字号:
#define UNICODE
#define _UNICODE
#include <stdio.h>
#include <windows.h>
#include <winnetwk.h>
#include <tchar.h>
#include <lm.h>

#pragma comment (lib,"mpr")
#pragma comment (lib,"netapi32")

// 探测目标机的日期和时间
int ScanDateTime(PTSTR targetip)
{
	
	PTIME_OF_DAY_INFO pBuf=NULL; // TIME_OF_DAY_INFO数据结构的指针
	NET_API_STATUS nStatus;
	DWORD lerror;
	
	printf("\n*** 目标机系统日期和时间 ***\n");
	
	// 获取目标机日期和时间信息
	nStatus=NetRemoteTOD(targetip,(PBYTE*)&pBuf); 
	if(nStatus==NERR_Success)
	{ 
		if(pBuf!=NULL)
		{
			// 输出日期
			_tprintf(_T("\nCurrent date:\t%.2d-%.2d-%d"),
				pBuf->tod_month,pBuf->tod_day,pBuf->tod_year);
			// 输出时间(GMT)
			_tprintf(_T("\nCurrent time:\t%.2d:%.2d:%.2d.%.2d (GMT)"),
				pBuf->tod_hours,pBuf->tod_mins,pBuf->tod_secs,pBuf->tod_hunds);
			pBuf->tod_hours=(pBuf->tod_hours+8)%24; // 计算本地时区时间
			// 输出本地时区时间
			_tprintf(_T("\nCurrent time:\t%.2d:%.2d:%.2d.%.2d (GMT+08:00)\n"),
				pBuf->tod_hours,pBuf->tod_mins,pBuf->tod_secs,pBuf->tod_hunds);
		} 
	}
	else
	{
		lerror=GetLastError();
		if(lerror==997)
		{
			printf("\n获取日期时间失败:\t重叠IO操作正在进行. \n");
		}
		else 
		{
			printf("\n获取日期时间错误:\t%d\n",lerror);
		}
	}
	if(pBuf!=NULL)
	{ // 释放系统分配的内存
		NetApiBufferFree(pBuf);
	}
	return 0;
}

// 探测本地组列表
int ScanLocalGroup(PTSTR targetip) 
{
	NET_API_STATUS nStatus;
	PLOCALGROUP_INFO_1 pBuf,pBuffer; // 组列表信息结构体
	DWORD i,dwLevel;
	DWORD er,tr,resume; 
	DWORD lerror;
	
	resume=0;
	dwLevel=1; 
	
	printf("\n**** 本地组列表 ****\n");
	// 循环探测所有的组列表
	do
	{ 
		// 探测本地组列表
		nStatus=NetLocalGroupEnum(targetip,dwLevel,(PBYTE *)&pBuf,
			MAX_PREFERRED_LENGTH,&er,&tr,&resume);
		if((nStatus==NERR_Success)|| (nStatus==ERROR_MORE_DATA))
		{
			pBuffer=pBuf;
			for(i=1;i<=er;i++)
			{
				// 输出本地组名称
				_tprintf(_T("\nName:\t\t%s"),pBuffer->lgrpi1_name);
				// 输出本地组描述
				_tprintf(_T("\nComment:\t%s"),pBuffer->lgrpi1_comment);
				_tprintf(_T("\n"));
				pBuffer++;
			}
		}
		else
		{ // 出错处理
			lerror=GetLastError();
			if(lerror==997)
			{
				printf("\n本地组列表:\t重叠IO操作正在进行.\n");
			}
			else
			{
				printf("\n获取本地组列表失败:\t%d\n",lerror);
			}
		}
		if(pBuf!=NULL)
		{ // 释放系统分配内存
			NetApiBufferFree(pBuf);
		}
	}while(nStatus==ERROR_MORE_DATA);
	return 0;
} 

// 探测组信息和组内用户列表
int ScanGlobalGroup(PTSTR targetip) 
{
	PNET_DISPLAY_GROUP pGBuf,pGBuffer; // 组信息结构体
	PGROUP_USERS_INFO_0 pUBuf,pUBuffer; // 组内用户信息结构体
	DWORD nGStatus,nUStatus;
	DWORD i;
	DWORD dwLevel,dwRec;
	DWORD k;
	DWORD er,tr,resume;
	DWORD lerror;
	i=0;
	er=0;
	tr=0;
	resume=0;
	dwLevel=3;
	printf("\n**** 组列表和组内用户列表 ****\n");
	do
	{
		// 获取组列表信息
		nGStatus=NetQueryDisplayInformation(targetip,dwLevel,i,
			100,0xFFFFFFFF,&dwRec,(PVOID*)&pGBuf);
		if((nGStatus==ERROR_SUCCESS) || (nGStatus==ERROR_MORE_DATA))
		{
			pGBuffer=pGBuf;
			for(;dwRec>0;dwRec--)
			{
				// 输出组列表信息
				_tprintf(_T("\nName:\t\t%s"),pGBuffer->grpi3_name);
				_tprintf(_T("\nComment:\t%s"),pGBuffer->grpi3_comment);
				_tprintf(_T("\nGroup ID:\t%u"),pGBuffer->grpi3_group_id);
				_tprintf(_T("\nAttributs:\t%u"),pGBuffer->grpi3_attributes); 
				_tprintf(_T("\nMembers:\t"));
				// 获取组内用户列表
				nUStatus=NetGroupGetUsers(targetip,
					pGBuffer->grpi3_name,
					0,
					(PBYTE *)&pUBuf,
					MAX_PREFERRED_LENGTH,
					&er,&tr,&resume);
				if(nUStatus==NERR_Success)
				{
					pUBuffer=pUBuf;
					for(k=1;k<=er;k++)
					{
						// 输出用户名称
						_tprintf(_T("%s "),pUBuffer->grui0_name);
						pUBuffer++;
					}
					if(pUBuf!=NULL)
					{
						// 释放内存
						NetApiBufferFree(pUBuf);
					}
				}
				_tprintf(_T("\n"));
				i=pGBuffer->grpi3_next_index;
				pGBuffer++;
			}
		}
		else
		{   //错误处理过程
			lerror=GetLastError();
			if(lerror==997)
			{
				printf("\n全局组信息:\t重叠IO操作正在进行.\n");
			}
			else
			{
				printf("\n获取组信息出错:\t%d\n",lerror);
			}
		}
		if(pGBuf!=NULL)
		{
			NetApiBufferFree(pGBuf);
		}
	}while(nGStatus==ERROR_MORE_DATA);
	return 0;
}

// 探测传输协议列表
int ScanTransInfo(PTSTR targetip) 
{
	NET_API_STATUS nStatus;
	PSERVER_TRANSPORT_INFO_0 pBuf,pBuffer; // 传输协议信息机构体
	DWORD dwLevel;
	DWORD i;
	DWORD er,tr,resume;
	DWORD dwTotalCount;
	DWORD dwLength;
	DWORD lerror;
	er=0;
	tr=0;
	resume=0;
	dwLevel=0;
	dwTotalCount=0;
	
	printf("\n***** 传输协议信息 *****\n");
	dwLength=_tcslen(targetip);
	do
	{
		// 获取传输协议信息
		nStatus=NetServerTransportEnum(targetip,
			dwLevel,(PBYTE *)&pBuf,
			MAX_PREFERRED_LENGTH,&er,&tr,&resume);
		if((nStatus==NERR_Success) || (nStatus==ERROR_MORE_DATA))
		{
			pBuffer=pBuf;
			for(i=0;i<er;i++)
			{
				// 输出传输协议信息
				_tprintf(_T("\nTransport:\t%s"),pBuffer->svti0_transportname);
				_tprintf(_T("\nNetworkAddr:\t%s"),pBuffer->svti0_networkaddress);
				_tprintf(_T("\nActiveClient:\t%d User(s)\n"),pBuffer->svti0_numberofvcs);
				pBuffer++;
				dwTotalCount++; 
			}
		}
		else
		{
			// 出错处理
			lerror=GetLastError();
			if(lerror==997)
			{
				printf("\n传输协议出错:\t 重叠IO操作正在进行.\n");
			}
			else
			{
				printf("\n获取传输协议出错:\t%d\n",lerror);
			}
		}
		if(pBuf!=NULL)
		{
			NetApiBufferFree(pBuf);
		}
	}while(nStatus==ERROR_MORE_DATA);
	return 0;
}

// 探测会话信息
int ScanSession(PTSTR targetip)
{
	PSESSION_INFO_10 pBuf,pBuffer; // 会话信息结构体
	NET_API_STATUS nStatus;
	DWORD i,dwLevel;
	DWORD er,tr,resume;
	DWORD dwTotalCount;
	DWORD dwLength;
	PTSTR pszClient;
	PTSTR pszUser;
	DWORD lerror;
	
	printf("\n****** 会话信息 ******\n");
	dwLevel=10;
	dwTotalCount=0;
	pszClient=NULL;
	pszUser=NULL;
	er=0;
	tr=0;
	resume=0;
	dwLength=_tcslen(targetip);
	
	do
	{
		// 获取会话信息
		nStatus=NetSessionEnum(targetip,
			pszClient,
			pszUser,
			dwLevel,
			(PBYTE *)&pBuf,
			MAX_PREFERRED_LENGTH,
			&er,&tr,&resume);
		if((nStatus==NERR_Success) || (nStatus==ERROR_MORE_DATA))
		{
			pBuffer=pBuf;
			for(i=0;i<er;i++)
			{
				if(pBuffer==NULL)
				{
					printf("不允许访问.\n");
					break;
				}
				// 输出会话信息
				_tprintf(_T("\nClient:\t\t%s"),pBuffer->sesi10_cname);
				_tprintf(_T("\nUser:\t\t%s"),pBuffer->sesi10_username);
				_tprintf(_T("\nSeconds Active:\t%d"),pBuffer->sesi10_time);
				_tprintf(_T("\nSeconds Idle:\t%d\n"),pBuffer->sesi10_idle_time);
				pBuffer++;
				dwTotalCount++;
			}
		}
		else
		{  // 出错处理
			lerror=GetLastError();
			if(lerror==997)
			{
				printf("\n会话出错:\t重叠IO操作正在进行.\n");
			}
			else
			{
				printf("\n获取会话信息出错:\t%d\n",lerror);
			}
		}
		if(pBuf!=NULL)
		{ // 释放内存
			NetApiBufferFree(pBuf);
		}
	}while(nStatus==ERROR_MORE_DATA);
	return 0;
}
// 主函数
int wmain(int argc, TCHAR *argv[])
{
	
	if(argc != 2)
	{
		printf("usage : NetBIOSScan.exe [TargetIP]\n");
		exit(0);
	}
	
	NETRESOURCE nr; // 网络资源结构体
	DWORD ret;
	TCHAR username[100]=_T(""); // 用户名
	TCHAR password[100]=_T(""); // 密码
	TCHAR ipc[100]=_T(""); // IPC会话
	
	system("cls.exe"); // 清屏
	swprintf(ipc,_T("\\\\%s\\ipc$"),argv[1]); // IPC字符串
	nr.lpLocalName=NULL;
	nr.lpProvider=NULL;
	nr.dwType=RESOURCETYPE_ANY;
	nr.lpRemoteName=ipc;
	// 建立空会话
	ret=WNetAddConnection2(&nr,username,password,0);
	if(ret!=ERROR_SUCCESS)
	{
		printf("\n空会话建立失败.\n");
		return -1;
	}
    // 探测目标机日期和时间
    ScanDateTime(argv[1]);
    // 探测目标机本地组信息
	ScanLocalGroup(argv[1]);
    // 探测目标机组信息和组内用户信息
	ScanGlobalGroup(argv[1]);
    // 探测目标机传输协议信息
	ScanTransInfo(argv[1]);
    // 探测目标机会话信息
	ScanSession(argv[1]);
	// 撤销空会话
	ret=WNetCancelConnection2(ipc,0,TRUE); 
	if(ret!=ERROR_SUCCESS)
	{
		printf("空会话撤销失败.\n");
		return -1;
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -