师弟给发了一个pcap文件
想要在测试系统内回放这个报文,不知为何,抓到的pcap里面居然有长度1518的包,按理说由于MTU的限制,最大长度应该是1514才对。
仔细检查这两个包,发现在TCP payload的结尾多出了4个字节
原来是多了4个帧校验序列。但是测试系统的引擎或网卡存在某些机制,如果长度超过1514,则无法正常回放。准备删除这四个字节。
编辑原始pcap文件,直接上010editor,搜图中所示多出的字节 8e a1 f6 53
直接删除,保存,重新用wireshark打开
GG......
推测可能是Pcap还有一些类似元数据的字节应该修改。
百度搜了下pcap的存储结构
struct pcap_pkthdr{
struct tim ts;
DWORD caplen;
DWORD len;
}
struct tim{
DWORD GMTtime;
DWORD microTime;
}
果然有长度信息,因为删除了4个字节,长度应该减4,而我们没有修改长度,造成后续包的数据错位,Wireshark也就识别不出来了。
想要修改它就要找到这个包的packet header。为了定位到这个包的Packet Header部分,我们先找上一个包的结尾字节
上一个包的结尾是95 28 d2 54
接着找我们要修改的包的开头
是02 1a c5
可以判断,要修改的包的packet header在95 28 d2 54和02 1a c5之间
010Editor上搜一下,果然有16个字节
前8个字节应该是timestamp,后两个应该是length。发现1518=0x05ee,推测这里可能是小端存储。
我们刚刚删除了4个字节,新的长度应该是1514,即0x05ea。
将两个EE 05修改为EA 05,保存。
重新打开Wireshark
可以看到长度成功改成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 );
貌似Windows自带有TCP优化,在设置里设置一下就可以正常显示了不需要截断。