Android反编译流程和apk反编译重新打包签名

作为一名Android开发者,很多的时候需要去学习别人优秀的代码,原本在GitHub上就有很多开源的项目代码,但有的时候在使用软件时候遇到自己想要的功能时,想要学习实现的代码时,这时候就需要使用到反编译这项技术了。正常情况下,Android应用打包成apk之后,就无法再看到开发这个应用时使用的资源文件以及代码了。但是我们通过网上提供了一些工具,还是可以将apk进行反编译的,apk反编译之后,我们就可以看到开发这个应用使用的资源文件(图片)、layout、样式、相关的实现代码等,apk反编译也算是Android开发中一个比较实用的技巧吧,当我们对别人开发好的应用感兴趣时,我们就可以通过这种技术手段将别人打包好的apk进行反编译,继而可以看到我们感兴趣的内容。反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。

一. 反编译使用工具

  1. apktool (资源文件获取) ,下载地址:https://ibotpeaches.github.io/Apktool/install
  2. dex2jar(源码文件获取),下载地址:https://github.com/pxb1988/dex2jar
  3. jd-gui (源码查看),下载地址:http://jd.benow.ca

这里同样分成两个部分,一个是代码的反编译工具,一个是资源的反编译工具。

代码反编译的工具:

  • dex2jarjd-gui:dex2jar将Android APK内的dex转化为jar文件,然后使用jd-gui可以查看,保存为java文件。

  • jadx:jadx是一个非常好用的反编译工具,可以原作者已经没有维护了。但也不妨成为一个经典工具。

反编译资源的工具:

  • APKTool:使用APKTool将布局图片等资源可以提取出来。

二. 反编译的流程

  1. 首先需要拿到反编译的软件,拿到的软件一般是xxx.apk,但有的时候拿到的软件会是xxx.apk和xxx.odex,后者是平台优化过的产物,关于xxx.apk与xxx.odex的合并会在另一篇文章中讲到。拿到完整apk以后,手就可以着手反编译的工作了。

2. 反编译资源文件:

java -jar apktool_2.3.1.jar d -f KeyValueTest.apk -o KeyValueTest
  • 执行以上命令以后如下未报错则说明反编译成功:


    反编译成功
  • 参数说明:

    • -f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
    • -o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
    • -s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
    • -r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)
  • 此时便在当前文件夹下生成了一个KeyValueTest文件夹


    文件目录
  • 在这个文件夹下面便是反编译出来的资源文件,我们只需要res目录和AndroidManifest.xml文件。


    APKTool反编译目录

    对比layout:


    对比layout

    对比AndroidManifest.xml:


    对比AndroidManifest
  • 通过对比发现,APKTool反编译出来的资源文件都可以直接使用了!

3. 反编译代码文件:

  • 将apk文件修改后缀为zip然后解压或者直接解压,得到以下文件目录如下:


    解压APK
    image.gif

  • 此处我们关注的是classes.dex文件,这个文件就是类似于Java中的字节码文件(.class),所以我们要先使用dex2jar将.dex文件反编译为jar文件。dex2jar文件目录结构如下,其中用到的为d2j-dex2jar.bat。


    dex2jar目录
  • 将classes.dex放入该文件夹,当前文件路径下,命令行输入d2j-dex2jar.bat classes.dex


    dex2jar成功
    image.gif

  • 然后生成相应jar文件:


    生成jar
  • 使用jd-gui打开,发现多了一个BuildConfig,这个是编译时候的配置文件不用管


    jd-gui打开
  • 在MainActivity中,对比反编译得到的代码与源代码,基本无异。在资源的引用上,替换成了数字,这个数字可以通过在R中查找替换回去。


    反编译的到的代码
    image.gif


    源代码

    R中查找到的资源ID


    资源ID
  • 通过jd-gui的保存功能(Save All Source)便可将代码保存下来

4. 可以使用dex2jar,也可以使用jadx对classes.dex进行反编译,相对于dex2jar,jadx更加方便快捷,打开bin文件中的jadx-gui.bat然后直接选择APK即可,虽然jadx也可反编译资源文件,但有时候并不准确。


jadx
jadx界面

5. 综上,反编译APK可以采用APKTool+JADX,也可以采用APKTool+dex2jar。推荐使用前者。有一个在线的反编译网站,采用的是JADX。
->由此去<-

6. 至此,可以得到结论在未加扰的情况下,基本可以得到和源代码一摸一样的代码,加扰的情况阅读起来会很费劲,在此不做演示。将得到的res和AndroidManifest.xml以及java文件整合在一起,便得到了一份内似于源代码的代码。

其中引用参考文章:https://www.cnblogs.com/cj5785/p/9892978.html

三. 重新打包签名(Mac环境)

重新编译就是在cmd里执行命令apktool b test

成功之后,test目录下会生成build和dist目录

build目录下存放的是打包后的dex文件和资源文件(和apk解压后一样一样的)

dist目录下存放的是重新打包后的apk文件

重新签名

复制签名文件到dist目录下方便操作

终端进入dist目录,执行命令jarsigner -verbose -keystore [your_key_store_path] -signedjar [signed_apk_name] [usigned_apk_name] [your_key_store_alias] -digestalg SHA1 -sigalg MD5withRSA 字段说明:

  • [your_key_store_path]:密钥所在位置的绝对路径
  • [signed_apk_name]:签名后安装包名称
  • [usigned_apk_name]:未签名的安装包名称
  • [your_key_store_alias]:密钥的别名

因为我们把秘钥和test.apk放在同一路径,所以密钥所在位置的绝对路径直接填testkey就好啦,macjenkinskey是我的秘钥别名,别误会(邪恶.jpg)

输一下密码,看不到输入的,开始签名

签完名后,在dist目录下就可以看到签完名后的apk了

后话

反编译的时候,也可以把test.apk的拓展名改成test.zip解压出来


把classes.dex复制到dex2jar-2.0路径下


终端进入dex2jar-2.0路径下,执行命令./d2j-dex2jar.sh classes.dex


同样可以得到classes-dex2jar.jar

反编译,再回编译,同样可以得到classes.dex,就在这个路径下

重新打包参考了 腾讯云社区的文章,大家可以作为参考,还是想想说一下,反编译是为了让开发者更好的向优秀技术学习,并不是破解别人的apk,加入一些非法的操作,然后再重新打包的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容