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

📄 snmp探测代码.txt

📁 可以对黑客编程有一定的了解
💻 TXT
📖 第 1 页 / 共 3 页
字号:

#ifndef _SNMPEXTOOLS_H 
#define _SNMPEXTOOLS_H 
#include "winsnmp.h" 
#include "winsock.h" 
#pragma comment(lib, "wsnmp32.lib" ) 
#pragma comment(lib, "ws2_32.lib" ) 
/***************************************************/ 
#define MAX_UDP 10 
#define MAX_VBL 10 
#define lMsg(x) ::MessageBox(NULL, x, "信息", NULL) 
//=================================一些结构体 
class CSendInfo 
{ 
public: 
CSendInfo(); 
~CSendInfo(); 
public: 
//对方的实体 
HSNMP_ENTITY hAgentEntity; 
//自己的实体 
HSNMP_ENTITY hManagerEntity; 
//上下文描述 
HSNMP_CONTEXT hViewContext; 
//发送包类型 
int nPduType; 
//----------------如果hPdu不为空,则用它来发送,而忽略hVbl和vblValue、vblOid 
//PDU句柄 
HSNMP_PDU hPdu; 

//每个VBL对应的OID 

smiOID vblOid[MAX_VBL]; 

//----------------如果hPdu为NULL,而hVbl不为空,则用它来发送,而忽略vblValue、vblOid 

//变量绑定列表句柄 

HSNMP_VBL hVbl; 

//------------------------ 

//变量数 

long nVblCount; 

//VBL数组 

smiVALUE vblValue[MAX_VBL]; 

//-------------------------- 

long nErrorStatus; 

long nErrorIndex; 

//--------------------------超时或重试信息 

DWORD dwRetransmitCont; 

DWORD dwTimeOut; 

}; 



class CRecvPduInfo 

{ 

public: 

CRecvPduInfo(); 

~CRecvPduInfo(); 

public: 

//---------------------------得到PDU中的一些句柄,以便回复时使用! 

//对方的实体 

HSNMP_ENTITY hRcvAgentEntity; 

//自己的实体 

HSNMP_ENTITY hRcvManagerEntity; 

HSNMP_CONTEXT hRcvViewContext; 

HSNMP_VBL hRcvVbl; 

HSNMP_PDU hRcvPdu; 

//---------------------------得到PDU包中的一些固定信息 

long nPduType; 

long nRequestId; 

long nErrorStatus; 

long nErrorIndex; 

char szCommunity[40]; 

char szSourceIp[40]; 

//----------------------------取VBlist中变量信息 

long nVblCount; 

smiOID vblOid[MAX_VBL]; 

smiVALUE vblValue[MAX_VBL]; 

}; 



class CTrapPduInfo : public CRecvPduInfo 

{ 

public: 

CTrapPduInfo(); 

public: 

char szEnterpriseOid[40]; 

int genericTrap; 

int specificTrap; 

int nUsefulVbCount; 

DWORD dwTimeTicks; 



}; 

//====================================一些函数 

SNMPAPI_STATUS convertString2smiValue(smiLPVALUE value, TCHAR *buffer); 



SNMPAPI_STATUS SendSnmpMessage(HSNMP_SESSION hSnmpSession, CString strManagerIp, 

CString strAgentIp, CString strCommunity, 

CString strOidNumber[MAX_VBL], DWORD dwRetransmitCont, 

DWORD dwTimeOut, DWORD * pRequestId, int nPduType, 

smiVALUE value[MAX_VBL], 

int nValueCount = 1, int nErrorStatus = 0, 

int nErrorIndex = 0); 

SNMPAPI_STATUS SendSnmpMessage(HSNMP_SESSION hSnmpSession, DWORD *pRequestId, 

CSendInfo *pSendInfo); 



SNMPAPI_STATUS GetSnmpMessage(HSNMP_SESSION hSnmpSession, CRecvPduInfo *pRuiStore); 

SNMPAPI_STATUS GetTrapMessage(HSNMP_SESSION hSnmpSession, CTrapPduInfo *pTpiStore); 



void GetSnmpErrorDescribe(HSNMP_SESSION hSnmpSession); 

