Android-apktool-就从此处开始反编译之旅
前言
一直听说过反编译,感觉很高大上,一直没自己用过,今天因缘巧合之下,终于要开始逐渐认识,了解和学习一下反编译了~先给自己说下加油,鼓励一下下
apktool的下载和安装
apktool 下载地址:
Apktool [![Join the chat athttps://gitter.im/iBotPeaches/Apktool]
apktool 安装教程:
这个是上面网站上给出的安装使用文档:
Apktool - How to Install
注:以上都需***.
首先,先反编译一下
当完成以上步骤之后,我们 window +R->打开 cmd 窗口
1.运行 apktool 命令 出现了 apktool 的版本号和指导的命令
2.随便找来一个 apk ,尝试反编译一下,运行 apktool d -f c:\test.apk -o c:\test 命令,把 test.apk 反编译,反编译后的文件放入 c 盘下的 test 文件中
3.反编译的文件结构如下:
| 名称 | 存放内容 |
|---|---|
| assets | (未被编译)项目的assets文件夹 |
| res | (未被编译)项目的res文件夹 里面可以清楚的看到values, layout, drawble,anim,mipmap文件夹 |
| smali | (被编译)项目的Java文件,这里表现的不是.Java格式,是.smali格式 |
造成这个现象的原因是:
Android 的 assets 和 res 文件都不会编译为二进制文件,所以反编译后,基本都是能看到它的全貌.
Android 中 .Java 文件,在 JVM 编译之后变成 .class 文件,然后再经过Android 的虚拟机 Dalvik,代码编译为 .smali 文件
smali 是另外一种语言,和汇编是有点像的,涉及寄存器操作等,下面是一个截图,对于我来说,只能是大概能看懂:
若是对 smali 语法有兴趣,可以去下面网址看一下,StackOverFlow 上面万能网友们给出了很多学习的网址.
What’s the best way to learn Smali (and how/when to use Dalvik VM opcodes)?
然后,想想反编存在的意义在哪里?
Every coin have two sides.这是我高中英文作文基本都会写的一句话.每个工具都是一把双刃剑,就像一枚硬币有正反两面一样.那么 强大的 apktool 肯定也是一样.以下属于,我个人的见解,如有不对,还望指正.
带来便利一面:
- 提供一个方式,去反编译优秀的软件,学习知识
- smali 是 Dalvik 的执行语言,你完全可以通过反编译去查看 Java 代码的 smali 语言,去更深入的了解程序的运行原理和流程
带来威胁一面:
- 发布的 APK 被二次打包,作为盗版产品使用,甚至恶意插入广告,病毒等,对软件公司带来损失
- 发布的 APK 被反编译,获取的有关服务器的信息,给服务器带来威胁.
- 通过反编译修改 smali 文件,减去客户端的限制,去获取不正当的利益,一般发生在游戏软件上
对于开发者来说,前者你可以不用,但是后者不得不防,于是,我们必须给自己的 APK 加上保护.
至于怎么加,表示最近正在了解和学习这方面的知识^_^,也许下篇博客会讲,我会回来补上链接的.
Android-apktool-就从此处开始反编译之旅的更多相关文章
- Android基础新手教程——1.10 反编译APK获代替码&资源
Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样 ...
- Android学习笔记_44_apk安装、反编译及防治反编译
一.APK安装 1.首先需要AndroidManifest.xml中加入安装程序权限: <!-- 安装程序权限 --> <uses-permission android:name=& ...
- Android安全测试(二)反编译检测
1.测试环境 SDK: Java JDK, Android SDK. 工具: 7zip, dex2jar, jd-gui 2.操作步骤 第一步:把apk改后缀名为zip 第二步:将zip文件解压,得到 ...
- Android如何防止apk程序被反编译
作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-s ...
- Android对apk源代码的改动--反编译+源代码改动+又一次打包+签名【附HelloWorld的改动实例】
最近遇到了须要改动apk源代码的问题,于是上网查了下相关资料.编写了HelloWorld进行改动看看可行性,经过实验证明此方案可行,而且后来也成功用这种方法对目标apk进行了改动,仅仅只是须要改动的部 ...
- Android库分析工具(崩溃反编译)
[时间:2016-07] [状态:Open] [关键词:android, 动态库,静态库, 编译,crash,addr2line] 本文主要整理Android编译系统中可用的库分析工作,可作为后续代码 ...
- Android反编译(二)之反编译XML资源文件
Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具 apktool http ...
- 实例具体解释:反编译Android APK,改动字节码后再回编译成APK
本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能 ...
- Android安全攻防战,反编译与混淆技术完全解析(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/49738023 之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值 ...
随机推荐
- Android OnGestureListener用法 识别用户手势 左右滑动
Android可以识别用户的手势(即用户用手指滑动的方向),通过用户不同的手势,从而做出不同的处理 需要使用OnGestureListener 比如说看电子书的时候翻页,或者要滑动一些其他内容 直接上 ...
- Spring5源码深度解析(一)之理解Configuration注解
代码地址:https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian 1.Spring体系结构 ...
- Eclipse高效开发插件汇总
以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1) AmaterasUML 介绍:Eclipse的UML插件,支持UML活动图,class图,sequen ...
- 0、驱动及应用小技巧、uboot指令及环境变量配置、linux常用命令
(内核make menuconfig之后,通过insmod安装的驱动都应该重新make,可能会出现一些莫名的问题) (nor flash/SDRAM/DM9000都受内存控制器控制,需要配置内存控制器 ...
- 解读Java中BigDecimal.ZERO.compareTo()的返回值含义
Java compareTo() 用法 例如: public static void main(String[] args) { BigDecimal bnum1, bnum2; bnum1 ...
- Nginx+Memcached+Tomcat集群配置(MSM--win7 64bit)
本次主要是在win7 64 上演示操作. web应用构建 Memcached安装配置启动 Tomcat配置 所需jar包 memcached-session-manager 序列化 contextxm ...
- 美国汪利宏的蒙特卡洛及卷积模拟程序,可以模拟top-hat光束和高斯光束在生物组织中的传输
链接:https://pan.baidu.com/s/1yaCsQ8TCVPSIZ4TVBZgfnw 密码:otzr
- 【solr基础教程之九】客户端 分类: H4_SOLR/LUCENCE 2014-07-30 15:28 904人阅读 评论(0) 收藏
一.Java Script 1.由于Solr本身可以返回Json格式的结果,而JavaScript对于处理Json数据具有天然的优势,因此使用JavaScript实现Solr客户端是一个很好的选择. ...
- 自定义view组件 分类: H1_ANDROID 2013-10-26 21:55 741人阅读 评论(0) 收藏
参考<疯狂android讲义>第2版 2.1节P48,对应CustomViewDemo.zip. 若在开发过程中,发现现有的view均不能满足需要,可以自定义一个view. 自定义一个vi ...
- Android多线程研究(5)——线程之间共享数据
一.如果是每个线程都执行相同的代码,则可以使用同一个Runnable来实现共享 public class MultiThreadShareData { public static void main( ...