参考:http://blog.renren.com/blog/239362558/903375190
一些简单逆向工程时的笔记,没有仔细整体,欢迎交流。基本的结论是:
1. 微信划分了http模式(short 服务)和 tcp 模式(long 服务),分别应对状态协议和数据传输协议
2. 从抓包观察到的流程看,其协议不是太复杂,但是代码混淆较重,逆向代价较大
1. 使用逆向工程的工具,主要照顾安卓版
在mac下使用brew比较容易:brew install apktool
2. 下载最新的微信apk,4.5 2013 - 04 - 12
3. 反编译后建立工程
apktool d com.tencent.mm.apk weixin
可以在生成的weixin文件夹,浏览其工程结构,但是smali文件本身看的实在是头疼,用 dex2jar 工具 (https://code.google.com/p/dex2jar/ )简单转换为一个jar包后使用 jd-gui 查看。
3.1 使用 d2j-dex2jar.sh 转换为jar包
3.2 使用 jd-gui 阅读
结构:
1. com.tecent.mm.booter.CoreService 可以看到核心入口,可以看到这是一个activity
2. com.tecent.mm.ad -> com.tecent.mm.network 这个是网络核心包,做了极度的混淆
到这里发现实在没有精力去猜测了,还是直接抓包方便一些
协议抓包:
1. 先获取手机的root权限,刷机,应该申请一个方便一键刷机的机型。
http://jingyan.baidu.com/article/e8cdb32b847aa937052bad35.html
2. 获取一个安卓版本的tcpdump
http://www.eecs.umich.edu/~timuralp/tcpdump-arm
3. 获取一些dump数据
3.1 ./tcpdump -p -s 0 -w /sdcard/capture.pcap
3.2 登陆微信,进行一些发送接受操作
3.3 ctrl-c 掉 tcpdump
3.4 将 capture.pcap adb pull回来
4. 用wireshark进行分析
tshark -r capture.pcap -Vx > capture.ana
tshark -r capture.pcap -Vx -z expert,ip.addr==180.153.218.191 > capture.long
tshark -r capture.pcap -Vx -z expert,ip.addr==180.153.82.27 > capture.short
5. 结论:
微信包含了两类服务器 short (short.weixin.qq.com) 和 long (long.weixin.qq.com)
其中long的量较多,dns可以查到6台入口,short有2台
long 服务分析:
long.weixin.qq.com: type A, class IN, addr 180.153.218.191
Name: long.weixin.qq.com
Type: A (Host address)
Class: IN (0x0001)
Time to live: 12 minutes, 56 seconds
Data length: 4
Addr: 180.153.218.191 (180.153.218.191)
long.weixin.qq.com: type A, class IN, addr 101.226.62.23
Name: long.weixin.qq.com
Type: A (Host address)
Class: IN (0x0001)
Time to live: 12 minutes, 56 seconds
Data length: 4
Addr: 101.226.62.23 (101.226.62.23)
……
1. 抓包的结果是看到大量的http-alt,如果不意外的话,应该是LVS集群,提供长连接的tcp服务。
2. 数据的收发相关的应该从这里进行,协议为纯二进制
short 服务分析:
short.weixin.qq.com: type A, class IN, addr 180.153.82.27
Name: short.weixin.qq.com
Type: A (Host address)
Class: IN (0x0001)
Time to live: 10 minutes, 47 seconds
Data length: 4
Addr: 180.153.82.27 (180.153.82.27)
short.weixin.qq.com: type A, class IN, addr 180.153.218.192
Name: short.weixin.qq.com
Type: A (Host address)
Class: IN (0x0001)
Time to live: 10 minutes, 47 seconds
Data length: 4
Addr: 180.153.218.192 (180.153.218.192)
1. 安卓wifi场景下,连接到 180.153.82.27 服务器
2. 汇报状态
POST /cgi-bin/micromsg-bin/statreport
content 长度 360
可以反查到 com/tencent/mm/modelstat/a 为状态汇报逻辑
3. 汇报strategy
POST /cgi-bin/micromsg-bin/reportstrategy
content 长度 248
可以反查到com/tencent/mm/plugin/c/b/k 为汇报strategy 逻辑
看了下代码,是一个奇怪的数字308,待猜
4. 服务器通过http传过来几个 micromsgresp.dat
这里不明觉历,该文件没找到
看了下,推过来的数据是2个,正好我的未读消息显示的泡也是2个,有可能是它们
5. 自动验票
POST /cgi-bin/micromsg-bin/downloadpackage
反查到 com/tencent/mm/w/i
没看明白,里面包含一些ticket逻辑,待猜
6. 服务器再次推送过来 micromsgresp.dat
结合上面的验票,有可能是离线QQ的相关内容?
7. 再次汇报状态
POST /cgi-bin/micromsg-bin/statreport
两次汇报的时间戳:
1. Arrival Time: May 4, 2013 22:27:08.276868000 CST
2. Arrival Time: May 4, 2013 22:27:10.449625000 CST
猜测微信将汇报状态作为某种心跳,其间隔为2s
8. 服务器再次推送过来 micromsgresp.dat
待猜
9. 再次汇报状态
POST /cgi-bin/micromsg-bin/statreport
时间戳:
Arrival Time: May 4, 2013 22:27:12.606075000 CST