【反编译系列】一、反编译代码(dex2jar + jd-gui)和反编译资源(apktool)
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
【反编译系列】二、反编译代码(jeb)
【反编译系列】三、反编译神器(jadx)
【反编译系列】四、反编译so文件(IDA_Pro)
概述
我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译,一个是对资源的反编译,我们马上来逐个学习一下。 在开始学习之前,首先我们需要准备一个APK文件,为了尊重所有开发者,我就不拿任何一个市面上的软件来演示了,而是自己写一个Demo用来测试。
--摘自《Android安全攻防战,反编译与混淆技术完全解析(上)》
在参考郭神的文章以及后续的使用过程中,由于使用的工具版本不同,所以命令有所差别。
本系列中使用的Demo项目是HelloWorld,源代码截图和运行效果如下:


效果图:

(注:反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。)
--摘自《Android APK反编译就这么简单 详解(附图)》
反编译代码
下载软件
dex2jar:将apk反编译成Java源码(将apk里面的classes.dex转化成jar文件)
下载地址:见文章末尾。
jd-gui:查看jar文件(将jar文件转换成java代码)
下载地址:http://jd.benow.ca/

安装软件
直接解压即可,然后将上面的两个软件放到同一个目录下。

解压缩apk文件,获取dex文件
通过好压软件打开apk文件,将class.dex拖拽出来【或者先将apk文件重命名成zip文件,然后用解压软件打开。】


注意:可能会有多个dex文件,那么就需要将所有的dex文件转换成jar文件。
将dex文件转换成jar文件
将classes.dex复制到dex2jar-2.0目录中

下面就是通过命令行的方式将dex文件转换成jar文件。对于这个版本(dex2jar-2.0)来讲,我们要用到的是d2j-dex2jar.bat这个批处理文件,当然如果你是linux或mac系统的话就要用d2j-dex2jar.sh这个文件。对于旧版本(dex2jar-0.0.9.15),要用到的是dex2jar.bat这个批处理文件。
打开命令行提示符,并定位到dex2jar-2.0安装目录下


根据实际情况,定位到dex2jar-2.0的安装目录(比如我的是E:\反编译\dex2jar-2.0)

输入命令d2j-dex2jar.bat classes.dex

没有报任何错误,这就说明我们已经转换成功了(其实即使报错了,也可以暂时不用管)。现在观察dex2jar-2.0目录,你会发现多了一个文件,如下图所示:

查看jar文件(将jar文件转换成java代码)
可以看到,classes-dex2jar.jar这个文件就是我们借助工具之后成功转换出来的jar文件了。但是对于我们而言,jar文件也不是可读的,因此这里还需要再借助一下jd-gui这个工具来将jar文件转换成java代码。
双击jd-gui.exe,打开jd-gui

将classes-dex2jar.jar拖拽到jd-gui软件中打开预览

导出代码,借助Android Studio打开,便于全局搜索【按需操作】
当反编译的项目比较大的时候,那么在jd-gui软件中进行全局搜索某个变量名时,几乎是不可能的。那么一个比较好的解决方案是,通过jd-gui软件将所有的反编译项目的代码导出,然后通过Android Studio打开(虽然会报错,不过不用管),这样就可以借助Android Studio的全局搜索功能进行快速搜索查找了。
File——Save All Sources

指定导出目录以及文件名(我这边默认处理)


根据反编译项目的包名,通过Android Studio创建一个空白项目,然后将项目代码复制到新建的空白项目中
包名的获取:通过反编译资源,得到AndroidManifest.xml文件,查看package属性值。

如果想要把资源也复制到新建空白项目中的话,那么就按照反编译资源的操作步骤进行操作。
反编译资源
下载
apktool:这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
下载地址:见文章末尾。
安装
直接解压即可,然后跟上面的两个软件放到同一个目录下。

反编译资源
将需要反编译的APK文件复制到该目录下

打开命令行提示符,定位到apktool目录

输入命令:apktool.bat d -f helloworld.apk -o helloworld
命令中helloworld.apk指的是要反编译的APK文件全名,helloworld为反编译后资源文件存放的目录名称,即为:apktool.bat d –f [apk文件 ] –o [输出文件夹]
- -f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
- -o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
- -s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
- -r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。

