apktool反编译与重新打包学习,apk反编译与重新签名学习,keytool-jarsigner

有个玩无线电的朋友问我会不会破解软件,我说太难的搞不了,有些是混淆过的;他说有个好像是测无线电天线的设备(天调?)是绑定蓝牙mac的让我给搞定下,安卓的app。

于是完成之后记录下。之前没事时候用过apktool,jd-gui,dex2jar等工具还有在线的,不过玩着玩着就扔掉了,这次答应了人家,起码弄出个123吧。

本次用到的工具:

  1. apktool2.2

  2. keytool,位于jdk/bin目录

  3. jarsigner,位于jdk/bin目录

最初使用的直接apk包改扩展名zip,拿出classex.dex,然后dex2jar,拿到java文件之后想把源码直接拿出来复制到一个新工程里去,跟重新做差不多,因为看到里面只有四个Activity :

DeviceListActivity.java

DrawChart.java

MainActivity.java

MyApplication.java

比较简单,字面意思都能猜出是干嘛的,设备列表Activity,显示匹配/未匹配的蓝牙设备吧?DrawChart绘制曲线的吧?MainActivity和MyApplication都不用说了,主界面和入口,哇塞我敏锐的直觉囧。。。然后软件运行截图是这样的:

Mini60X APP运行截图

玩无线电的就是高大上,直接看不懂。。。

打开设备列表Activity之后就能看到写死的蓝牙地址,于是数组里再加入一个

1
private static String[] xx2009Address = { "98:D3:31:B0:F2:FD", "98:D3:31:B0:29:B3", "98:D3:31:B0:F2:FC", "98:D3:31:B0:F2:FD" };

但是复制到新工程之后就各种报错,比如do{ return;xxx;xxx; }while(1);这种,do里面直接return,肯定是不对的,然后各种重新反编译最后都不能直接拿来用,是不是我想的太简单了。。。虽然拿到了源码,但是有错误,尤其DrawChart里面的代码,gdi编程的错误真心搞不了。

然后又使用apktool d xxx.apk反编译得到smali文件列表(smali语法也玩不转)找到DeviceListActivity直接替换掉数组里面的蓝牙mac地址,ok第一步算完成了;

接着使用apk b xxx(xxx代表刚才反编译得到的文件路径),重新打包,在xxx/dist目录下会生成新的apk文件;这个时候apk是没有签名的,也不能安装到安卓手机中,需要对apk文件进行签名,过程如下:

1.首先生成签名文件,直接切换至**%JAVA_HOME%/bin目录,使用
**keytool -genkey -alias new.keystore -keyalg RSA -validity 20000 -keystore new.keystore

命令生成文件,中间不断下一步,输入密码填信息什么的,上面的语句就会在当前目录生成的签名文件new.keystore

2.使用jarsigner签名apk,将apk拷贝至%JAVA_HOME%/bin目录,输入命令:
jarsigner -verbose -keystore new.keystore -signedjar Mini60X-signed.apk Mini60X.apk new.keystore

new.keystore就是1步生成的签名文件,Mini60X-signed.apk就是要生成的签名之后的文件名,Mini60X.apk是你的apk文件名,运行结果如下:

就会在当前目录生成Mini60X-signed.apk,下面的Warning我没管它,然后就安装到手机上吧。

声明:本文只为学习安卓打包与签名机制使用,不针对任何app生产厂商,本文及作者不承担任何法律内外责任。