盒子
盒子
文章目录
  1. 前言
  2. 反编译
  3. 加日志
  4. 重新打包

Android反编译技术入门

前言

Android反编译是平常接触比较少的技术,最近由于项目需要,需要查看B612在各个机型的预览分辨率(每次打开相机或切换比例时能够有选取的预览分辨率日志),因此需要三个步骤:

  • 反编译,将dex文件变成smali代码。
  • 在合适的地方通过smali代码方式加一些日志。
  • 重新打包。

我们这里需要两个工具:

  • Apktool:能够对APK中的dex文件反编译成smali代码,并修改,然后重新打包APK。
  • jadx:能够快速将APK的dex文件变成Java代码,而且还有全局文字搜索功能,因此我们通过搜索关键字,找到你需要了解的代码的位置。

反编译

首先通过apktool d -f -r -o <dest-dir> <apk>将APK反编译(Disassemble),使得dex文件变成smali代码。

加日志

接着我们需要寻找在哪里加日志,这里通过Jadx打开APK,初始界面如下:

我们可以在里面大致看出结构,这里我们点击”Navigation”->”Text Search”,并搜索”setPreviewSize”,结果如下:

基本可以判定打日志一定在defpackge.abl类的Dn()方法中,通过查看两处,很容易判断应该在哪里加日志。

这里只能通过书写Smali代码的方式加入打日志功能,凭空直接写Smali代码会很困难,因此我们先在demo工程中写Java代码,如下:

int w = ...; //width
int h = ...; //height
StringBuilder b = new StringBuilder();
String str = b.append(w).append("*").append(h).toString();
Log.v("B612PreviewSize", str);

然后编译成apk,并通过apktool反编译,查看该Java代码对应的Smali代码,基本就可以直接复制黏贴过来,如下:

//前提:v0存着宽度,v1存着高度
//定义常量
const-string v12 , "B612PreviewSize"
const-string v13 , "*"
//初始化StringBuilder变量
new-instance v14, Ljava/lang/StringBuilder;
invoke-direct {v14}, Ljava/lang/StringBuilder;-><init>()V
//b.append(w)
invoke-virtual {v14, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v14
//b.append("*")
invoke-virtual{v14,v13},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v14
//b.append(h)
invoke-virtual {v14, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v14
//b.toString()
invoke-virtual {v14}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v14
invoke-static {v12, v14}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

重新打包

我们首先通过apktool b -o <out.apk> <input-dir>对目录进行重新编译,生成hack.apk,如果直接安装会出现”INSTALL_PARSE_FAILED_NO_CERTIFICATES”错误。

因为修改了内容,但是校验签名出现问题,因此需要重新签名。

首先生成一个keystore,命令行输入:

keytool -genkey -alias b612.keystore -keyalg RSA -validity 40000 -keystore b612.keystore

然后对hack.apk二次签名,命令行输入:

jarsigner-overbose -keystore b612.keystore b612-hack.apk b612.keystore

最后将hack.apk安装到手机即可。

我们把重新打包的APK在魅族Pro5上进行测试,对于前置摄像头,9比16的预览分辨率是1280*720,3比4和1比1的预览分辨率是1440*1080。

支持一下
扫一扫,支持xiazdong