云文档网 - 专业文章范例文档资料分享平台

网络工具软件开发实训指导书-2013

来源:网络收集 时间:2024-05-02 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

附件2

《网络工具软件开发实训》指导书

课程类别: 专业必修课

适用对象:信息安全技术专业(3年制) 独立实践学时:27

一、实训内容及要求

《网络工具软件开发实训》目的是培养学生使用Visual C++平台开发网络工具软件的开发能力。 (一)实训内容如下:

1. 讨论组程序设计与开发 2. 远程关机与远程唤醒工具开发 3. sniffer、IP工具开发 (二)实训要求如下:

按照实训指导书的要求完成程序源代码的编写,并调试、运行成功。

(三)需提交资料

实训结束时,学生需要提供以下资料: 1. 实训报告 2. 程序源代码

二、实训过程(含步骤)

1. 查看实训指导书的要求,分析实现方法 2. 编写程序源代码

附件2

3. 调试程序 4. 完成实训报告 三、实训报告的编写指导

要规定详细的报告格式,要求明确,可操作性强,审批报告的评分标准等

四、实训学时分配

学时分配: 实训教学总学时数为27学时,其中讲授学时5,实操22

学时分配表

序号 1 2 3 4 实 训 内 容 讨论组程序设计与开发 远程关机与远程唤醒工具开发 sniffer、IP工具开发 总结、实训报告 学 时 总 计 其 中 学时 讲授 实操 其他 12 2 10 6 6 3 27 1 1 1 5 5 5 2 22 五、参考资料:

讨论组程序开发指导书

一. 任务描述

界面如图所示:

附件2

通过点击单选按钮,选择要进入的聊天室,然后单击“进入”按钮,弹出聊天信息对话框,如下图:

具体的聊天功能参考教材第5章的实例。

二. 要点提示——如何弹出新的对话框?

首先,在左侧的资源列表里,插入一个新的对话框。

附件2

然后,用鼠标双击对话框,选择为其创建一个新的类,类名叫CChat。

最后在需要弹出该对话框的地方写出如下代码:

测试,是否能够弹出对话框?

三. 实现步骤

1. 创建工程,在工程中添加一个新的对话框,并给它建立类。(具体步骤见上面) 2. 在主界面上给每个单选按钮添加消息响应函数(即鼠标双击每个单选按钮,自动生成函数),在每个函数中给聊天室的IP地址赋值。如图:

附件2

一共有6个单选按钮,仿照上面,要给6个聊天室的IP地址都赋值。变量roomIP是自己定义的类的成员变量,CString类型,用来保存每个聊天室的多播地址。 3. 给聊天对话框界面上添加相应的功能。

1. 在对话框类的构造函数里添加代码,创建新线程。

2. 在线程里实现循环接收所有发到指定聊天室的聊天信息,并显示在界面上的ListBox控

件里。

3. 给“发送”按钮添加消息响应函数,实现发送聊天信息的功能。 4. 给“退出聊天室”按钮添加消息响应函数,实现退出和关闭的功能。 此部分的代码参考教材第五章的实例完成

四. 任务扩展

要求:在聊天室界面上添加两个新的按钮,分别是“保存”和“浏览”。单击“保存”按钮,程序将聊天信息保存到本地文件bc.txt。单击“浏览”按钮,程序将本地文件bc.txt的内容显示到界面上的列表中。

附件2

提示:文件新建、写、读关闭等操作参考教材第3章。

CFile 类应用:

CFile类是MFC文件类的基类,提供非缓冲方式的二进制磁盘输入、输出功能;并直接通过派生类来支持文本文件和内存文件。提供访问本地文件内容的功能,不支持访问网络文件的功能。CFile类的声明保存在afx.h头文件中。

CFile类的成员变量:

m_hFile:表示一个打开文件的操作系统文件句柄。

? 创建文件

创建一个CFile对象时,可以采用3种方法实现: (1)CFile myFile;

