`

微信协议研究

 
阅读更多

参考: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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics