对X信的研究及修改(二)

发布者:iweizime
发布于:2018-01-03 00:00
 

本文讲的是如何反编译/编译微信。

AndResGuard

AndResGuard一个资源混淆工具。他会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a

 

主要用途有

  1. 混淆安卓资源,防止apk被 Apktool逆向
  2. 减小apk的大小

更多信息请参考Android资源混淆工具使用说明微信Android资源混淆打包工具

APKDB

微信的资源目录res/是经过腾讯自己开发的AndResGuard混淆过的,所以用普通的Apktool可以反编译,但是编译不回去,但是有人针对这个混淆,做出了Apktool的定制版ShakaApktool。有人觉得还不够方便,弄了一个集成工具APKDB,这个集成工具非常方便。界面如下:
image_1c0ok7kgcl7nj7o1uff6icmbb9.png-30.1kB

DEX校验

反编译之后,再编译回去,DEX文件肯定和原来不一样了,签名我们可以用自己的密钥来签名,但是微信自己还会对自己的DEX做一个校验,在6.6.1版本的微信中,是在smali/com/tencent/mm/f/a.smali中,其Smali代码如下:

    .line 532
    const v2, 0x19000

    :try_start_2
    invoke-static {v3, v2}, Lcom/tencent/mm/a/g;->a(Ljava/io/InputStream;I)Ljava/lang/String;

    move-result-object v2

    .line 533
    if-eqz v2, :cond_2

    iget-object v4, p0, Lcom/tencent/mm/f/a$a;->eHC:Ljava/lang/String;

    invoke-virtual {v2, v4}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
    :try_end_2
    .catch Ljava/io/IOException; {:try_start_2 .. :try_end_2} :catch_6
    .catchall {:try_start_2 .. :try_end_2} :catchall_2

    move-result v2

    if-eqz v2, :cond_2

    .line 534
    :try_start_3
    invoke-virtual {v5}, Lcom/tencent/tinker/loader/shareutil/ShareFileLockHelper;->close()V
    :try_end_3
    .catch Ljava/lang/Exception; {:try_start_3 .. :try_end_3} :catch_0

    .line 551
    :goto_1
    invoke-static {v3}, Lcom/tencent/mm/f/a;->b(Ljava/io/Closeable;)V

    goto :goto_0

Java代码如下:
image_1c2rcv43lgbld5kde81mjg12na9.png-58kB
Java代码中g.a(fileInputStream, 102400)是读取文件的前102400字节,然后计算MD5。为了绕过这个校验,只需要把Smali代码中,.line 534上面的那条if-eqz v2, :cond_2去掉即可。

 

去掉这个校验之后,就可以任意修改微信的代码,然后重编译了。


声明:该文观点仅代表作者本人,转载请注明来自看雪