void ShowInfoBox(CTrapPduInfo saveTrapInfo); 



int GetSelfIp(CString strIp[]); 



//------------------------------------------------------// 

#endif 





//实现文件: 

#include "stdafx.h" 

#include "SnmpExTools.h" 

//////////////////////////////////////////////////////////// 

// // 

// Some Simple Snmp Function // 

// Written by LHX , 2001-4-13 // 

// // 

//////////////////////////////////////////////////////////// 

CSendInfo::CSendInfo() 

{ 

hAgentEntity = NULL; 

hManagerEntity = NULL; 

hViewContext = NULL; 

hVbl = NULL; 

hPdu = NULL; 

nPduType = 0; 

nErrorStatus = 0; 

nErrorIndex = 0; 

nVblCount = 0; 

} 

CSendInfo::~CSendInfo() 

{ 

SnmpFreeEntity(hAgentEntity); 

SnmpFreeEntity(hManagerEntity); 

SnmpFreeContext(hViewContext); 

SnmpFreeVbl(hVbl); 

SnmpFreePdu(hPdu); 

for(int i = 0; i < nVblCount; i++) 

{ 

SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&vblOid[i]); 

switch (vblValue[i].syntax) { 

case SNMP_SYNTAX_OCTETS: 

SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string); 

break; 

case SNMP_SYNTAX_OID: 

SnmpFreeDescriptor(vblValue[i].syntax, (smiLPOCTETS) &vblValue[i].value.oid); 

break; 

case SNMP_SYNTAX_IPADDR: 

SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string); 

break; 

} 

} 

} 



CRecvPduInfo::CRecvPduInfo() 

{ 

hRcvAgentEntity = NULL; 

hRcvManagerEntity = NULL; 

hRcvViewContext = NULL; 

hRcvVbl = NULL; 

hRcvPdu = NULL; 

} 



CRecvPduInfo::~CRecvPduInfo() 

{ 

SnmpFreeEntity(hRcvAgentEntity); 

SnmpFreeEntity(hRcvManagerEntity); 

SnmpFreeContext(hRcvViewContext); 

SnmpFreeVbl(hRcvVbl); 

SnmpFreePdu(hRcvPdu); 

for(int i = 0; i < nVblCount; i++) 

{ 

SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&vblOid[i]); 

switch (vblValue[i].syntax) { 

case SNMP_SYNTAX_OCTETS: 

SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string); 

break; 

case SNMP_SYNTAX_OID: 

SnmpFreeDescriptor(vblValue[i].syntax, (smiLPOCTETS) &vblValue[i].value.oid); 

break; 

case SNMP_SYNTAX_IPADDR: 

SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string); 

break; 

} 

} 

} 



CTrapPduInfo::CTrapPduInfo() 

{ 

memset(szEnterpriseOid, 0, 40); 

genericTrap = 0; 

specificTrap = 0; 

DWORD dwTimeTicks = 0; 

//记录有多少个信息变量!(注意:从第三个开始) 

nUsefulVbCount = 0; 

} 



/*****************************************************/ 

//--------------------------------- 

//名称:GetSnmpErrorDescribe 

//描述:得到SNMP的错误具体描述 

//--------------------------------- 

void GetSnmpErrorDescribe(HSNMP_SESSION hSnmpSession) 

