计算机网络的课程要求我们做一个HTTP服务器或者STMP邮件发送代理.
这两个都是基于TCP协议的,在Java下使用Socket连接,应该是很简单的,所以我直接丢给组内其它同学做了.
而我下面做的,是一个Sniffer和Packet Sender的结合工具.使用WinPcap.
由于WinPcap已经做了大部分的事情,所以Sniffer的实现就没什么特殊之处,唯一一点,就是可以把数据包存储到文件里面.
而Packet Sender也是很简单的,就是把磁盘上指定的文件作为Packet,发送出去而已.测试的时候,我自己制作了一个IP攻击的Packet,以广播方式发送出去,类式网络执法官那样的功能.最后的测试是成功了的.
下面这个是我测试IP攻击的ARP数据包.攻击的IP是192.168.0.2.
为了防治别人查看的记录,所以,里面的发送段MAC地址,我是乱写的.
下面这个是ARP包的图解说明
下面就是程序代码.
/*
eth tool source code
author: tangl_99
update: 2005/5/27
*/
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "Include/packet32.h"
#include "Include/ntddndis.h"
// #define _MY_DEBUG
#define MAX_NUM_ADAPTER 10
#define MAX_LEN_ADAPTER_NAME 1024
char SelectedAdapterName[MAX_LEN_ADAPTER_NAME];
LPADAPTER lpAdapter = 0; //define a pointer to an ADAPTER structure
// Prototypes
int SelectAdapter();
int OpenAndInitAdapter();
int SniffAndSaveToFile(const char *filename,int Hex);
int SniffAndPrintOut();
int SendPacketsFromFile(const char *filename,int count);
void PrintUsage();
void PrintPackets(LPPACKET lpPacket);
void PrintGetStatus();
int WritePacketsInHex(LPPACKET lpPacket,FILE *fp);
int WritePacketsInBin(LPPACKET lpPacket,FILE *fp);
int SendPacket(char* buf, ULONG bufsize);
void CloseAdapter();
int main(int argc,char *argv[])
{
#ifdef _MY_DEBUG
char *default_argv[] = {
"eth","-send",
"ipshock.pak", "90000",
};
argv = default_argv;
argc = 4;
#endif
if(argc < 2)
{
PrintUsage();
return 0;
}
// select networking adapter
SelectAdapter();
// initialize the adapter
OpenAndInitAdapter();
if(strcmp(argv[1],"-sniff") == 0) // sniffing packets
{
if(argc == 2) // print packet data on screen
SniffAndPrintOut();
else // save packet data in file
{
int hex; // hex or bin
if(argc == 3) hex = 1; // hex
else
hex = strcmp(argv[3],"bin") == 0 ? 0:1;
SniffAndSaveToFile(argv[2],hex);
}
}
else if(strcmp(argv[1],"-send") == 0) // sending packets
{
int count = 1; // count for sending
if(argc < 3)
{
PrintUsage();
return 0;
}
if(argc == 4)
count = atoi(argv[3]);
else
count = 1;
SendPacketsFromFile(argv[2],count);
}
else // otherwise
{
PrintUsage();
return 0;
}
//print the capture statistics
PrintGetStatus();