通过在网络选项卡中选上仅以HTTP协议传输数据来达到目的。这样子可以方便地观察整个过程。
客户端发送连接请求:
POST /service HTTP/1.1
Accept: */*
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 68
Host: 114.246.26.34:8080
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)
.QVOD protocol..............Md..a.>...4..`}...'U.5..0057BB5855719946 -------数据包data部分
服务端响应:
Accept: */*
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 68
Host: 211.101.48.70:2596
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)
.QVOD protocol..............Md..a.>...4..`}...'UQVOD0066E67A1F1C15F6 --------数据包data部分
HTTP数据包详细内容
13 51 56 4f .QVO
44 20 70 72 6f 74 6f 63 6f 6c 00 00 00 00 00 00 D protoc ol......
00 00 00 00 00 00 00 00 4d 64 ac 80 61 e2 3e 98 ........ Md..a.>.
a7 90 34 01 82 60 7d a0 1e 80 27 55 f5 35 ee a7 ..4..`}. ..'U.5..
30 30 35 37 42 42 35 38 35 35 37 31 39 39 34 36 0057BB58 55719946
从客户端发送的HTTP数据包详细内容来看。有一些固定字段,但有些部分存在不确定性。可以先对这个协议数据结构进行猜测。通过大量的对比后可以从中发现一些比较有特点的地方,通过总结特点可以发现一些规律。经过对比后先假设这个发送数据包的协议结构如下所示:
struct httpqvod
{
short int fixed;//always 0x13
char p2ptype[];
char unknow[32];
char unknow[20];
}
选择OD和IDA来逆向分析找出协议结构。
因为我们要尝试去探索发送数据包的结构,由于使用HTTP传输,所以是TCP连接,使用的是send函数。
使用OD attach QvodTerminal.exe进程,OD成功断在了send函数的地方
单步运行几步,跳出系统函数部分。找到调用send的地方。
通过使用IDA加载QvodTerminal.exe分析数据来源。分析函数调用过程
不断地回朔上去,使用OD动态分析找到数据包的内存中变化过程。
这个过程很容易发现004119B7处通过调用call dword ptr[edx+8]来达到跳转的目的
下面通过IDA加载这一部分进行分析,可以发现如下所示
通过mov [esp+54h+var_44],13h来赋值0x13,由此可以得知0x13为固定字节。然后通过的赋值可以判断来下面是协议标识部分的赋值,即是QVOD Protocol或者BitTorrent protocolex是协议标识。
接下来如下所示进行赋值一堆数据,暂时还是标志为unknow[32].然后通过赋值mov esi,offset dword_485038来对赋值一串序列号。
这是有20位的类似UID的一串字符,标识为char client-uid[20]。
所以整个数据结构可以得出为
struct httpqvod
{
short int fixed;//always 0x13
char p2ptype[];//固定值,QVOD Protocol 或者 BitTorrent protocolex
char unknow[32];
char client-uid[20];//包含一些版本、哈希值等信息
}
参考书籍:
《IDA.Pro代码破解揭秘》第七章
QVOD HTTP数据包结构分析.doc谢谢各位
[课程]Linux pwn 探索篇!