Android 反编译

步骤:1.下载apktool 工具,这一步 主要是反编译 xml 文件。

步骤:2

把xx.smali 文件转为java 工具 (单个) 图形界面

下载dex2jar  和xjad 工具(批量) 命令行加图形界面

可选

反编译用法:
java -jar baksmali-2.0..jar -o c:\classout/ c:\classes.dex
把c:\classes.dex反编译为smali,输出到c:\classout目录
编译用法:
java -jar smali-2.0..jar c:\classout/ -o c:\classes.dex
把c:\classout目录下的smali文件编译为c:\classes.dex

把apk 文件解压为 可以找到classes.dex文件 通过d2j-dex2jar.bat 命令行运行得到一个jar 包 默认在C盘。然后通过图形界面xjad  =》文件-》反编译文件 找到jar包,确定 就可以了,在c盘 的 ~classes-dex2jar.jar 文件夹下找到java文件了。

我的工具包

以上是我的简便方法;

====================================================

下面上网上的方法 参考哦:

 因为学习Android编程的需要,有时我们需要对网络上发布的应用项目进行学习,可是Android项目一般是通过APK文件进行发布的,我们看不到源代码,嘿嘿,办法总会有的,而且不止一个...

   ps:对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些我们自己编写的跟踪程序。Google最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。

一、dexdump方法

      dexdump是emulator自带提供的查看dex文件的工具,可使用类似这样的命令将dex文件dump到txt文件中:

      D:\Program Files\android-sdk-windows-.6_r1\platforms\android-1.6\tools>dexdump.exe -d classes.dex > spk.dump.txt

     得到的文件内容,描述了类的信息,但实在是不好读啊~~~~

二、dex2jar + XJad 方法

     该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。如:

     、dex2jar.bat d:\play\classes.dex

          默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar

     、使用XJad反编译该jar包

          之后的使用方法,大家都懂的:)

     该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时的java文件,而开发时使用的lib包不能反编译出来。

三、AXMLPrinter2.jar + baksmali.jar + smali.jar 方法

      这个方法就强大了,AXMLPrinter2是还原AndroidManifest.xml和main.xml的工具,直接打开这两个xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加的密)。

      baksmali.jar是反解析dex的工具,smali.jar则是再还原成dex的工具

      操作方式如下:

     、java -jar AXMLPrinter2.jar D:\play\AndroidManifest.xml > AndroidManifest.txt

     、java -jar AXMLPrinter2.jar D:\play\res\layout\main.xml > main.txt

     、java -jar baksmali-1.2..jar -o classout/ d:\play\classes.dex

      baksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:

