Androd安全——反编译技术完全解析

0.前言

单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能。另外既然别人可以反编译程序,我们当然有理由应该对程序进行一定的保护,因此代码混淆也是我们必须要掌握的一项技术。看完此篇如果对代码混淆也感兴趣,可以参考Android安全——混淆技术完全解析

 

1反编译

Android的反编译主要又分为两个部分,一个是对代码反编译,一个是对资源反编译

 

1.1 代码反编译

要想将APK文件中的代码反编译出来,我们需要用到以下两款工具:

adex2jar这个工具用于将dex文件转换成jar文件。

下载地址:http://sourceforge.net/projects/dex2jar/files/

bjd-gui这个工具用于将jar文件转换成Java代码。

下载地址:http://jd.benow.ca/

 

1)我们首先将APK文件进行解压,可以先将文件后缀名改成zip,然后用解压软件打开。解压之后你会发现里面有一个classes.dex文件

2classes.dex就是存放所有Java代码的地方,我们将它拷贝到dex2jar解压后的目录下,并在cmd中也进入到同样的目录,然后执行:

d2j-dex2jar classes.dex
3)如果没有报任何错误,这就说明我们已经转换成功了。现在观察dex2jar目录,你会发现多了classes-dex2jar.jar这个文件。但是对于我们而言,jar文件也不是可读的,因此这里还需要再借助一下jd-gui这个工具来将jar文件转换成Java代码。

4)最后一步就是使用jd-gui工具打开classes-dex2jar.jar这个文件。我们便得到了Java代码。基本已经做到了90%以上的还原工作,像setContentView()方法传入的参数,反编译也就只能将相应的id值进行还原,而无法变成像R.layout.activity_main这样直观的代码展示。另外,除了MainActivity之外,引用的library也会作为代码的一部分被打包到classes.dex文件当中,因此反编译的时候这些代码也会一起被还原。

 

1.2 资源反编译

要想将APK文件中的资源反编译出来,又要用到另外一个工具了:

Apktool用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源

下载地址:http://ibotpeaches.github.io/Apktool/install/

1)下载该工具后目录下会存在apktool.batapktool.jar这两个文件

2)我们将APK文件拷贝到和这两个文件同样的目录下,然后cmd也进入到这个目录下,并在cmd中执行如下命令:

apktool d <APKName>.apk

3)第二步成功后我们会发现在当前目录下多了一个<APKName>文件夹,这个文件夹中存放的就是反编译的结果了。我们可以打开AndroidManifest.xmlres/layout即可查看资源信息。

【拓展】

第二步命令中ddecode的意思,表示我们要对Demo.apk这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为:

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


2.  重新打包

首先我们来看一下通过apktool反编译后的包目录情况,如下图所示:


1)其中,original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件

2res文件夹下存放的是反编译出来的所有资源

3smali文件夹下存放的是反编译出来的所有代码

4AndroidManifest.xml则是经过反编译还原后的manifest文件

这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的Java文件都变成了smali文件smali文件其实也是真正的源代码,只不过它的语法和Java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言,如果你能够看得懂smali文件的话,那么你就可以做很恐怖的事情了——你可以随意修改应用程序内的逻辑,将其进行破解。我们可以稍微改变smali文件里的部分内容,并重新打包,只需要在cmd中执行如下命令:

apktool b Demo -o <New_APKName>.apk 

其中bbuild的意思,表示我们要将Demo文件夹打包成APK文件,-o用于指定新生成的APK文件名。成功后便在当前目录下生成了apk文件。


3.  重新签名

不过目前这个<New_APKName>.apk还是不能安装的,因为它还没有进行签名。我们显然没有办法拿到原作者的签名,因此我们只能拿自己的签名文件对这个APK文件重新进行签名,重新打包出来的软件也就是个盗版软件。使用Android Studio或者Eclipse都可以非常简单地生成一个签名文件。

有了签名文件之后在cmd中执行签名命令就可以进行签名了,命令格式如下:

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

1)其中jarsigner命令文件是存放在jdkbin目录下的,需配置系统的环境变量。下同。

