一个三年Android开发的总结 - Android应用的反编译

Android开发中需要分析一些应用功能的实现原理,往往也就逃不开应用的反编译与重打包,这里主要简单介绍一些反编译的实操方法,供需要反编译时随时查看依步骤操作。
这里不详述adb命令的使用,java环境配置,apk其实就是zip格式文件等,有需要还请再搜索。

一、找到应用

反编译应用得先拿到该应用,能从应用市场中下载到固然最好,如果不方便下载,或担心版本不一致,也或本身就是系统内置应用该如何获取应用呢?

1.关于系统apk位置
/system/app 系统apk
/system/priv-app 系统apk
/system/delapp 可删除的第三方应用
/cust/preinstalled/public/app 系统集成的第三方应用等,放在cust分区可删除,但恢复出厂设置的时候还会出来
来源于参考文章1
2.普通安装的apk位置,一般都会在/data/app目录下
3.如果实在不好找,可以通过pm path命令来确定,具体步骤
(1)查看topactivity
给个linux上的shell命令:
adb shell dumpsys activity activities | sed -En -e ‘/Running activities/,/Run #0/p’
(2)执行 adb shell pm path 应用包名

二、反编译

我们希望将apk反编译后获取java源码和资源,将odex反编译获取java源码,整体上来说,都是:
(1)获取smali文件
(2)获取到dex格式文件
(3)从dex到jar文件
(4)由Jar文件到java源码

这里使用到的工具,由于官网链接可能大部分打不开,在此提供csdn的下载链接Android应用的反编译工具包

1.apktool方式
(1)从官网下载到apktool的jar包后,执行java -jar apktool.jar d 应用apk
如果成功,已经能获取到资源图片,AndroidManifest.xml等等,以及smali文件
(2)但有时不能成功,很可能是对资源进行了处理,可以使用-r参数,只反编译代码

2.使用 baksmali.jar 将 odex 文件分解为 smali 文件
从系统应用中获取的apk文件,内部可能没有dex文件,需要找到对应的odex文件进行操作
$ java -jar baksmali-1.2.5.jar -x app.odex
如果成功的话,会在生成一个 out目录,里面是一些以“.smali”为后缀名的文件。
如果还依赖其它文件可以一并拷贝出来 并通过-d 选项来指定目录
具体的可查看参考文章2,细节问题还是有很多,如果你碰到问题,可留言

3.使用 smali.jar将 out/目录下的smali文件转换为 classes.dex
$ java -Xmx512M -jar smali-1.2.5.jar out -o classes.dex
classes.dex便是Dalvik VM所使用的编译后的类文件格式,在正常的apk文件里都会有。
如果纯看代码,上述apktool方式不做也行,直接解压出里面的classes.dex

4.使用 dex2jar将classes.dex反编译为jar文件
将下载后的dex2jar压缩包解压后,里面会有dex2jar.sh(和dex2jar.bat)文件,假如classes.dex文件与dex2jar.sh在同一目录下,使用以下方式将classes.dex反编译为jar文件:
$dex2jar.sh classes.dex

5.得到jar文件后,使用jd-gui来查看源代码,也能够导出java源文件

补充:
(1)普通apk文件想获取jar文件的话,使用google官方提供的enjarify更方便,更有保障
下载到enjarify,得安装python环境,执行python3 -O -m enjarify.main yourapp.apk即可
(2)如果用apktool直接反编译不过,但是又想看AndroidManifest文件内容可以使用axmlprinter2.jar 直接打印xml内容

三、重打包

一般是在反编译成smali文件之后,直接以文本文件的形式打开修改,再重打包回去
1.重打包
$ java -jar apktool.jar b smali_dir_name
smali_dir_name可以是apk文件,经过apktool d命令后生成的apk.out文件夹,也可以是apktool d -r apk 不进行资源处理的文件夹会在smali_dir的dist目录里生成apk或者jar包

2.对于系统应用,如果想修改完后推送回去

adb shell
$ su
# mount -o rw,remount /system

然后再尝试推送

四、so反编译

还想看看人家的so,在线反编译
https://retdec.com/decompilation/
https://www.onlinedisassembler.com
当然,这不是一般人能做的,只是提供一些线索

参考文章
1.华为荣耀6内置应用可删除列表(ROOT以后可以操作)
2.odex反编译dex异常 Cannot locate boot class path file /system/framework/core.odex

前两天反编译android6.0上的代码发现新版baksmali(2.1.2)已经都支持oat格式了。
转载请注明出处:http://blog.csdn.net/w7849516230,欢迎关注微信公众号“编程阳光”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值