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