Android反编译与重编译(一)

前言

之前一直在想着有什么东西要补充,于是翻了翻自己的workspace。之后看到一个以前做的脚本,其实这个脚本是用来进行多渠道打包用的,也是一个比较蛋疼的需求导致我要弄这东西出来。想想大家可能对这个有需要,所以就弄出来了。

准备

首先你的系统最好装了Android的SDK,并且配置好path。如果没有的话就比较麻烦些,我也是因为要在没Android的SDK的服务器上面跑脚本所以弄得比较蛋疼。

除了Android的SDK之外我们还需要apktool.jar,这个我个人建议是用2.x版本的,1.x太旧,而3.x又藏的很深不方便使用。除了apktool.jar,如果你是没Android的SDK的话,请自备一个aapt(windows平台用aapt.exe)并且配置好path。然后还有signapk.jar,这个其实和JDK里面的签名软件jarsigner是一样作用的,但是考虑到有的服务器不是一般的坑爹,所以……最后还有个zipalign,这个使用来优化APK包的,用不用都可以。

开工

首先找一个新鲜的apk包出来,例如“WeCloudDemo.apk”,然后命令行跑下面代码进行反编译:

java -jar apktool.jar  d -f -s WeCloudDemo.apk temp

运行过后就会生成一个temp文件夹,里面的东西就是反编译出来的产物。先解释一下这个工具的参数:

首先这个apktool有两个大的分支,分别是d[ecode]和b[uild] 。它们的使用方式相似,一个是

d[ecode] [OPTS] <file.apk> [<dir>]
另一个是
b[uild] [OPTS] [<app_path>] [<out_file>]
其中的<dir>其实也就是后面的<app_path>

然后opts里面有一些选项可供大家使用的:

d:
-s, --no-src 不反编译源代码
-r, --no-res 不反编译资源文件
-d, --debug 使用debug模式去反编译
-b, --no-debug-info 不写出debug的细节
-f, --force 强制删除目标目录,不管里面空不空
-t <tag>, --frame-tag <tag> 尝试去使用<tag>里面的框架文件
--frame-path <dir> 使用指定路径的框架文件
--keep-broken-res 就算资源文件有错也坚持反编译出来

b:
-f, --force-all 无视变更直接构建所有文件
-d, --debug 在debug模式构建
-a, --aapt 在指定路径load aapt工具

额外指令: install-framework <framework.apk> [<tag>] --frame-path [<location>] 安装框架文件到你的系统
以上就是对于这个工具的指令选项,如果有更新的话请上去 http://code.google.com/p/android-apktool/ 去查看。

当反编译好了之后,我们会在文件夹看到如下几样东西:res 文件夹,build 文件夹,smali 文件夹,AndroidManifest.xml,apktool.yml,或许有的还会有 assets 文件夹。其中 res 文件夹不用说大家都知道里面有什么了,build文件夹主要是编译过程中产生的 dex 文件和资源压缩文件以及编译时用到的 AndroidManifest.xml,不过我们不用去改这里的 AndroidManifest.xml。smali 文件夹里面的是安卓虚拟机 Dalvik 的运行代码,这个放到下回去讲。apktool.yml 是 apktool 的配置文件,一般不要动它。
然后多渠道打包的话主要就是改 AndroidManifest.xml 里面的一些 <meta-data>,例如 appkey 又或者是 channel 神马的。如果你想要知道别人的软件里面的代码的话,那就需要用到 dex2jar 把里面的 dex 文件转 jar 文件,再用 JD-GUI 来查看 jar 文件的内容。

讲到一半发现好像扯远了,继续接着上面反编译。反编译之后我们对想要做的东西都做完了,这时候自然是想重新打个 APK 出来啦,于是使用下面的代码

java -jar apktool.jar b temp ./bin/xxx_unsigned.apk

jarsigner -verbose 
-keystore ./keystore/GoP01.keystore 
-storepass 123456
-signedjar ./bin/xxx_signed_unaligned.apk 
-digestalg SHA1 
-sigalg MD5withRSA ./bin/xxx_unsigned.apk GoP01.keystore

zipalign -v 4 ./bin/xxx_signed_unaligned.apk ./bin/xxx_signed_aligned.apk</span>
这样子就大功告成了,我们将会获得一个全新的apk包,上面的代码里面 keystore和 storepass 分别是你的数字证书以及它的密码,最后面的其实是  alianame,也就是定义的别名,这个看大家的需要填,我这里就把 keystore 的名字填进去。

有的系统里面的jdk比较坑,木有 jarsigner 和 zipalign。zipalign 是用于优化APK的工具,我们可以在网上搜出来,或者在apktool v3.x里面提取出来。jarsigner 要替代的话可以搜索下载 signapk.jar 这么一个工具来用

java -jar signapk.jar platform.x509.pem platform.pk8 WeCloudDemo.apk WeCloudDemo_signed.apk

上面的 .x509.pem 和 .pk8 文件可以在platform/build/target/product/security/中找到

另外可以用以下指令来查看是否已经优化
zipalign -c -v 4 WeCloudDemo.apk
那么一个简单的Android反编译与重编译就到这里完成了,下一节我会讲一下smali的语法。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值