APK反编译

最近看着APK不爽,于是乎,反编译之,看看反编译出来的是什么!呵呵,因为自己对Android这块是刚接触,因此不是很熟悉。

开发环境:windows xp 32位

反编译工具:APKTool http://code.google.com/p/android-apktool/downloads/list

查看工具:Eclipse(可以用记事本之类的东西打开的,因为有Eclipse因此就直接用了)

 

首先,新建一个HelloWorld工程,编译并在模拟器上运行。然后到工程目录找到\workspace\bin\HelloWord.apk,复制出来,放到APKTool的目录下。这里解释一下,APKtool下载后 解压到一个文件夹里。apktool1.4.1.tar.bz2 apktool-install-windows-r04-brut1.tar.bz2 这两个包解压到一个文件夹里。

然后在打开运行 输入cmd 回车 ,然后进入APKTool所在的目录 输入反编译命令 apktool d HelloWorld.apk,命令执行完成后会在APKTool目下生成一个HelloWorld的目录。如下图

打开文件夹,找到smali文件下的HelloWorld.smali,用Eclipse打开。

package com.seven.helloworld;

import android.app.Activity;
import android.os.Bundle;

public class HelloWorld extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public Float fun(int i,Float j,String s) {
    	int x = 16;
    	int y = x;
    	System.out.println(x);
    	System.out.println(y);
    	System.out.println(j);
		return j;
	}
}

以上是我修改过后的HelloWorld文件,其中的内容不外乎就是增加了一个没有调用的fun方法。为什么我要这么做呢,下文会做解释的。

以下是反编译之后Eclipse打开的文件:

.class public Lcom/seven/helloworld/HelloWorld;
.super Landroid/app/Activity;
.source "HelloWorld.java"


# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
.end method


# virtual methods
.method public fun(ILjava/lang/Float;Ljava/lang/String;)Ljava/lang/Float;
    .locals 3
    .parameter "i"
    .parameter "j"
    .parameter "s"

    .prologue
    const/16 v0, 0x10

    .local v0, x:I
    move v1, v0

    .local v1, y:I
    sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;

    invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(I)V

    sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;

    invoke-virtual {v2, v1}, Ljava/io/PrintStream;->println(I)V

    sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;

    invoke-virtual {v2, p2}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V

    return-object p2
.end method

.method public onCreate(Landroid/os/Bundle;)V
    .locals 1
    .parameter "savedInstanceState"

    .prologue
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    const/high16 v0, 0x7f03

    invoke-virtual {p0, v0}, Lcom/seven/helloworld/HelloWorld;->setContentView(I)V

    return-void
.end method


哈哈,学习过汇编的人,是不是觉得这个代码看着熟悉啊。但是呢,这个跟汇编可是不同的哦,虽然有点像,并这个代码依然是面向对象的哦。

通过对比可以知道:

# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
.end method

这段主要表示继承Activity,.locals 0表示有几个局部变量。.prologue 以下的东西表示运算开始,这包括了执行运算符以及赋值运算等。

未完待续…………后面补上

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值