APK反编译详解_java apk反编译-程序员宅基地

技术标签: Android学习零散笔记  安卓APK反编译  Android技术  

原文地址:APK反编译详解

这里的反编译的目的并不是修改别人的代码然后自己发布盗版apk,而且这种方法也做不到。这里的反编译只能查看作者的大致代码,目的是研究apk中某些效果的实现方法,知道大致的方法之后,具体代码还需自己写。

apk的反编译分为两部分,一是反编译classes.dex得到java代码,二是反编译资源文件以及xml布局文件,这两部分是分开的,并且使用的是不同的工具。

 

这些工具分别是apktool、dex2jar和jd-gui,其中apktool用于反编译xml文件;apktool用于反编译classes.dex,生成.jar文件,然后用jd-gui.exe查看这个jar文件中的java代码。

我用的apktool和dex2jar的版本分别是apktool1.5.2 和 dex2jar-0.0.9.15。

下载地址见文末。

一、反编译Apk得到Java源代码

先将apk文件的后缀名改成zip,然后解压这个zip文件,解压之后一般会得到包含如下文件的目录:

QQ图片20150420095243.png

这里只有classes.dex文件有用,将这个classes.dex拷贝到dex2jar的dex2jar.bat所在目录,然后在命令行下定位到dex2jar.bat所在目录,运行:

1
dex2jar.bat  classes.dex

 QQ图片20150420100440.png


然后在同一目录下就会生成classes_dex2jar.jar文件。

我们用jd-gui打开这个jar文件就可以看到java代码了。

QQ图片20150420100847.png

从反编译出的代码可以看出,这个apk的代码混淆做的比较好,不容易分析出其代码结构。



二、反编译apk的xml,图片等资源文件。

直接解压apk也能得到图片、xml等资源文件,但是得到的xml是乱码,而图片资源也也不是原封不动的,特别是.9图片,全都变成了一般的图片。

apktool专门用于反编译这些资源文件。

下载:apktool1.4.1.tar.bz2 和 apktool-install-windows-r04-brut1.tar.bz2(两个包都下载),将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar。

如果不知道怎么做,或者无法下载,直接使用我在文章末尾给出的工具包就行了,我已经弄好了。

QQ图片20150420102332.png

首先定位到apktool所在的目录,然后执行:

1
apktool   d   souhushipin.apk   souhushipin

命令行解释:apktool   d   [apk文件 ]   [输出文件夹]

其中[apk文件 ]和[输出文件夹]都直接在apktool的根目录的话,就不需要写绝对路径了,直接写文件和目录名。

为了命令行书写方便我都是直接将apk文件放在同一目录下。如下:

QQ图片20150420103946.png


其中[输出文件夹]只需指定就好了,不要自己新建目录,他会自动生成。如上图,执行了

1
apktool   d   souhushipin.apk   souhushipin

之后,就会在同一目录下得到souhushipin文件夹。里面有这些东西:

QQ图片20150420104201.png

和dex2jar反编译出的java代码不同,apktool反编译出的资源文件都是可以直接使用的,不存在混淆的问题。

重新打包修改过的apk

apktool还可以将反编译完的文件重新打包成apk,很简单,输入apktool b [文件夹](你编译出来文件夹)即可,命令如下:

1
apktool   d   b  souhushipin

QQ图片20150420105823.png

运行之后会在souhushipin目录下生成

build

dist

两个文件夹。

QQ图片20150420110111.png

其中,打包生成的souhushipin.apk,在上面的dist文件夹下。

想想这种方法是不是可以用于apk的汉化呢。。。。


最后我把所有用到的工具都放在一个包中,而且apktool的两个东西我都已经弄在一起了,解压后就可以直接使用。

下载地址: 反编译工具集 。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq457163027/article/details/51693475

智能推荐

我的分页哪里出错了_php $page=$_get['page']; 报错-程序员宅基地

文章浏览阅读132次。php代码<?php$page=$_GET['page']; //前端传过来的分页$limit=$_GET['limit'];$key=$_GET['key']; //前端传来的值$dbhost = 'localhost'; // mysql服务器主机地址$dbuser = 'root'; // mysql用户名$dbpass = 'yihao20..._php $page=$_get['page']; 报错

随机数的小案例:获取任意范围内的随机数_storm统计某个范围内的随机数个数-程序员宅基地

