ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用

转载请注明出处:http://blog.csdn.net/fightlei/article/details/52432161


最近在学习Android反编译的一些知识,虽然在网上搜到了很多相关的文章,但是大多都大同小异,或是未切中要害。整个过程下来,踩了很多坑,所以特地记录下来。

本文的所有操作都是在ubuntu下进行的,与其它系统下的操作会略有不同。

为了方便大家,我将本文所用到的工具打包上传到了csdn,http://download.csdn.net/detail/fightlei/9623177,需要的朋友可以自行前往下载。

我们都知道,Android的安装包是.apk文件,可以在手机等设备上直接安装使用,但其本质就是一种压缩文件,将要反编译的apk文件后缀名改为.zip后缀,然后就可以直接用解压工具打开了。

ubuntu下使用解压命令:

unzip app-release.zip

其中“app-release.zip”是待反编译的apk文件名,读者需要将其改为自己的apk文件名,后面不再赘述。

解压后将得到如下文件:


其中res文件夹下就存放着app的资源文件,我们可以点击进去随便打开一个文件,例如找到layout/activity_main.xml,打开,内容如下图


可以看到如果通过解压后直接打开这类资源文件,得到的将会是一堆乱码。同样,打开得到的AndroidManifest.xml文件也会是同样的效果。那么如何才能将其转换成我们看得懂的样子呢,这就需要apktool了。


反编译资源文件


apktool下载地址: http://ibotpeaches.github.io/Apktool/install/
我们需要的是这三个文件


将 app-release.apk文件与这三个文件置于同一目录下,打开终端,进入该目录,执行命令:

apktool d app-release.apk 

这里的d就是decode解码的意思

若提示command not found 则改用命令:

./apktool d app-release.apk

如果遇到这样的错误:Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file,则可能是由于版本过低导致的,下个新版的apktool即可

使用命令apktool d  app-release.apk -o <dir>, 可用于指定反编译后文件的存储位置,其中<dir>表示存储位置

如果遇到这样的错误:Destination directory (/home/cloudhua/temp) already exists. Use -f switch if you want to overwrite it.,表示你所指定的目录已存在,可以改用命令:

apktool d -f  app-release.apk -o <dir> 

其中-f代表强行覆盖

执行成功,如下图所示:


在该目录下会生成与apk文件名相同的文件夹,此时我们就已经成功还原出应用的资源文件。比如我们再次打开res/layout目录下的activity_main.xml文件,如下图所示



反编译代码


资源文件还原成功后,接下就该反编译代码了

反编译代码需要用到dex2jar和jd-gui
dex2jar下载地址: http://sourceforge.net/projects/dex2jar/files/
jd-gui下载地址: http://jd.benow.ca/
大家如果回过头去看apk文件的解压内容,会发现其中有一个classes.dex文件,该文件中存放的就是java代码了。此时需要用到dex2jar工具进行转换,首先需要解压该工具。
若后缀为.zip

则使用命令

unzip 文件名

若后缀名为.tar

则使用命令

tar -xvf 文件名

解压后如下图所示


其中我们主要用到的就是d2j-dex2jar.sh文件,接下来将classes.dex文件拷贝到d2j-dex2jar的解压目录下,执行命令

sh d2j-dex2jar.sh classes.dex

可能会出现如下提示信息:d2j-dex2jar.sh: 36: d2j-dex2jar.sh: ./d2j_invoke.sh: Permission denied

根据提示信息我们可以发现是 d2j_invoke.sh文件的权限不够,则使用命令:

chmod +x ./d2j_invoke.sh

没有任何回应,根据unix的哲学,没有消息就是好消息,直接进行下一步

再次输入命令sh d2j-dex2jar.sh classes.dex

如果得到提示信息:dex2jar classes.dex -> ./classes-dex2jar.jar,证明已经转化成功,打开目录,发现多了classes-dex2jar.jar文件,这就是 classes.dex转换成的jar文件,jar文件得到以后,我们仍然无法直观得看到程序的代码,此时就需要jd-gui工具的粉墨登场了。

jd-gui包是.tar.gz后缀,使用解压命令:

tar -zxvf jd-gui-0.3.5.linux.i686.tar.gz

若读者使用的不是我提供的工具包,或者文件名称与我的不同,则将jd-gui-0.3.5.linux.i686.tar.gz改成自己的文件名。

解压后得到以下三项:


其中jd-gui可以直接双击打开。
如果有读者无法打开该文件,可以右键该文件,选择properties→permissions勾选Allow executing file as program。

如果仍然无法打开,则可能是缺少对应的32位依赖库。执行安装命令:

sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6

若安装后双击仍然没有反应,重启电脑即可。

打开jd-gui,如下图所示


点击file→Open File,选择刚刚转换得到的classes-dex2jar.jar文件,打开就是我们需要的代码文件了,例如这里我选择demo中MainActivity类,代码如下:


OK,那么至此,我们在ubuntu下反编译apk就大功告成啦。
如有纰漏,敬请海涵。

1 . 把apk拷到apktool根目录下,执行:./apktool d xxx.apk,会生成xxx目录,里面有res目录(各种资源文件),smali目录(类似src目录,里面文件的语法不一样)及AndroidManifest.xml。 [*.apk->*.jar: sh ./dex2jar/dex2jar.sh xxx.apk,生成xxx_dex2jar.jar通过jd-linux看源码] 2 . 什么apk汉化啊,就到res/values里string.xml里修改字符串,或者拷贝一份values目录改为values-zh-rCN,再去里面修改string.xml里英文字符串改为中文,所谓的汉化就是这么简单。另外,有些图片里不是中文的得去改图片,那得用Photoshop了,图片也不能乱改,格式,图片大小(尺寸)得原来的。 3 . 修改smali文件,这个有些难度。比如有些apk安装了后要积分什么的,比如大于100才可以用的,其实这个值是用SharedPreference存放的,也就是存在xml里,,位置:/data/data/[包名]/shared_prefs的某个xml里,文件不多肯定是可以找到的。另外一种方法就是修改.smali文件也可以达到这目的,软件实现肯定是读取积分那个值给它修改一下就可以了,例如 const/16 v0 100 (其实就是 v0 = 100)这个语法有点像汇编,觉得还是比汇编简单,v0 v1 ...是寄存器,之前会跟变量关联的。具体的还是自己看看smali语法。 4 . 打包生成apk,执行:./apktool b xxx,会在xxx里面生成,一个dist目录,里面就是xxx.apk,但不能安装滴,提示(Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]),没有给这个apk签名, 5 . 签名,执行:sh ./dex2jar/d2j-apk-sign.sh ./xxx/dist/xxx.apk 就是给刚才那个apk签名,生成的文件还是xxx.apkapktool根目录下。这样就大功告成啦。 [请看:http://blog.csdn.net/zhouyuanjing/article/details/7446988]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值