view plaincopy to clipboardprint?
.class Lcom/paul/test/a;
.super Landroid/view/View; # static fields
.field private static final a:Landroid/graphics/Typeface; # instance fields
.field private b:I
.field private c:I
.field private d:Z
.field private e:J
.field private f:I
.field private l:[Ljava/lang/String; # direct methods
.method static constructor <clinit>()V
.registers
sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;
const/ v1, 0x0
invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
move-result-object v0
sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;
return-void
.end method
#
# other methods ..........
#
# virtual methods
.method public onKeyUp(ILandroid/view/KeyEvent;)Z
.registers
const/ v0, 0x42
if-eq p1, v0, :cond_8
const/ v0, 0x17
if-ne p1, v0, :cond_b
:cond_8
invoke-direct {p0}, Lcom/paul/test/a;->d()V
:cond_b
const/ v0, 0x0
invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
move-result v0
return v0
.end method
.class Lcom/paul/test/a;
.super Landroid/view/View; # static fields
.field private static final a:Landroid/graphics/Typeface; # instance fields
.field private b:I
.field private c:I
.field private d:Z
.field private e:J
.field private f:I
.field private l:[Ljava/lang/String; # direct methods
.method static constructor <clinit>()V
.registers
sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;
const/ v1, 0x0
invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
move-result-object v0
sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;
return-void
.end method
#
# other methods ..........
#
# virtual methods
.method public onKeyUp(ILandroid/view/KeyEvent;)Z
.registers
const/ v0, 0x42
if-eq p1, v0, :cond_8
const/ v0, 0x17
if-ne p1, v0, :cond_b
:cond_8
invoke-direct {p0}, Lcom/paul/test/a;->d()V
:cond_b
const/ v0, 0x0
invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
move-result v0
return v0
.end method 认真一看,就知道: # static fields 定义静态变量的标记 # instance fields 定义实例变量的标记 # direct methods 定义静态方法的标记 # virtual methods 定义非静态方法的标记 以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程: :cond_8
invoke-direct {p0}, Lcom/paul/test/a;->d()V 调用com.paul.test.a的d()方法 不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程: :cond_b
const/ v0, 0x0 invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z move-result v0 大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法 最后 return v0 该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概

Android 反编译的更多相关文章

  1. Android反编译(三)之重签名

    Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...

  2. Android反编译(二)之反编译XML资源文件

    Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具  apktool http ...

  3. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  4. Atitti.java android反编译解决方案-----虚拟机方案

    Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...

  5. Android反编译工具的使用-Android Killer

    今天百度搜索“Android反编译”搜索出来的结果大多数都是比较传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比较方便操作的Android反编译.在这,我将使 ...

  6. 转 谈谈android反编译和防止反编译的方法

    谈谈android反编译和防止反编译的方法   android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的项 ...

  7. Android 反编译apk 详解

    测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取)  下载          dex2jar(源码文件获取) 下载        jd-gui  (源码查看)  ...

  8. Android 反编译工具简介

    Android 反编译工具: 所需工具:1 apktool : 用于获取资源文件 2 dex2Jar : 用于将classes.dex转化成jar文件 2 jd-gui: 将jar文件转化成java文 ...

  9. Android反编译教程

    本文摘自 http://blog.csdn.net/ithomer/article/details/6727581 本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubu ...

随机推荐

  1. cocos2d-x渲染流程

    Cocos2Dx之渲染流程 发表于8个月前(2014-08-08 22:46)   阅读(3762) | 评论(2) 17人收藏此文章, 我要收藏 赞2 如何快速提高你的薪资?-实力拍“跳槽吧兄弟”梦 ...

  2. String的hashcode(java)

    hashCode就是我们所说的散列码,使用hashCode算法可以帮助我们进行高效率的查找,例如HashMap,说hashCode之前,先来看看Object类. Java程序中所有类的直接或间接父类, ...

  3. 手机上的页面转换page slider

    小伙伴们是不是经常在手机上见到“转场"的情况,手机上的页面转换已经不像pc上整体的页面跳转,很多都是利用动画平滑地在页面之间的切换.   那么如何来做页面之间的转换呢?首先要明确的是,所谓的 ...

  4. java swing 中的FileDialog

    1.FileDialog使用方法: FileDialog fd=new FileDialog(new Frame(),"测试",FileDialog.LOAD);  Filenam ...

  5. 使用windows资源管理器的排序规则

    对于windows资源管理器 abc_1_def是要排到abc_10_def前面的 而一般的排序规则, 都会吧_10_排到前面 所以为了使用习惯, 最好用资源管理器的排序规则, windows有个AP ...

  6. LINUX VI 常用命令

    vi 打开或新建 vi filename 打开或新建文件 并将光标置于第一行首 光标 )  光标移至句尾 (  光标移至句首 屏幕翻滚类命令 Ctrl+u 向文件首翻半屏 Ctrl+d 向文件尾翻半屏 ...

  7. [转][Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法

     转自:http://blog.csdn.net/qiujuer/article/details/39754517?utm_source=tuicool [Android][Android Studi ...

  8. angularJs禁用或启用输入框指令ng-disabled="true"

    ng-disabled 指令设置表单输入字段的 disabled 属性(input, select, 或 textarea). 如果 ng-disabled 中的表达式返回 true 则表单字段将被禁 ...

  9. 猿题库 iOS 客户端架构设计-唐巧

    序 猿题库是一个拥有数千万用户的创业公司,从20013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代. 在如此快速的开发过程中,如何保证代码 ...

  10. Android Studio 开发环境设置

    修改字体(File=>Settings 按下如所图设计字体) 显示行号.空格 用 制表符 代替 空格 显示 最终代码显示如下图 格式化代码 使用 Ctrl+Alt+L