本文讲的是如何反编译/编译微信。
AndResGuard
AndResGuard一个资源混淆工具。他会将原本冗长的资源路径变短,例如将res/drawable/wechat
变为r/d/a
。
主要用途有
- 混淆安卓资源,防止apk被
Apktool
逆向
- 减小apk的大小
更多信息请参考Android资源混淆工具使用说明和微信Android资源混淆打包工具。
APKDB
微信的资源目录res/
是经过腾讯自己开发的AndResGuard混淆过的,所以用普通的Apktool可以反编译,但是编译不回去,但是有人针对这个混淆,做出了Apktool的定制版ShakaApktool。有人觉得还不够方便,弄了一个集成工具APKDB,这个集成工具非常方便。界面如下:

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代码如下:

Java代码中g.a(fileInputStream, 102400)
是读取文件的前102400字节,然后计算MD5。为了绕过这个校验,只需要把Smali代码中,.line 534
上面的那条if-eqz v2, :cond_2
去掉即可。
去掉这个校验之后,就可以任意修改微信的代码,然后重编译了。