笔者在写一个程序,通过分析网络中的数据包,还原出MSN通信中传输文件的名称和文件名等信息。(网络审计用的)
MSN传输文件时,首先双方通过INVITE建立session连接,文件名称就在建立session中传输过去的。
相应的INVITE数据如下:
-------------------------
INVITE MSNMSGR:msngroup9765@hotmail.com MSNSLP/1.0
To: <msnmsgr:msngroup9765@hotmail.com>
From: <msnmsgr:wyh_arm@hotmail.com>
Via: MSNSLP/1.0/TLP ;branch={377258D9-AB5F-4FAA-9C43-EC7BC9D0B2CB}
CSeq: 0
Call-ID: {39E58F82-55DD-4244-9687-96742B67E331}
Max-Forwards: 0
Content-Type: application/x-msnmsgr-sessionreqbody
Content-Length: 881
EUF-GUID: {5D3E02AB-6190-11D3-BBBB-00C04F795683}
SessionID: 17586590
SChannelState: 0
AppID: 2
Context: PgIAAAIAAAA6qB8AAAAAAAEAAABwAGsAdABmAGkAbAB0AGUAcgAyADAAMQAxADAAMQAxADAALgByAGEAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
---------------------------------
解释:
INVITE MSNMSGR:
--- 此为INVITE通信数据包的起始标志,不是BYE...
EUF-GUID
---在数据传输时始终为: {5D3E02AB-6190-11D3-BBBB-00C04F795683}
Content-Type: application/x-msnmsgr-sessionreqbody
---表示本数据包为建立连接的session INVITE数据包
Context:
---为文件名的其实标志,后面的字符串包括了文件的名称,大小。。。
---此处包含文件长度和文件名,以及其他信息,文件名部分用uft-16编码,最后整个信息用base64编码。
---在提取文件长度和文件名时,我采用 如下方法:Context:后面前 24个字符为 文件名以外的信息,因此应该取前24个字符做base64解码,解码后的第8-11字节就是文件长度(从0字节开始计数)。 低位为文件大小的 低位。 如decode 后的 8-11 byte为: 3a a8 1f 00,则文件大小为 0x 1fa83a.
---从第24字节开始为文件名称,取后面的字符,解码后即为文件名称。
参考链接:
http://msnpiki.msnfanatic.com/index.php/MSNC:File_Transfer
http://hi.baidu.com/weiweicp/blog/item/13b40b3014e20b1eeac4af5c.html