{ 

CString strErrorInfo; 

strErrorInfo = "Snmp错误信息:"; 

switch(SnmpGetLastError(hSnmpSession)) 

{ 

case SNMPAPI_ALLOC_ERROR: 

strErrorInfo += "SNMPAPI_ALLOC_ERROR(错误的内存分配)"; 

break; 

case SNMPAPI_CONTEXT_INVALID: 

strErrorInfo += "SNMPAPI_CONTEXT_INVALID(无效的上下文参数)"; 

break; 

case SNMPAPI_CONTEXT_UNKNOWN: 

strErrorInfo += "SNMPAPI_CONTEXT_UNKNOWN(不知名的上下文参数)"; 

break; 

case SNMPAPI_ENTITY_INVALID: 

strErrorInfo += "SNMPAPI_ENTITY_INVALID(无效的实体)"; 

break; 

case SNMPAPI_ENTITY_UNKNOWN: 

strErrorInfo += "SNMPAPI_ENTITY_UNKNOWN(不知名的实体)"; 

break; 

case SNMPAPI_INDEX_INVALID: 

strErrorInfo += "SNMPAPI_INDEX_INVALID(无效的VBL索引参数)"; 

break; 

case SNMPAPI_NOOP: 

strErrorInfo += "SNMPAPI_NOOP(没有操作被完成)"; 

break; 

case SNMPAPI_OID_INVALID: 

strErrorInfo += "SNMPAPI_OID_INVALID(无效的OID参数)"; 

break; 

case SNMPAPI_OPERATION_INVALID: 

strErrorInfo += "SNMPAPI_OPERATION_INVALID(无效的或不支持的操作)"; 

break; 

case SNMPAPI_OUTPUT_TRUNCATED: 

strErrorInfo += "SNMPAPI_OUTPUT_TRUNCATED(输出缓存长度不够)"; 

break; 

case SNMPAPI_PDU_INVALID: 

strErrorInfo += "SNMPAPI_PDU_INVALID(无效的PDU参数)"; 

break; 

case SNMPAPI_SESSION_INVALID: 

strErrorInfo += "SNMPAPI_SESSION_INVALID(无效的Session参数)"; 

break; 

case SNMPAPI_SYNTAX_INVALID: 

strErrorInfo += "SNMPAPI_SYNTAX_INVALID(smiVALUE中的syntax无效)"; 

break; 

case SNMPAPI_VBL_INVALID: 

strErrorInfo += "SNMPAPI_VBL_INVALID(无效的VBL参数)"; 

break; 

case SNMPAPI_MODE_INVALID: 

strErrorInfo += "SNMPAPI_MODE_INVALID(无效的模式参数)"; 

break; 

case SNMPAPI_SIZE_INVALID: 

strErrorInfo += "SNMPAPI_SIZE_INVALID(无效的长度参数)"; 

break; 

case SNMPAPI_NOT_INITIALIZED: 

strErrorInfo += "SNMPAPI_NOT_INITIALIZED(SnmpStartup函数没有调用或调用失败)"; 

break; 

case SNMPAPI_MESSAGE_INVALID: 

strErrorInfo += "SNMPAPI_MESSAGE_INVALID(无效的SNMP消息格式)"; 

break; 

case SNMPAPI_HWND_INVALID: 

strErrorInfo += "SNMPAPI_HWND_INVALID(无效的窗口句柄)"; 

break; 

case SNMPAPI_OTHER_ERROR: 

strErrorInfo += "SNMPAPI_OTHER_ERROR(不明确的错误)"; 

break; 

//------------------------------------ 

case SNMPAPI_TL_NOT_INITIALIZED: 

strErrorInfo += "SNMPAPI_TL_NOT_INITIALIZED(网络传输层没有被初始化)"; 

break; 

case SNMPAPI_TL_NOT_SUPPORTED: 

strErrorInfo += "SNMPAPI_TL_NOT_SUPPORTED(网络传输层不支持的协议)"; 

break; 

case SNMPAPI_TL_NOT_AVAILABLE: 

strErrorInfo += "SNMPAPI_TL_NOT_AVAILABLE(网络子系统错误)"; 

break; 

case SNMPAPI_TL_RESOURCE_ERROR: 

strErrorInfo += "SNMPAPI_TL_RESOURCE_ERROR(网络传输层资源错误)"; 

break; 

case SNMPAPI_TL_UNDELIVERABLE: 

strErrorInfo += "SNMPAPI_TL_UNDELIVERABLE(目标地址不能到达)"; 

break; 

case SNMPAPI_TL_SRC_INVALID: 

strErrorInfo += "SNMPAPI_TL_SRC_INVALID(来源的末端无效)"; 

break; 

case SNMPAPI_TL_INVALID_PARAM: 

strErrorInfo += "SNMPAPI_TL_INVALID_PARAM(输入的参数无效)"; 

break; 

case SNMPAPI_TL_IN_USE: 

strErrorInfo += "SNMPAPI_TL_IN_USE(来源的末端正被使用)"; 

break; 

case SNMPAPI_TL_TIMEOUT: 

strErrorInfo += "SNMPAPI_TL_TIMEOUT(在超时之前没有得到响应)"; 

break; 

case SNMPAPI_TL_PDU_TOO_BIG: 

strErrorInfo += "SNMPAPI_TL_PDU_TOO_BIG(对于Send或Receive来说PDU太大了)"; 

break; 

case SNMPAPI_TL_OTHER: 

strErrorInfo += "SNMPAPI_TL_OTHER(不明确的网络传输层错误)"; 

break; 

default: 

strErrorInfo += "不知名错误!"; 

break; 

} 

lMsg(strErrorInfo); 

} 







