Android反编译与回编译

在查阅了相关资料并动手尝试后,成功反编译apk(其实就是反编译dex、.jar、.class等文件)。
我的电脑环境:ubuntu14.04 64位。

工具介绍(皆为linux平台下版本)

1. dex2jar-2.0

    把apk的.dex文件转换为.jar文件

2. jd-gui-0.3.5.linux.i686

    用于打开.jar文件(其实也就是打开jar包中的.class文件看到源码)

使用方法

这里以LanucherCameraFrame.apk为例:

1. 下载后解压

为了使用方便,我都解压到了我的~/tools/dex2java_tools目录下,并创建workplace文件夹专们存放要操作的文件和生成的目标文件。我的目录结构如下图:

我的工具目录

2. 打开终端,进入workplace目录,开始dex到jar的转换

要想执行操作,需先把dex2jar-2.0目录下的d2j-dex2jar.sh、d2j_invoke.sh脚本文件属性修改为**可执行的**,d2j_invoke.sh该脚本用来准备反编译环境,d2j-dex2jar.sh脚本用来反编译dex文件,指令如下:
$chmod +x /.../dex2jar工具目录/d2j-dex2jar.sh  /.../dex2jar工具目录/d2j_invoke.sh
再使用下面指令转换:
$cd /.../dex2jar工具目录/workplace/LanucherCameraFrame
$sudo sh /.../dex2jar工具目录/d2j-dex2jar.sh /.../LanucherCameraFrame.apk(或者解压apk取得的classes.dex文件,也就是包含编译后源码的文件)
执行后,当前目录下会生成LanucherCameraFrame-dex2jar.jar文件(如果使用classes.dex,会生成classes-dex2jar.jar)

3. 使用jd-gui打开2.中生成的jar文件

在Ubuntu下运行jd-gui无反应,那么可能还需要先安装依赖库,指令如下:
$sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6
之后再打开jd-gui工具目录下的jd-gui文件,运行,再选择打开2.中生成的jar文件,即可看到源码。效果如图所示:

打开后的jar与源码
反编译后的源码与原先开发时源码可能部分有点异样,但方法名、字符串等不会变,不影响阅读。

4.反编译资源文件

上面的步骤只是反编译了java源码,但apk解压后的AndroidManifest.xml和资源文件res目录下的xml文件依然是不可阅读的。反编译资源文件需要另一个工具:apktool。

可以去这里阅读该工具在各个平台下的安装方法
https://ibotpeaches.github.io/Apktool/install/
安装完成,执行下面指令,即可反编译:

$/.../apktool工具目录/apktool d LanucherCameraFrame.apk

反编译后目录结构如下图:
反编译资源目录结构
res目录包含所有反编译后的xml文件和图片,smali下就是源码,不过这种源码的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。

5.回编应用(重新打包)

和4.中的apktool d对应,使用apktool b可对反编译的包进行二次编译(b代表build)。
为了对比,我把ic_launcher.png图标替换为下面图片:


这里写图片描述

覆盖原来的图标后,执行下面指令,打包文件夹LanucherCameraFrame:

$apktool b LanucherCameraFrame -o LanucherCameraFrame_new.apk

-o代表新生成的APK文件名。
之后目录下面生成了一个新的APK文件:LanucherCameraFrame_new.apk。

但目前这个新apk还是不能安装的,因为它还没有进行签名。用Android Studio或者Eclipse都可以非常简单地生成一个签名文件,然后在通过下面指令对apk签名:(jarsigner命令文件是存放在jdk的bin目录下的,需要将bin目录配置在系统的环境变量当中才可以在任何位置执行此命令,相信大家电脑都配好了java环境变量-。-)

$jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件 -storepass 签名密码 待签名的APK文件名 签名的别名

(签名文件、密码、别名都是在用Android Studio或者Eclipse生成签名时指定要填写的,别忘了)

遇到的问题及解决方法
问题警告: 未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期日期 (3015-07-18) 或以后的任何撤销日期之后, 用户可能无法验证此 jar
解答:因为在生成签名时,会要求填写有效期限(可以填久点,比如1000年-。-,不用担心哪个软件用1000年?),到3015-07-18就到期了,所以这个警告一般可忽略。
如果实在要去除警告,很简单,在指令中加个下面的选项:

-tsa https://timestamp.geotrust.com/tsa

以我为例,最终签名为:

$jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -tsa
https://timestamp.geotrust.com/tsa -keystore /.../签名文件 -storepass 密码 LanucherCameraFrame_new.apk 别名

签名成功,如下图所示:
签名成功

此时apk可以安装到手机上了。但出于优化的考虑,为使得在运行时Android与应用程序间的交互更加有效率,可以再使用zipalign工具(该工具存放于< Android SDK>/build-tools/< version>目录)来完成对齐操作:

$zipalign 4 LanucherCameraFrame_new.apk LanucherCameraFrame_new_align.apk

最后安装运行,发现图标变了,程序可以像之前一样运行。

安装后图标

参考文章:
Android安全攻防战反编译与混淆技术完全解析(上)
Mac下使用dex2jar
Ubuntu下Android apk反编译
[Android Memory] Android Zipalign zip对齐优化app程序

【转载请注明出处:http://blog.csdn.net/u013403478/article/details/52189712

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

俩兜没钱

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值