一个关于抓包后文件解析的问题,首先,需要了解pcap文件的结构,通过了解,我定义了一个叫做SomeTypes.h的头文件
typedef unsigned int DWORD;
typedef unsigned short WORD;
typedef struct timeval
{
DWORD GMTtime;
DWORD microTime;
}timeval;
typedef struct pcap_pkthdr
{
struct timeval ts;
DWORD caplen;
DWORD len;
}pacp_pkthdr;
typedef struct pcap_file_header
{
DWORD magic;
WORD version_major;
WORD version_minor;
DWORD thiszone;
DWORD sigfigs;
DWORD snaplen;
DWORD linktype;
}pcap_file_header;
因为是在控制台下写的c语言代码而不是VC下,所以DWORD,WORD类型需要自己定义
其次,在MessageAlynasis.cpp中,实现了一下功能:在庞大的pcap文件中,分析出几千条数据包,把这些数据包的大小一一列到控制台,并且把数据包中含有特征字符串“HTTP”的寻找出来,有多少个数据包包含该特征字符串,就把这个数量写到控制台,同时,
,将这些数据包的内容写到ActualChars.txt中。
// MessageAlynasis.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "SomeTypes.h"
bool compareBinary(char *src,char *obj){
//对于报文中查找特征字符,其实用普通的查找效率已经很好,因为很多都是乱码,所以很少会存在aaab--aaac的情况
int len_src=strlen(src),len_obj=strlen(obj);
int flag=0;
for(int i=0;i<len_src-len_obj+1;i++){
flag=0;
for(int j=0;j<len_obj;j++){
if(*(src+i+j)!=*(obj+j)){
flag=1;
break;
}
}
if(flag==1) continue;
return true;
}
return false;
}
//文件输出到控制台
void fileView_test(FILE *fp,int len){
int i=0;
printf("start.....\n");
while(i++<len && !feof(fp)){
printf("%X ",fgetc(fp));
}
printf("end.....\n");
}
//输出字符串中的正常字符到文件中
void printActualChars(char *p,FILE *fp){
fprintf(fp,"\nthe one has %d words:\n",strlen(p));
for(int i=0;i<strlen(p);i++){
while(*p++=='\0' || *p<0 || *p>127) ;
fprintf(fp,"%c",*p);
}
}
//分析pcap
int pcapAlynasis(FILE *fp){
int i=0,j=0;
char ch[10000],*p,c;
p=ch;
pcap_pkthdr data_head;
FILE *fp1=fopen("D:/ActualChars.txt","w");
FILE *fp0=fopen("D:/AllActualChars.txt","w");
fseek(fp,sizeof(struct pcap_file_header),0);
while(!feof(fp)){
fread(&data_head,sizeof(pcap_pkthdr),1,fp);
printf("data %d has %d data.\n",i+1,data_head.caplen);
//fread(ch,data_head.caplen,1,fp); fread会把\0结束符也读入,这样作为实参是不会把后续的字符串传给形参的
for(int k=0;k<data_head.caplen;k++){
if((c=fgetc(fp))!='\0') *p++=c;
}
p=ch;
if(compareBinary(p,"HTTP")){
j++;
printActualChars(ch,fp1);
}
i++;
printActualChars(ch,fp0);
}
printf("all:%d\nget:%d",i,j);
return 1;
}
int main(){
FILE *fp = fopen("D:/emule.pcap","rb");
pcapAlynasis(fp);
if(fp == NULL){
printf("cannot open file.");
return 0;
}
return 1;
//return pcapAlynasis1(fp);
}
以上程序通过vc++6.0运行测试,测试机要求:必须有D盘
同时,陆续会把MVC版的程序发来
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述