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