文章浏览阅读316次。随机数的小案例:获取任意范围内的随机数public class Demo1 { public static void main(String[] args) { // 1.键盘录入数据 Scanner sc = new Scanner(System.in); System.out.println("请输入开始数:"); int start = sc.nextInt(); _storm统计某个范围内的随机数个数

NeHe OpenGL教程 第八课 混合_nehe framebufferobject-程序员宅基地

文章浏览阅读1.1k次。完全的透明(simple transparency)在OpenGL中很多特定的效果依赖于一些类型的混合。混合用来把将要绘制到屏幕上的像素的颜色和已经绘制到屏幕上的像素的颜色结合起来。颜色如何混合依赖于颜色的alpha值 和/或使用的混合函数。alpha通常是指定的颜色组成的第_nehe framebufferobject

ubuntu 18.04安装rviz_rviz下载ubuntu-程序员宅基地

文章浏览阅读4.7k次。修改source list,首先备份源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup打开sources.list文件修改sudo vim /etc/apt/sources.list用下面阿里原替换掉文件中所有的内容,保存编辑好的文件deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://._rviz下载ubuntu

Linux 系统管理 : sudo 命令详解_linux里的sudo-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏3次。sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。语法sudo(选项)(参数)选项-b:在后台执行指令;-h:显示帮助;-H:将HOME环境变量设为新身份的HOME环境变量;..._linux里的sudo

php7.4.1 configure: error: Package requirements (libxml-2.0 >= 2.7.6) were not met:-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏4次。今天编译了一下php7.4 因为我的libxml 是自己编译按照以前的版本方式 安装时指定--with-libxml-dir=/opt/libxml2 一下编译的libxml 目录还是不可以https://bugs.php.net/bug.php?id=79135&thanks=2 去php官方提了编译失败的问题,感谢大佬回答大佬说 php 7.4 是依赖于p..._configure: error: package requirements (libxml-2.0 >= 2.7.6) were not met:

随便推点

MySQL系列:innodb源码分析之redo log恢复_missing redo log file .\#innodb_redo\#ib_redo50 (w-程序员宅基地

文章浏览阅读598次。在上一篇《innodb源码分析之重做日志结构》中我们知道redo log的基本结构和日志写入步骤,那么redo log是怎么进行数据恢复的呢?在什么时候进行redo log的日志推演呢?redo log的推演只有在数据库异常或者关闭后,数据库重新启动时会进行日志推演,将数据库状态恢复到关闭前的状态。那么这个过程是怎么进行的呢?以下我们逐步来解析。1.recv_sys_t结构 i_missing redo log file .\#innodb_redo\#ib_redo50 (with start_lsn = 157192192)

【盖楼抽奖】华为开发者学堂推出HarmonyOS官方课程专区,分享心得赢超值好礼_harmonyos马克杯-程序员宅基地

文章浏览阅读284次。华为开发者学堂推出HarmonyOS官方课程专区,分享心得赢超值好礼!_harmonyos马克杯

严重: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start componen_containerbase.addchild: start: org.apache.catalina-程序员宅基地

文章浏览阅读6.2k次。严重: ContainerBase.addChild: start:org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@ea1a8d5]at org.apache.catalina.util.LifecycleBase.h..._containerbase.addchild: start: org.apache.catalina.lifecycleexception: faile

vue中使用Sortable.js实现拖拽功能_sortablejs怎么实现从一个盒子拖动到另一个盒子-程序员宅基地

文章浏览阅读1.4k次。安装Sortable.jsnpm install sortablejs --save<template> <div id="box"> <!-- ref就是为了获取el对象 --> <div ref="item1" class="box"> <div>item 1</div> <div>item 2</div> <div>item 3._sortablejs怎么实现从一个盒子拖动到另一个盒子

dwz框架如何将弹出的子窗口传值回父窗口_dwz的dialog窗口传值到父页面-程序员宅基地

文章浏览阅读3k次。可以在主页面里放上个隐藏域,然后将值放进去,这样不管哪个页面就都能取得到了_dwz的dialog窗口传值到父页面

Linux 系统设置 : modprobe 命令详解-程序员宅基地

文章浏览阅读8.8k次。modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。语法modprobe(选项)(参数)选项-a或--all:载入全部的模块;-c或--show-conf:显示所有..._modprobe 命令详解

推荐文章

热门文章

相关标签