报错不用管,成功之后发现在文件夹下多了个helloworld文件夹,点击便可以查看该应用的所有资源文件了。

文章所需软件下载地址
链接:https://pan.baidu.com/s/1LcPyuWJp1vzQJXaT3yFWkQ 密码:owwa
参考资料
【反编译系列】一、反编译代码(dex2jar + jd-gui)和反编译资源(apktool)的更多相关文章
- C#编译时出现“不安全代码只会在使用 /unsafe 编译的情况下出现”错误的解决
原因是:在编译的代码里面有不安全类型unsafe方法或类!解决方法:将项目属性页中生成下的“允许不安全代码”复选框打上对勾即可,方法如下:项目属性对话框->生成->允许不安全代码块 选中即 ...
- maven自己主动编译,解决你每次代码改动须要又一次编译的繁琐
maven结构的项目,我们在每次改动代码后都会须要手动编译,以下命令能够解决此问题.仅仅要代码改动.会自己主动帮你编译. 进入项目文件夹运行:mvn -U eclipse:clean eclipse: ...
- 【反编译系列】二、反编译代码(jeb)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 一般情况下我们都是使用dex2jar + jd-gui的方式反编译代码,在实际使用过程中,有时候发现反编译出来的代码阅读效果不是很好 ...
- 详细讲解Android对自己的应用代码进行混淆加密防止反编译
1.查看项目中有没有proguard.cfg. 2.如果没有那就看看这个文件中写的什么吧,看完后将他复制到你的项目中. -optimizationpasses 5 -dontusemixedcasec ...
- Mac下载并编译Google安卓AOSP项目代码
Mac下载并编译Google安卓AOSP项目代码 参考 https://source.android.com/source/index.html 这两天用Mac下载安卓AOSP源码,且把遇到的问题记下 ...
- Linux编译Windows共享目录下代码
Linux编译Windows共享目录下代码(金庆的专栏)万神服务器代码是跨平台的.平时策划在Windows上开自己的服务器测试,测试和发布服务器为Linux.开发时,先在Windows上编译测试,再到 ...
- 如果是多个 c 代码的源码文件,编译方法如下: $ gcc test1.c test2.c -o main.out $ ./main.out test1.c 与 test2.c 是两个源代码文件。
如果是多个 c 代码的源码文件,编译方法如下: $ gcc test1.c test2.c -o main.out $ ./main.out test1.c 与 test2.c 是两个源代码文件.
- 如何使用g++编译调用dll的c++代码
本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dl ...
- java动态编译 (java在线执行代码后端实现原理)(二)
在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...
随机推荐
- html居中定位
<!DOCTYPE html PUBLIC "-//W3C//Ddiv XHTML 1.0 divansitional//EN" "http://www.w3.or ...
- java实现堆结构
一.前言 之前用java实现堆结构,一直用的优先队列,但是在实际的面试中,可能会要求用数组实现,所以还是用java老老实实的实现一遍堆结构吧. 二.概念 堆,有两种形式,一种是大根堆,另一种是小根堆. ...
- polysh安装与使用-同时查看多台机器日志
polysh简介 polysh 是一个交互式命令,可以在一台服务器上批量的对一批服务器进行处理,运行交互式命令.官方的简介如下: Polysh is a tool to aggregate sever ...
- python笔记:#003#PyCharm 的初始设置
PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...
- Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】
Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin[Finchley 版] 发表于 2018-04-24 | 随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请 ...
- 架构之微服务设计(Nginx + Upsync)
Upsync,微博开源基于Nginx容器动态流量管理方案 . Nginx 以其超高的性能与稳定性,在业界获得了广泛的使用,微博的七层就大量使用了 Nginx .结合 Nginx 的健康检查模块,以及动 ...
- Centos制作本地yum源
本地YUM源制作 1. YUM相关概念 1.1. 什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shel ...
- Java面向对象(一、封装)
Java 封装 封装的概念 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码 ...
- java ArrayList集合
ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类).在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来 ...
- SSM-SpringMVC-33:SpringMVC中拦截器Interceptor讲解
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 拦截器Interceptor: 对处理方法进行双向的拦截,可以对其做日志记录等 我选择的是实现Handler ...