//---------------------------------- 

//名称:GetSnmpMessage 

//描述:解Snmp包 

//---------------------------------- 

SNMPAPI_STATUS GetSnmpMessage(HSNMP_SESSION hSnmpSession, CRecvPduInfo * pRuiStore) 

{ 

SNMPAPI_STATUS s; 

smiOCTETS oct; 

ZeroMemory(pRuiStore, sizeof(CRecvPduInfo)); 

s = SnmpRecvMsg(hSnmpSession, &pRuiStore->hRcvAgentEntity, &pRuiStore->hRcvManagerEntity, 

&pRuiStore->hRcvViewContext, &pRuiStore->hRcvPdu); 

if(s == SNMPAPI_FAILURE) 

{ 

lMsg("SnmpRecvMsg时出错!"); 

GetSnmpErrorDescribe(hSnmpSession); 

return SNMPAPI_FAILURE; 

} 

//得到发送消息代理的IP 

SnmpEntityToStr(pRuiStore->hRcvAgentEntity, 40, pRuiStore->szSourceIp); 

//得到共用体名称 

::SnmpContextToStr(pRuiStore->hRcvViewContext, &oct); 

strcpy(pRuiStore->szCommunity, (const char *)oct.ptr); 

pRuiStore->szCommunity[oct.len] = 0; 

//----------------------------------------------------------------//得到PDU 

s = SnmpGetPduData(pRuiStore->hRcvPdu, &pRuiStore->nPduType, &pRuiStore->nRequestId, 

&pRuiStore->nErrorStatus, &pRuiStore->nErrorIndex, &pRuiStore->hRcvVbl); 

if(s == SNMPAPI_FAILURE) 

{ 

lMsg("SnmpGetPduData时出错!!"); 

GetSnmpErrorDescribe(hSnmpSession); 

return SNMPAPI_FAILURE; 

} 

//得到此PDU中包含的VBlist数量 

pRuiStore->nVblCount = SnmpCountVbl(pRuiStore->hRcvVbl); 

//得到每个VBlist的变量信息 

for (int i = 1; i <= pRuiStore->nVblCount; i++) 

{ 

//!!!!!!!!!!注意!!!!!!!!!!!!!!!// 

//SnmpGetVb中的index是从1开始! 

s = SnmpGetVb(pRuiStore->hRcvVbl, i, &pRuiStore->vblOid[i - 1], 

&pRuiStore->vblValue[i - 1]); 

if(s == SNMPAPI_FAILURE) 

{ 

lMsg("SnmpGetVb时出错!!"); 

GetSnmpErrorDescribe(hSnmpSession); 

return SNMPAPI_FAILURE; 

} 

} 

//!!!注意:释放资源!!!! 

SnmpFreeDescriptor(SNMP_SYNTAX_OCTETS, &oct); 

return SNMPAPI_SUCCESS; 

} 





//---------------------------------- 

//名称:SendSnmpMessage 

//描述:简单的发送Snmp包(一) 

//---------------------------------- 

SNMPAPI_STATUS SendSnmpMessage(HSNMP_SESSION hSnmpSession, DWORD *pRequestId, 

CSendInfo *pSendInfo) 

{ 

SNMPAPI_STATUS status; 

if(!pSendInfo->hAgentEntity || !pSendInfo->hManagerEntity 

|| !pSendInfo->hViewContext) 

{ 

lMsg("参数不全!"); 

return SNMPAPI_FAILURE; 

} 

//-------------------------------------------------------------------------------- 

//设置管理者重试次数 

⌨️ 快捷键说明

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