记一次修改pcap文件

发布于 / 小技巧 / 1 条评论

师弟给发了一个pcap文件

image.png

想要在测试系统内回放这个报文,不知为何,抓到的pcap里面居然有长度1518的包,按理说由于MTU的限制,最大长度应该是1514才对。

仔细检查这两个包,发现在TCP payload的结尾多出了4个字节

image.png

原来是多了4个帧校验序列。但是测试系统的引擎或网卡存在某些机制,如果长度超过1514,则无法正常回放。准备删除这四个字节。

编辑原始pcap文件,直接上010editor,搜图中所示多出的字节 8e a1 f6 53

image.png

直接删除,保存,重新用wireshark打开

image.png

GG......

推测可能是Pcap还有一些类似元数据的字节应该修改。

百度搜了下pcap的存储结构

image.png

struct pcap_pkthdr{
    struct tim ts;
    DWORD caplen;
    DWORD len;
}

struct tim{
    DWORD GMTtime;
    DWORD microTime;
}

果然有长度信息,因为删除了4个字节,长度应该减4,而我们没有修改长度,造成后续包的数据错位,Wireshark也就识别不出来了。

想要修改它就要找到这个包的packet header。为了定位到这个包的Packet Header部分,我们先找上一个包的结尾字节

image.png

上一个包的结尾是95 28 d2 54

接着找我们要修改的包的开头

image.png

是02 1a c5

可以判断,要修改的包的packet header在95 28 d2 54和02 1a c5之间

010Editor上搜一下,果然有16个字节

image.png

前8个字节应该是timestamp,后两个应该是length。发现1518=0x05ee,推测这里可能是小端存储。

我们刚刚删除了4个字节,新的长度应该是1514,即0x05ea。

将两个EE 05修改为EA 05,保存。

image.png

重新打开Wireshark

image.png

可以看到长度成功改成1514了。

22.3.2更新:

师弟写了份010editor的脚本,如果遇到了同样的问题,可以用该脚本解决。

//------------------------------------------------
//--- 010 Editor v10.0 Script File
//
//      File: 
//   Authors: 
//   Version: 
//   Purpose: 
//  Category: 
//   History: 
//------------------------------------------------
HexReplace("EE050000EE050000","EA050000EA050000");
//被替换的16进制字符串
//下面俩函数是将字符串转化为16进制的格式
int HexReplace(string sourceStr, string targetStr)
{
    int len=Strlen(sourceStr)/2;
    int i;
    uchar sourceBuf[len];
    uchar targetBuf[len];
    
    string tmp,tmp2;
    for ( i=0; i<len ; i++)
    {
        tmp=SubStr(sourceStr,i*2,2);
        sourceBuf[i]=Convert(tmp);

        tmp2=SubStr(targetStr,i*2,2);
        targetBuf[i]=Convert(tmp2);

        //Printf(tmp + "\n");
    }

    //Printf(sourceBuf);
    int n=ReplaceAll(sourceBuf,targetBuf);
    return 1;
}

uchar Convert (string hexNumber)
{
    uchar aChar;
    char highOrderDig = hexNumber[0];
    char lowOrderDig = hexNumber[1];
    int lowOrderValue =GetDigitValue(lowOrderDig) ;
    int highOrderValue = GetDigitValue(highOrderDig);
    aChar = lowOrderValue + 16 * highOrderValue;
    return aChar;
}

int GetDigitValue (char digit)
{
    int asciiOffset, digitValue;
    if (digit >= 48 && digit <= 57)
    {
        asciiOffset = 48;
        digitValue = digit - asciiOffset;
        return digitValue;
    }
    else if (digit >= 65 && digit <= 70)
    {
        // digit is 'A' through 'F'
        asciiOffset = 55;
        digitValue = digit - asciiOffset;
        return digitValue;
    }
}
//在查找到的16进制串后进行删除操作,可自行改参数调整删除内容位置即长度
int j; 
TFindResults w = FindAll( "EA050000EA050000,h", true, false,  FINDMETHOD_WILDCARDS ); 
//获取查找字符串的位置等相关信息 
Printf( "%d\n", w.count ); 
for( j = 0; j < w.count; j++ )
    DeleteBytes(w.start[j]+(1522-j*4), 4);
    //w = FindAll( "EA050000EA050000,h", true, false,  FINDMETHOD_WILDCARDS );

转载原创文章请注明,转载自: 斐斐のBlog » 记一次修改pcap文件
  1. NULL

    貌似Windows自带有TCP优化,在设置里设置一下就可以正常显示了不需要截断。