Android知识@IT·互联网程序员

图文详解 | Android APK反编译实战

2016-09-21  本文已影响4663人  伤口不该结疤

1. 为什么要反编译?


场景一

产品经理:xxx,反编译xxx的播放器,看看他们是怎么实现的?

场景二

测试:这个APP怎么一在我们手机上运行就会crash呀,xxx手机就不会

场景三

APP用户:这个APP有汉化版的吗?

为什么要反编译

2. 问题描述

使用硬件版本为T2的手机运行StabilityTest.apk进行'CPU+GPU STABLITY TEST'测试,每隔一段时间就会弹'Preparing scene.Please wait...'的提示框,而使用T1的硬件,不会出现该问题。

Preparing scene.Please wait...的提示框

从问题描述上来看,应该是硬件差异导致的,和软件无关。那为什么这个提示框总是一直弹出呢?一直弹也很讨厌啦。由于是第三方APK,没有源码无法分析,所以先要对StabilityTest.apk进行反编译,才能查看Dialog调用的流程。


3. 反编译流程

反编译的整体流程

3.1 准备工具

1. 工具介绍

反编译工具

2. Tip

除了上面提到的工具,还需要保证Java 1.7已经安装成功,并且环境变量配置正确。

3. 获取方法

Install Instructions: https://ibotpeaches.github.io/Apktool/install/
apktool.bat其实就是一个用来运行apktool.jar的脚本,按照Install Instructions里面提示下载即可。

获取apktool.bat

获取地址: https://sourceforge.net/projects/dex2jar/

下载dex2jar最新版本

Tip: 你也可以下载signapk.jar,但是在签名时需要执行的命令不一样:

java -jar SignApk.jar testkey.x509.pem testkey.pk8 my.apk my.s.apk

这组命令和上面的命令是等价,相比之下,java -jar sign.jar my.apk要简单得多。

signAPK

3.2 使用Apktool反解APK

反解后的目录结构

3.3 使用dex2jar将classes.dex转换为jar包

通过第一步反编译出来的是smali文件,没有smali语法基础,阅读起来很晦涩。通常我们会先去查看java代码,然后再去对比看相应的smali文件,要轻松得多。

解压apk得到classes.dex d2j-dex2jar.bat classes.dex

3.4 使用jd-gui打开classes-dex2jar.jar

Save All Sources

3.5 分析代码 & log

调用过程:
TestGPU.update->getFrequencyCore0->eventLoop.sleep(500L)->TestGPU.update()

但是,这个看起来好像还是和onSurfaceChanged没有关系。观察弹提示框时,会显示一个异常的字符串,正常情况应该会显示cpu频率。

bogomips

搜索这个字符串,发现也是和update有关,在获取cpu频率失败后,会去
cat proc/loadavg,然后将得到的结果设置给bogomipsTextView,就出现了这个字符串。


3.6 修改smali源码

const-string v3, "BogoMIPS"

smali源码

对应java代码其实只有这么几句:

对应java代码

self.getText(2130968587)

那2130968587对应字符串的值怎么找?

Step 1. 在classes-dex2jar.src.zip里面搜索"2130968587"

在classes-dex2jar.src.zip里面搜索"2130968587"

Step 2. 在反解后的apk目录里面搜"cpu_text",最后发现cpu_text的
id = 0x7f04000b,转为10进制,就是2130968587

String id.png

Step 3. 结论: 213096858的值为"bogomips:"


3.7 重新生成apk

apktool.bat b StabilityTest

3.8 apk签名


3.9 验证效果

验证效果

参考

上一篇 下一篇

猜你喜欢

热点阅读