myFile.Open(LPCTSTR lpFileName,UINT nOpenFlags,CFileException * pError = NULL); (2)CFile myFile(int hFile); 采用句柄方式创建。使用该创建方法,在之前需要调用 CreateFile()函数,该函数的声明如下:

HANDLE CreateFile(

LPCTSTR lpFileName, //文件名称

DWORD dwDesiredAccess, //文件访问的模式 DWORD dwShareMode, //文件的共享模式 LPSECURITY_ATTTRIBUTE lpSecurityAttribute, DWORD dwCreationDisposition, //访问方式 DWORD dwFlagsAndAttribute, //文件属性

HANDLE hTemplateFile, //临时文件句柄 );

(3)CFile(LPCTSTR lpFileName,UINT nOpenFlags);

lpFileName是文件名称,可以是相对路径,绝对路径或者网络路径。nOpenFlags是打开文件的方式。

打开文件可选用的方式有:

CFile::modeCreate:构造新文件,如果文件存在,则长度变为0。

CFile::modeNoTruncate:该属性和modeCreate联合使用,可以达到如下效果:如果文件存在,则不会将文件的长度置为0,如果不存在,则会由modeCreate属性来创建一个新文件。

CFile::modeRead:以只读方式打开文件 CFile::modeWrite:以写方式打开文件

CFile::modeReadWrite:以读、写方式打开文件 CFile::modeNoInherit:阻止文件被子进程继承

CFile::shareDenyNone:不禁止其它进程读写访问文件,但如果文件已经被其它进程以兼容模式打开,则创建文件失败。

CFile::shareDenyRead:打开文件,禁止其它进程读此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程读,则create失败。

CFile::shareDenyWrite:打开文件,禁止其它进程写此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程写,则create失败。

CFile::shareExclusive:以独占模式打开文件,禁止其它进程对文件的读写,如果文件已经被其它模式打开读写(即使是当前进程),则构造失败。

附件2

CFile::typeText:对回车、换行设置特殊进程(仅用于派生类) CFile::typeBinary:设置二进制模式(仅用于派生类) (4)virtual void Close();

关闭文件和对应的CFile对象。如果在删除了对象之前没有关闭文件,那么析构函数会关闭文件。如果是用new方式创建的CFile对象,那么你必须在删除了CFile对象后关闭文件。Close函数将设置m_hFile为CFile::hFileNull。该函数和创建CFile对象函数成对使用。 (5)virtual BOOL Open(

LPCTSTR lpFileName, UINT nOpenFlags,

CFileException* pError = NULL);

参数前面已有详解,此处不做赘述。

? 读写文件

(1)virtual UINT CFile::Read( void* lpBuf, UINT nCount );

该函数的功能是从文件中读取文件内容。返回值是读出的字节数,可能与nCount相等,也可能小于nCount。

参数lpBuf:存放读出的文件内容的空间地址。 参数nCount:从文件读出的最大字节数。

(2)virtual void Write( const void* lpBuf, UINT nCount );

该函数的功能是向文件中写数据。

参数lpBuf:存储要写入文件的数据的空间地址。 参数nCount:要写入文件的数据的字节数。

远程关机——shutdown

程序设计与实现

InitiateSystemShutdown()有一个参数LPTSTR lpMachineName,可以指定为网络上的计算机名字(或IP地址),也就是说,可以远程关闭网络上的他计算机(如果你的用户在该计算机上有足够的权限的话)。调用InitiateSystemShutdown()函数关闭远程计算机需要先获得SE_SHUTDOWN_NAME权限,可以通过AdjustTokenPrivileges()函数来修改进程的权限。

远程关机应用程序运行界面如图8-2所示:

图8-2 远程关机程序运行界面

创建一个基于对话框的应用程序,界面上有一个文本输入框,用来输入要被关闭的计

附件2

算机名(或IP地址),界面下方有三个按钮,第一个按钮实现远程重启计算机的功能,第二个按钮实现远程关闭计算机的功能,第三个按钮关闭对话框。

给文本编辑框添加一个关联的成员变量m_host,类型是CString。给“重启”和“关机”按钮添加消息处理函数。

“重启”按钮的消息处理函数实现源代码如下: void CShutDownDlg::OnRestart() { UpdateData(TRUE); char *host; host=m_host.GetBuffer(m_host.GetLength()); shutdownHost(host,TRUE);//调用shutdownHost函数实现远程重启计算机功能 }

“关机”按钮的消息处理函数实现源代码如下: void CShutDownDlg::OnShutdown() { UpdateData(TRUE); char *host; host=m_host.GetBuffer(m_host.GetLength()); shutdownHost(host,FALSE);//调用shutdownHost函数实现远程关闭计算机功能 }

/*---------------------------------------------------------------------------------- 线程函数名:shutdownHost

属性:CShutDownDlg类的成员函数(需自定义) 功能:远程关闭或重启计算机

参数hostName--将被关闭的计算机名或IP地址

参数flag--值为TRUE表示要重启,值为FALSE表示要关机

--------------------------------------------------------------------------------------*/ BOOL CShutDownDlg::shutdownHost(char * hostName,bool flag){ HANDLE hToken; TOKEN_PRIVILEGES tkp; BOOL fResult; //得到进程的令牌句柄 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){ MessageBox(\获取进程的令牌句柄出错\ return false; } //获得一个权限对应的LUID值 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; //数组元素的个数 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;// 使能一个权限 //对访问令牌进行修改 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); if (GetLastError() != ERROR_SUCCESS){

附件2

}

MessageBox(\修改访问令牌出错\ return false; }

fResult = InitiateSystemShutdown(hostName, //要关闭的计算机名或IP地址 \程序将要关闭\ //被关闭计算机上显示的信息 10, // 关机前的延迟时间

FALSE, // 对未保存的应用程序是否强制关闭

flag); // TRUE表示要重启,值为FALSE表示要关机 if (!fResult){ MessageBox(\远程关机调用出错\ return false; }

tkp.Privileges[0].Attributes = 0;

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); if (GetLastError() != ERROR_SUCCESS){ MessageBox(\ return false; }

return true;

远程关机——木马

程序设计与实现

程序分成两个部分,一个是控制端程序,一个是木马。控制端程序功能是由用户输入要控制的计算机,并选择“注销”、“关闭”或者“重启”操作,控制端程序将用户的要求发送给目标计算机上木马程序,由木马程序针对目标计算机进行相应操作。运行界面如图8-3所示:

图8-3 控制端程序运行界面

界面上部有一个文本编辑框,让用户输入要操作的计算机,给该文本编辑框添加一个关联的成员变量m_ip,类型是CString。

界面中间部分是上个单选按钮控件,让用户选择要进行的操作。鼠标双击每个单选按钮,会自动给每个单选按钮添加消息处理函数,一旦用户选中该按钮,就会执行该按钮的消

附件2

息处理函数。三个单选按钮的消息处理函数代码如下:

void CControlerDlg::OnRadio0() { m_nType=0;//注销 }

void CControlerDlg::OnRadio1() { m_nType=1;//重启 }

void CControlerDlg::OnRadio2() { m_nType=2;//关机 }

其中的变量m_nType是用户自定义的CControlerDlg类的成员变量,类型是int。(在CControlerDlg类的定义中写入代码:int m_nType;)

界面下部是两个按钮,“远程控制”实现发送远程控制信息给木马程序的功能。“关闭”按钮功能是关闭对话框。“远程控制”按钮的消息处理函数实现代码如下:

void CControlerDlg::OnShut() { UpdateData(true); //发送数据对象的定义 UpdateData(true); CSocket m_SendSocket;//构造一个套接字对象 int port=8888; //数据发送 m_SendSocket.Create(6666,SOCK_DGRAM);//创建一个套接字句柄(UDP) m_SendSocket.SendTo( &m_nType,sizeof(int),port,m_ip);//发送数据给本地计算机 m_SendSocket.Close(); }

木马程序的功能是接收控制端程序发送来的操作要求,针对本地计算机进行“注销”、“关闭”或者“重启”操作。程序运行界面如图8-4所示:

图8-4 关闭计算机的木马程序界面

“启动”按钮实现接收控制端发送来的要求,并按照要求对本地计算机进行“注销”、“关闭”或者“重启”操作。实现代码如下:

void CShutDownDlg::OnShutdown()

附件2

{

CSocket m_ReceiveSocket;//构造一个套接字对象 int nMeg; //接收数据

m_ReceiveSocket.Create(8888,SOCK_DGRAM); m_ReceiveSocket.Receive(&nMeg,sizeof(int));

OSVERSIONINFO OsInfo;//获取操作系统版本信息 switch(nMeg){ case 0: ExitWindowsEx(EWX_LOGOFF,0); //控制端要求注销 break;

case 1://控制端要求重启 //获取操作系统版本信息 OsInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&OsInfo); //Windows 98重启 if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) { ::ExitWindowsEx(EWX_REBOOT,0); } //Windows 2000以上版本重启 if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_NT) { HANDLE hToken; TOKEN_PRIVILEGES tkp;

if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))

{ MessageBox(\无法打开存取令牌\ return; }

LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount=1; tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);

if(GetLastError()!=ERROR_SUCCESS) { MessageBox(\无法重启\ return; } if(!ExitWindowsEx(EWX_REBOOT,0))

附件2

}

MessageBox(\无法重启\ } break;

case 2://控制端要求关机 //获取操作系统版本信息 OsInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&OsInfo); //Windows 98重启 if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) { ::ExitWindowsEx(EWX_SHUTDOWN,0); } //Windows 2000以上版本重启 if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_NT) { HANDLE hToken; TOKEN_PRIVILEGES tkp;

if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) { MessageBox(\无法打开存取令牌\ return; }

LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount=1; tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);

if(GetLastError()!=ERROR_SUCCESS) { MessageBox(\无法重启\ return; } if(!ExitWindowsEx(EWX_POWEROFF | EWX_FORCE,0)) MessageBox(\无法重启\ } break; default: break; }

m_ReceiveSocket.Close();

附件2

远程唤醒

程序设计与实现

要想使用远程唤醒功能,首先必须知道要唤醒机器的MAC (Medium Access Control)地址,MAC地址由用户输入。程序运行后界面如图8-5所示:

图8-5 远程唤醒程序运行界面

界面上有6个文本编辑框,用来输入网卡的MAC地址,这六个文本编辑框的关联成员变量是m_mac1、m_mac2、m_mac3、m_mac4、m_mac5、m_mac6。

“唤醒”按钮的功能是生成魔术包,并将魔术包以广播的发式发送出去,实现唤醒远程计算机的功能。实现原代码如下:

void CPowerOnDlg::OnPoweron() { UpdateData(true); CString macAddr =m_mac1+m_mac2+m_mac3+m_mac4+m_mac5+m_mac6; //生成魔术包 BYTE magicP[108];//存放魔术包数据 for (int i=0;i<6;i++) magicP[i] = 0xff; for (i=0;i<6;i++) { magicP[i+6] = HexStrToInt(macAddr.Mid(i*2,2)); } for (i=0;i<15;i++) memcpy(&magicP[(i+2)*6],&magicP[6],6); //启动WinSock WSADATA WSAData; if (WSAStartup( MAKEWORD(2, 0), &WSAData)!=0) { MessageBox(\ return; } //创建socket SOCKET sock=socket(AF_INET, SOCK_DGRAM, 0); if (sock==INVALID_SOCKET) { MessageBox(\

附件2

return; } //设置为广播发送 BOOL bOptVal=TRUE; if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, sizeof(BOOL))==SOCKET_ERROR)

{ MessageBox(\ closesocket(sock); WSACleanup(); return; } sockaddr_in to; to.sin_family=AF_INET; to.sin_port=htons(0); to.sin_addr.s_addr=inet_addr(\广播地址 //发送Magic Packet if (sendto(sock, (const char *)magicP, 108, 0, (const struct sockaddr *)&to, sizeof(to))==SOCKET_ERROR)

{ MessageBox(\ } else { MessageBox(\ } closesocket(sock); WSACleanup(); }

/*-------------------------------------------------------------------- 线程函数名:HexStrToInt

属性:CPowerOnDlg类的成员函数(需自定义) 功能:将十六进制的字符串转化成长整型 参数hexStr--十六进制的字符串 返回:长整型数字

----------------------------------------------------------------------*/ UINT CPowerOnDlg::HexStrToInt(CString hexStr) { char *stop; char num[3]; UINT res = 0; if (hexStr.GetLength()>2) { TRACE(_T(\ return 0;

附件2

} memset(num,'\\0',3); strcpy(num,hexStr); res = strtol(num,&stop,16); if (res==LONG_MAX || res==LONG_MIN || res==0) { TRACE(_T(\ return 0; } return res; }

远程唤醒需要向LAN中发送一个特定的封包,以便远程计算机能够接收到它,并且启动,该封包就是魔术包。魔术包含如下部分: (1) 6字节的头部。这个头部仅是6字节的Oxff。

(2) 16X6字节数据。要产生这些数据,必须重复远程计算机的MAC地址16次,结构如图

8-6所示:

6 BytesFF FF FF FF FF FFMac AddressMac AddressMac AddressMac Address6 BytesMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac Address16*6=96 Bytes

图 8-6 魔术包格式

(3) 一些客户还需要在包中包含密码,否则它们将不会启动,此密码也称为SecureOn,它将

附加在包的结尾。这种包结构如图8-7所示:

6 BytesFF FF FF FF FF FFMac AddressMac AddressMac AddressMac Address6 BytesMac AddressMac AddressMac AddressMac AddressP1P2P3P4P5P6108 BytesMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac AddressMac Address16*6=96 Bytes

图8-7 带密码的魔术包格式

网络嗅探器

1. 把网卡置于混杂模式

2. 捕获数据包 3. 分析数据包

具体实现流程如图10-1所示:

附件2

初始化WinSock创建原始套接字绑定本机IP设置网卡为混杂模式开始接收数据包否结束有数据到达?结束是分析IP包分析TCP包

图10-1 Sniffer程序流程图

程序设计与实现

本程序是没有图形用户界面的Console程序,因此在新建工程时,要选择“Win32 Console Application”类型。程序运行结果如图10-2所示:

附件2

图10-2 嗅探器运行结果

程序源代码如下: #include \#include #include

#pragma comment(lib, \#include

void DecodeIPPacket(char *pData); void DecodeTCPPacket(char *pData);

//TCP包头结构

typedef struct _TCPHeader // 20字节的TCP头 { USHORT sourcePort; // 16位源端口号 USHORT destinationPort; // 16位目的端口号 ULONG sequenceNumber; // 32位序列号 ULONG acknowledgeNumber; // 32位确认号 UCHAR dataoffset; // 高4位表示数据偏移 UCHAR flags; // 6位标志位 USHORT windows; // 16位窗口大小 USHORT checksum; // 16位校验和 USHORT urgentPointer; // 16位紧急数据偏移量 } TCPHeader, *PTCPHeader;

//IP包头结构

typedef struct _IPHeader // 20字节的IP头 {

UCHAR iphVerLen; // 版本号和头长度(各占4位) UCHAR ipTOS; // 服务类型

USHORT ipLength; // 封包总长度,即整个IP报的长度 USHORT ipID; // 封包标识,惟一标识发送的每一个数据报 USHORT ipFlags; // 标志

UCHAR ipTTL; // 生存时间,就是TTL

UCHAR ipProtocol; // 协议,可能是TCP、UDP、ICMP等 USHORT ipChecksum; // 校验和 ULONG ipSource; // 源IP地址 ULONG ipDestination; // 目标IP地址 } IPHeader, *PIPHeader;

void main() { WSADATA wsaData; int ret;

附件2

if((ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0) { printf(\初始化WinSock出错\ return; } // 创建原始套节字 SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP); // 获取本地IP地址 char szHostName[56]; SOCKADDR_IN addr_in; struct hostent *pHost; gethostname(szHostName, 56); if((pHost = gethostbyname((char*)szHostName)) == NULL) return ; // 在调用ioctl之前,套节字必须绑定 addr_in.sin_family = AF_INET; addr_in.sin_port = htons(0); memcpy(&addr_in.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length); printf(\ if(bind(sRaw, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR) return; // 设置SIO_RCVALL控制代码,以便接收所有的IP包 DWORD dwValue = 1; if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0) return ; // 开始接收封包 char buff[1024]; int nRet; while(TRUE) { nRet = recv(sRaw, buff, 1024, 0); if(nRet > 0) { DecodeIPPacket(buff);//解析IP包 } } closesocket(sRaw); WSACleanup(); }

/*------------------------------------------------------------------------------------------------------------ 线程函数名:DecodeIPPacket 属性:自定义函数

功能:解析IP数据包,取出源IP地址和目的IP地址,判断是否是TCP包,如果是, 继续解析。

附件2

参数pData--包数据

-----------------------------------------------------------------------------------------------------------*/ void DecodeIPPacket(char *pData) { IPHeader *pIPHdr = (IPHeader*)pData; in_addr source, dest; char szSourceIp[32], szDestIp[32]; printf(\ // 从IP头中取出源IP地址和目的IP地址 source.S_un.S_addr = pIPHdr->ipSource; dest.S_un.S_addr = pIPHdr->ipDestination; strcpy(szSourceIp, ::inet_ntoa(source)); strcpy(szDestIp, ::inet_ntoa(dest)); printf(\%s -> %s \\n\ // IP头长度 int nHeaderLen = (pIPHdr->iphVerLen & 0xf) * sizeof(ULONG); switch(pIPHdr->ipProtocol) { case IPPROTO_TCP: // 调用函数解析TCP包 DecodeTCPPacket(pData + nHeaderLen); break; case IPPROTO_UDP: break; // 本程序没有对UDP包解析,如果需要,可添加相应代码 case IPPROTO_ICMP: break; // 本程序没有对ICMP包解析,如果需要,可添加相应代码 } }

/*------------------------------------------------------------------------------------------- 线程函数名:DecodeTCPPacket 属性:自定义函数

功能:解析TCP包判断是哪个端口的数据。 参数pData--包数据

--------------------------------------------------------------------------------------------*/ void DecodeTCPPacket(char *pData) { TCPHeader *pTCPHdr = (TCPHeader *)pData; printf(\Port: %d -> %d \\n\ntohs(pTCPHdr->sourcePort), ntohs(pTCPHdr->destinationPort));

// 下面可根据目的端口号进一步解析应用层协议,此处代码可根据需要自行修改。 switch(::ntohs(pTCPHdr->destinationPort)) { case 21: printf(\端口使用FTP\ //可根据需要进一步详细分析,添加代码 break;

附件2

}

case 80: printf(\端口数据\ //可根据需要进一步详细分析,添加代码 break; case 8080: printf(\端口数据\ //可根据需要进一步详细分析,添加代码 break; }

百度搜索“yundocx”或“云文档网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,云文档网,提供经典综合文库网络工具软件开发实训指导书-2013在线全文阅读。

网络工具软件开发实训指导书-2013.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.yundocx.com/wenku/192488.html(转载请注明文章来源)
Copyright © 2018-2022 云文档网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219