免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 软件破解 > Android 应用程序基础破解入门(2)

Android 应用程序基础破解入门(2)

时间:2012-04-01 22:46来源:未知 整理:寂涯网络 点击:


Dalvik 虚拟机是专门为 Android 平台上的程序运行而设计的一种代码运行机制,它主要的作用是对 JAVA 程序的 ByteCode 进行优化,以提高代码执行效率。可以说,从 Android2.2 版本开始,Android 系统手机真正的拉开了市场,这背后很大一部分功劳要取决于强大的 Dalvik JIT 编译器,正是由于它大幅提升 Android 2.2 的各种性能。与传统的 Java 虚拟机 (JVM)基于栈有所不同,Dalvik 是基于寄存器的虚拟机,这使得它们在编译的时候只需花费 更短的时间。Dalvik JIT 解释的 JAVA ByteCode 源于 JVM 而又优于 JVM,在 JAVA 虚拟机中, 代码是基于 Method 方式来运行解释编译的,而在 Android2.2 版本及以后的 Dalvik JIT 则 是基于 Trace 解释编译的,Dalvik 最多支持 256 个寄存器,但嵌入式 CPU 自身并不带那么 多的寄存器,Dalvik 除了使用 ARM 本身的几个寄存器外,其它需要用到的寄存器会借用外部存储器来模拟,那 Android 程序运行时会用到多少个寄存器呢?答案是不确定的,它会在 生成代码时进行计算。在这里,我们不去详细的探究 Dalvik 的运行机制,但掌握 Dalvik 指令的语法为以后的逆向工程做基础却是十分有必要的。一份详细的 Dalvik opcodes 表可 以 从    Android   源 码 中 获 得 , 在      Android4.0 的 源 码 中 , 可 以 从
dalvik/opcode-gen/bytecode.txt       查 看 到 完 整 支 持 的   OpCodes , 在 dalvik/docs/dalvik-bytecode.html 中可以找到 Dalvik OpCodes 的详细说明。早期的 OpCodes 使用一个字节就可以保存,意味着最多可以有 256 条指令,在最新的一份 OpCodes 列表中,OpCodes 扩展了一字节,并扩充了一些指令。下面我们来看看 Dalvik 指令的格式, 毕竟我们要看的不是这些 OpCodes,而是由它们在一起组成的代码。新建一个 Android 工程 命名为 HelloAndroid,HelloAndroidActivity.java 文件使用默认生成的代码:
package cn.feicong.HelloAndroid; import android.app.Activity; import android.os.Bundle;
public class HelloAndroidActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
编译生成 APK 文件,接下来看看反编译后的结果。
首先是 DeDexer,进入命令行并定位到 HelloAndroid/bin 目录下,在命令行下运行 java
-jar ddx.jar -d outdir classes.dex (可从http://sourceforge.net/projects/dedexer/
下载DeDexer)会在outdir目录中生成六个ddx文件,如图 1 所示:
图1
打开 HelloAndroidActivity.ddx 文件代码如下:
.class public cn/feicong/HelloAndroid/HelloAndroidActivity
.super android/app/Activity
.source HelloAndroidActivity.java
.method public <init>()V
.limit registers 1
; this: v0 (Lcn/feicong/HelloAndroid/HelloAndroidActivity;)
.line 6
invoke-direct     {v0},android/app/Activity/<init>         ; <init>()V
return-void
.end method
.method public onCreate(Landroid/os/Bundle;)V
.limit registers 3
; this: v1 (Lcn/feicong/HelloAndroid/HelloAndroidActivity;)
; parameter[0] : v2 (Landroid/os/Bundle;)
.line 10
invoke-super     {v1,v2},android/app/Activity/onCreate       ;
onCreate(Landroid/os/Bundle;)V
.line 11
const/high16      v0,32515 invoke-virtual
{v1,v0},cn/feicong/HelloAndroid/HelloAndroidActivity/setContentView ;
setContentView(I)V
.line 12
return-void
.end method
.class 是程序的类名,.super 为它的父类,.source 为源文件。.method 表示是一个类 的方法,后面的大写'V'表示 Void,即无返回值,<init 表示是构造函数,.limit registers
1 表示用到了一个寄存器,分号后面是注释,.line 表示行号,可有可无,invoke-direct
与 return-void 是 Dalvik 的 OpCode,前者调用一个类的方法,后者直接返回。
看看 BakSmali 的反编译代码,运行 apktool.jar d HelloAndroid.apk outdir2 在
outdir2 目录会生成一个 smali 目录,同样在相应的目录会生成六个 Smali 结尾的文件,如
图 2 所示:

图2

本页地址 http://www.jybase.net/ruanjianpojie/20120329811.html

百度搜索更多

谷歌搜索更多

顶一下
(6)
85.7%
踩一下
(1)
14.3%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com