Android反编译的那些事[工具篇]

/ 0评 / 2

前言

在我们使用app的时候总会好奇,我艹,这么炫的动画怎么做的或者觉得E文版看着不舒服想给app换语言甚至看看别人app的实现思路,这个时候我们就可以选择反编译app,抱着学习的心态尝试查看下"源码"。

快速查看apk源码

apk源码主要在classes.dex中,解压apk文件即可得到这个,然后通过jadx即可将dex文件转换为jar文件,从而可以得到源码。这里主要给出一个基于jadx的封装工具.

下载地址:jadx-han_0.6.4

解压后双击\bin\jadx-gui.bat即可。

最新版本可以查看git地址

反编译apk

apktool_2.2.2.jar:下载地址

git地址:https://github.com/iBotPeaches/Apktool

反编译apkjava -jar [apktool的绝对地址] d [apk绝对地址] -o [输出目录]

eg:

//将D盘跟目录中的Tv.apk反编译到output文件夹中
java -jar D:\apktool_2.2.2.jar d D:\Tv.apk -o output

回编译apk:java -jar apktool.jar b [反编译出来的目录]

eg:

//将D盘下output中的文件打包为apk
java -jar D:\apktool_2.2.2.jar b D:\output

生成的apk文件在此文件夹中的dist文件夹中,中间文件入dex文件等在build文件夹下,本例中为D:\output\dist 以及D:\output\build文件夹。

apk的签名

通过上面的反编译以及回编译,我们只能得到一个未签名的apk文件,未签名的apk在Android系统中是无法安装的,所以这里我们要生成一个签名文件用来给apk签名。查看apk是否签名的方法是用解压软件打开apk文件,里面有/META-INF/文件夹则说明为签名文件。

keytool:获取地址:在jdk安装目录的bin目录下面,比如: \jdk1.7.0_25\bin\

生成签名文件:keytool -genkey -alias [签名的用户名-keyalg RSA -validity [签名的有效期]-keystore [签名文件的文件名-outfile [签名文件的存放位置]

eg:

//在当前目录下面生成一个名字为keyfile.keystore的签名文件,用户名为username
keytool -genkey -alias username -keyalg RSA -validity 20000 -keystore keyfile.keystore -outfile ./

输入此条命令则会继续输入其他需要的信息:

$ keytool -genkey -alias username -keyalg RSA -validity 20000 -keystore keyfile.keystore -outfile ./
输入密钥库口令:  password
再次输入新口令: password
您的名字与姓氏是什么?
  [Unknown]:  test
您的组织单位名称是什么?
  [Unknown]:  test
您的组织名称是什么?
  [Unknown]:  test
您所在的城市或区域名称是什么?
  [Unknown]:  test
您所在的省/市/自治区名称是什么?
  [Unknown]:  test
该单位的双字母国家/地区代码是什么?
  [Unknown]:  test
CN=test, OU=test, O=test, L=test, ST=test, C=test是否正确?
  [否]:  Y

输入 <username> 的密钥口令
        (如果和密钥库口令相同, 按回车):  password
再次输入新口令: password

给apk文件签名:

工具: jarsigner

获取地址:在jdk安装目录的bin目录下面,比如: \jdk1.7.0_25\bin\

语法:jarsigner -verbose -keystore [私钥存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [签名的用户名]

//使用D盘下的keyfile.keystore签名demo.apk并将签名后的文件放在D:\a.apk
//签名文件的用户名为username
$ jarsigner -verbose -keystore D:\keyfile.keystore -signedjar D:\a.apk demo.apk username
输入密钥库的密码短语: password
 正在更新: META-INF/MANIFEST.MF
   正在添加: META-INF/USERNAME.SF
   正在添加: META-INF/USERNAME.RSA
  正在签名: AndroidManifest.xml
  正在签名: assets/setting.json
  正在签名: classes.dex
  正在签名: resources.arsc

验证签名是否正确

命令: jarsigner -verify [待验证的apk]

//验证当前目录下的3q.apk签名是否正确
$ jarsigner -verify 3a.apk
jar 已验证。

警告:
此 jar 包含证书链未验证的条目。

有关详细信息, 请使用 -verbose 和 -certs 选项重新运行。

对apk进行4k对齐优化

关于4K对齐为什么能优化不是本篇博客的重点,所以这里只给出命令,需要了解详情的请自行百度。

4K对齐apk

工具: zipalign 获取地址Android SDK/tools文件夹下 如F:\adt-bundle-windows-x86_64-20131030\sdk\tools\

zipalign -v 4 [旧apk] [新apk]

$[省略前面路径]/sdk/tools/zipalign.exe  -v 4 3a.apk 3a_new.apk
Verifying alignment of 3a_new.apk (4)...
      50 META-INF/MANIFEST.MF (OK - compressed)
     647 META-INF/USERNAME.SF (OK - compressed)
    1339 META-INF/USERNAME.RSA (OK - compressed)
    2464 res/layout/activity_main.xml (OK - compressed)
    2927 res/menu/main.xml (OK - compressed)
    3238 AndroidManifest.xml (OK - compressed)
    3952 resources.arsc (OK)
    6216 res/drawable-hdpi/ic_launcher.png (OK)
   12244 res/drawable-mdpi/ic_launcher.png (OK)
   15420 res/drawable-xhdpi/ic_launcher.png (OK)
   24840 res/drawable-xxhdpi/ic_launcher.png (OK)
   42770 classes.dex (OK - compressed)
Verification succesful

检测apk是否4K对齐

zipalign -c -v 4 [apk路径]

查看apk的签名信息

有时候我们需要接入三方服务比如百度地图的时候,需要使用包名+签名的sha1值才行,所以这里给出一种方式获取签名详细信息。

用压缩软件解压apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件,然后使用下面的命令就可以得到应用的签名信息了。

keytool -printcert -file  f:/META-INF/CERT.RSA

发表评论

您的电子邮箱地址不会被公开。