2)签名之后的APK文件现在已经可以安装到手机上了,不过在此之前为了使得我们的程序在Android系统中运行得更快,我们需要对签名后的APK文件进行一次对齐操作(使用的是zipalign工具,存放于<Android SDK>/build-tools/<version>目录下),命令格式如下:

zipalign 4 <New_APKName>.apk <New_APKName_aligned >.apk

3)其中4是固定值不能改变,后面指定待对齐的APK文件名和对齐后的APK文件名。运行这段命令之后就会生成一个<New_APKName_aligned >.apk文件,便可以在手机上运行我们重新打包过后的APK了。

 

转载整理自郭大侠博客:http://blog.csdn.net/guolin_blog/article/details/49738023


转载于:https://www.cnblogs.com/qitian1/p/6461528.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python——shape 与reshape

转载自:https://blog.csdn.net/u010916338/article/details/84066369 shape()和reshape()都是数组array中的方法 numpy中reshape函数的三种常见相关用法 numpy.arange(n).reshape(a, b) 依次生成n个自然数&#xff0c;并且以a行b列的数组形式显示np.arange(16).reshape(2,…

误删了microsoft visual c++后如何正常运行matlab

误删了microsoft visual c后如何正常运行matlab 本人在卸载visual studio2013的时候&#xff0c;因为这个软件卸载的过程中出现一些问题&#xff0c;误将visual c当成VS的组件一同删除了。但是在打开matlab 时发现出错&#xff0c;matlab打开后会出现下面的界面。 出现这个问题…

iScreenLocker 3.1.8 安卓锁屏通知--苹果一样的体验

*软件介绍:苹果锁屏通知(iScreenLocker)是一款android上ios风格的锁屏软件。它颠覆安智通知设计&#xff0c;将原来状态栏的通知搬到锁屏界面上来&#xff0c;能够在桌面轻松收发短信,微博,微信等消息。它独有的消息唤醒功能。能使手机从待机界面唤醒而消耗非常少的电量。手指轻…

JSP慕课网阶段用户登录小例子(不用数据库)

getAttribute和setAttribute一起使用&#xff0c;而getParameter用于取得如request传来的参数。 Web是请求/响应架构的使用&#xff0c;而request和response就是在服务器端生成的相应的两个对象&#xff0c;request能够获取客户端传递的参数及相关的一些信息&#xff0c;而resp…

机器学习python——python基础

目录 1、常用库 2、shape与reshape&#xff0c;dtype 3、range、arange、linspace、logspace 4、数组的计算、切片 5、绘图基本设置 6.三维绘图 1、常用库 numpy、scipy、matplotlib、math 2、shape与reshape&#xff0c;dtype https://blog.csdn.net/qq_45769063/arti…

win10环境下如何给visual studio 2013永久配置opencv3.1.0环境

win10环境下如何给visual studio 2013永久配置opencv3.1.0环境 本人在给visual studio 2013配置opencv 环境下遇到过一些问题&#xff0c;比如配置不成功或者不能永久配置opencv环境。先将自己的配置经验分享于此&#xff0c;希望同道中的好友可以用上。 首先自行下载Visual s…

属性名、变量名与 内部关键字 重名 加

procedure TForm4.btn3Click(Sender: TObject); varMyQj: TQJson;MyPrinter: TPrinter; beginMyQj : TQJson.Create;tryMyPrinter.name : A号打印机;MyPrinter.status : enabled;MyPrinter.&type : yes;MyQj.FromRecord<TPrinter>(MyPrinter);Memo1.Lines.Add(MyQj.A…

机器学习——支持向量机SVM之线性模型

目录 一、没有免费的午餐定理 二、支持向量机SVM&#xff08;support vector machine&#xff09; 1、线性模型和非线性模型 2、如何在线性模型中画出一条直线&#xff08;优化过程——vplink&#xff09; 1&#xff09;多少条&#xff1f; 2&#xff09;如何画出最好的直…

Oauth2.0和1.0区别

1.0的授权分3步, A)客户端到授权服务器请求一个授权令牌(request token&secret) B)引导用户到授权服务器请求授权 C)用访问令牌到授权服务器换取访问令牌(access token&secret) D)用访问令牌去访问得到授权的资源 2.0的用户授权过程有2步&#xff0c; A)引导用户到授权…

