Android反编译技术入门
2017.09.08
xiazdong
 热度
℃
前言
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 = ...; int h = ...; 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。