使用wireshark或者科来网络分析抓到数据包后,由于原始文件传输过程中会转换成二进制流,抓包工具会把二进制流转换成ASCII码,而ASCII只支持127个字符,其他的字符如果被转换成ASCII将会显示为乱码。因此需要将数据流还原成文件以供阅读,其中关键在于识别二进制/ASCII码文件的头和尾

测试工具:wireshark、科来网络分析
软件:notepad++

情况一 get方法请求图片

1、这种情况一般为url请求 http://XXXX/uploads/ceshi.png,网站直接返回图片
Snipaste_2019-06-30_21-42-50.png
2、响应包的Content-Type直接为image/png,表明响应包的正文即为文件数据,不包含其他信息。
Snipaste_2019-06-30_21-46-03.png
3、这时候用wireshark的直接导出功能,是最方便的。选择文件-导出对象-HTTP
Snipaste_2019-06-30_21-53-51.png
4、选定要导出的图片,保存出来就好了。
Snipaste_2019-06-30_21-57-34.png

情况二 POST方法上传图片

方法一

1、请求包的正文中带有图片的二进制流,如果用情况一的方法把流量保存为xxx.png导出的话,发现导出的图片无法正常显示。
Snipaste_2019-06-30_22-02-49.png
Snipaste_2019-06-30_22-06-54.png
2、用notepad++打开发现文件头尾中包含多余的信息,直接把头尾多余的信息删掉,再重新保存就可以还原图片了。
Snipaste_2019-06-30_22-14-47.png
Snipaste_2019-06-30_22-15-19.png

这种方法适合在ASCII码下能正确识别文件头尾边界的情况,比如图片文件头部乱码与conten-type明显分割,结尾明显的一串NUL

方法二

1、由于数据直接是二进制的方式在网络中传输,所以找到该文件头尾的二进制标志即可还原文件。
2、利用hex编辑器或者其他工具(这里我用科来网络分析,毕竟免费)查看二进制数据,结合ASCII码的内容,找到头部的0d 0a 0d 0a这串16进制,“0d”表示光标移到同一行的顶头——回车(CR),“0a”是把光标移到下一行——换行(LF),“0A“、”0D”一起用,使光标到下一行的开始处,而用了两次就表明有空行,这与ASCII码显示的空行相互对应上了。
3、数据从0d 0a 0d 0a后第一个字符开始选。
Snipaste_2019-06-30_23-39-37.png
4、一直到最后出现的0d 0a,这里需要结合ASCII码来判定文件末尾
Snipaste_2019-06-30_23-41-13.png
5、把二进制数据复制到notepad++中,然后全选,把hex转换成ASCII码,保存为XXX.png文件就大功告成了!
Snipaste_2019-06-30_23-45-09.png

总结

其他文件格式的还原方法与图片也是类似的,只要确定了文件二进制格式头尾的情况,就可以做到文件还原。如果大文件传输,网站可能采用分块传输的方式,需要注意单个数据包携带的数据不全,那样用wireshark导出对象的方式更好。

参考文档:
https://blog.51cto.com/yttitan/1738099
https://www.jianshu.com/p/2e1d3110593a
https://blog.csdn.net/chrycoder/article/details/86525316
Last modification:July 1st, 2019 at 12:08 am