spring@PropertySource用法

v测试例子 package com.hjzgg.auth.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annot…

机器学习——支持向量机SVM之非线性模型(低维到高维映射)

目录 一、非线性模型的最优化问题 1、非线性模型最优化模型 2、两个概念 1&#xff09;正则项&#xff08;regularization term&#xff09; 2&#xff09;调参参数 2、高维映射 1&#xff09;定义及作用 2&#xff09;高维映射后的最优化模型 3&#xff09;异或问题&…

html表单中get与post之间的区别

当用户在 HTML 表单 (HTML Form) 中输入信息并提交之后&#xff0c;有两种方法将信息从浏览器传送到 Web 服务器 (Web Server)。 一种方法是通过 URL&#xff0c;另外一种是在 HTTP Request 的 body 中。 前一种方法&#xff0c;我们使用 HTML Form 中的 method "get&quo…

世界坐标系,摄像机坐标系、图像坐标系关系汇总

**摄像机标定&#xff1a;**在计算机视觉研究领域&#xff0c;摄像机标定是一个重要的环节。摄像机标定就是求取摄像机内外参数的过程。 世界坐标系&#xff1a;绝对坐标系&#xff0c;一般的三维场景都由这个坐标系来表示。摄像机可以放置在环境中的任何位置&#xff0c;因此可…

SpringMVC-HelloWorld

2&#xff0e;5、Hello World入门 2.5.1、准备开发环境和运行环境&#xff1a; ☆开发工具&#xff1a;eclipse ☆运行环境&#xff1a;tomcat6.0.20 ☆工程&#xff1a;动态web工程&#xff08;springmvc-chapter2&#xff09; ☆spring框架下载&#xff1a; spring-framework…

机器学习——支持向量机SVM之非线性模型(原问题和对偶问题)

目录 一、原问题&#xff08;prime problem&#xff09; 二、原问题的对偶问题&#xff08;dual problem&#xff09; 1、定义一个辅助函数 2、定义对偶问题 >>>问题1&#xff1a;上面说到遍历w&#xff0c;那w的取值范围和取值步长是怎样的&#xff1f;即遍历的…

(转)Apache Rewrite 详解

(转)Apache Rewrite 详解参考文档&#xff1a;http://man.chinaunix.net/newsoft/ApacheManual/mod/mod_rewrite.htmlApache Rewrite 详解一 入门RewriteEngine onRewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php就这两行. 然后就完成了URL重写功能了. 首先服务器是需要支…

python轮廓函数的使用

在图像的处理中有时候需要对图像中的目标区域提出出轮廓 读取图像 调用OpenCV的库使用cv.imread()来读取图像。 图像为 灰度化 二值化 提取轮廓时&#xff0c;图像一般都是二值化后的图像。在本次程序中选用cv2.THRESH_BINARY的二值化方式。即将大于阈值的部分设定为255&am…

Intent Bundle页面跳转信息的传递

MainActivity LoginActivity LoginLayout 转载于:https://www.cnblogs.com/xiaolei121/p/5846644.html

机器学习——支持向量机SVM之非线性模型(原问题转化为对偶问题)

目录 一、复习&#xff08;原问题、对偶问题、KKT条件、凸函数&#xff09; 二、将最优化问题标准化为原问题&#xff08;严格转化为标准形式&#xff09; 1、原最优化问题 2、标准化后的问题 三、转化为对偶问题&#xff08;注意变量的对应关系&#xff09; 四、对对偶问…

静止的单摄像机无法得到像点的三维坐标详解

我们知道在机器视觉中通常要使用的搭建的视觉测量系统对一个物体的尺寸、形变、以及三维形貌进行测量。一般按照摄像机的个数以及组成部分分为三类测量方法。分别为单目测量、双目&#xff08;大于2为多目&#xff09;测量、以及结构光测量。 单目测量系统 顾名思义单目就指的…