您的位置:首页 > 移动开发 > Android开发

一个Android的逆向工程

2013-09-10 23:42 585 查看
无邪近学会了Android逆向工程,虽然是一个简单的测试,可是经过无邪的展示,希望可以帮助更多的人,无他,我只是希望有心人能够学到更多。废话不多说,直接介绍,大牛飘过,勿喷,小弟新手。。。。

先介绍我破解的Android小程序,程序很简单,一个文本框和一个Button按钮,只要文本框的内容是123,那么将跳转到一个美女界面,否者会出现一个Toast,

我破解的是不管你在文本框里输入的是什么,都可以看到美女界面,不要说我好色,呵呵。。。

主界面:



当你在文本框里输入123 就会跳转到美女界面,图片如下:



好下面我把源代码公布一下:

总共有两个文件:

一个是MainActivity.class代码如下:

package com.example.testapk;

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

final EditText text=(EditText) findViewById(R.id.ques);

Button btn=(Button) findViewById(R.id.button1);

//验证功能

btn.setOnClickListener(new OnClickListener(){

public void onClick(View arg0) {

if(text.getText().toString().equals("123")){

Intent intent=new Intent(MainActivity.this,ShowImage.class);

startActivity(intent);

}else{

Toast.makeText(MainActivity.this, "输入错误", Toast.LENGTH_LONG).show();

}

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}

}

另一个是ShowImage.class代码如下:

package com.example.testapk;

import android.app.Activity;

import android.os.Bundle;

public class ShowImage extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.show_image);

}

}

好下面就来逆向工程吧:

第一步使用Apktool将其反编译,没有的话去百度下载



在Dos输入如下命令 ,解释一下 E:\软件\反编译工具\result是不存在的文件夹,我上面有是因为我已经做好后才写下这篇博文



下面可以看见下面的结果:



直接修改MainActivity$1.smali文件就可以达到目的:

原来的文件的内容是这样:

.class Lcom/example/testapk/MainActivity$1;

.super Ljava/lang/Object;

.source "MainActivity.java"

# interfaces

.implements Landroid/view/View$OnClickListener;

# annotations

.annotation system Ldalvik/annotation/EnclosingMethod;

value = Lcom/example/testapk/MainActivity;->onCreate(Landroid/os/Bundle;)V

.end annotation

.annotation system Ldalvik/annotation/InnerClass;

accessFlags = 0x0

name = null

.end annotation

# instance fields

.field final synthetic this$0:Lcom/example/testapk/MainActivity;

.field private final synthetic val$text:Landroid/widget/EditText;

# direct methods

.method constructor <init>(Lcom/example/testapk/MainActivity;Landroid/widget/EditText;)V

.locals 0

.parameter

.parameter

.prologue

.line 1

iput-object p1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

iput-object p2, p0, Lcom/example/testapk/MainActivity$1;->val$text:Landroid/widget/EditText;

.line 24

invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void

.end method

# virtual methods

.method public onClick(Landroid/view/View;)V

.locals 4

.parameter "arg0"

.prologue

.line 26

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->val$text:Landroid/widget/EditText;

invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

move-result-object v1

invoke-interface {v1}, Landroid/text/Editable;->toString()Ljava/lang/String;

move-result-object v1

const-string v2, "123"

invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

move-result v1

if-eqz v1, :cond_0

.line 27

new-instance v0, Landroid/content/Intent;

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

const-class v2, Lcom/example/testapk/ShowImage;

invoke-direct {v0, v1, v2}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

.line 28

.local v0, intent:Landroid/content/Intent;

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

invoke-virtual {v1, v0}, Lcom/example/testapk/MainActivity;->startActivity(Landroid/content/Intent;)V

.line 34

.end local v0 #intent:Landroid/content/Intent;

:goto_0

return-void

.line 31

:cond_0

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

const-string v2, "\u8f93\u5165\u9519\u8bef"

const/4 v3, 0x1

invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

move-result-object v1

invoke-virtual {v1}, Landroid/widget/Toast;->show()V

goto :goto_0

.end method

经过修改的文件,内容如下、:

.class Lcom/example/testapk/MainActivity$1;

.super Ljava/lang/Object;

.source "MainActivity.java"

# interfaces

.implements Landroid/view/View$OnClickListener;

# annotations

.annotation system Ldalvik/annotation/EnclosingMethod;

value = Lcom/example/testapk/MainActivity;->onCreate(Landroid/os/Bundle;)V

.end annotation

.annotation system Ldalvik/annotation/InnerClass;

accessFlags = 0x0

name = null

.end annotation

# instance fields

.field final synthetic this$0:Lcom/example/testapk/MainActivity;

.field private final synthetic val$text:Landroid/widget/EditText;

# direct methods

.method constructor <init>(Lcom/example/testapk/MainActivity;Landroid/widget/EditText;)V

.locals 0

.parameter

.parameter

.prologue

.line 1

iput-object p1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

iput-object p2, p0, Lcom/example/testapk/MainActivity$1;->val$text:Landroid/widget/EditText;

.line 24

invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void

.end method

# virtual methods

.method public onClick(Landroid/view/View;)V

.locals 4

.parameter "arg0"

.prologue

.line 26

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->val$text:Landroid/widget/EditText;

invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

move-result-object v1

invoke-interface {v1}, Landroid/text/Editable;->toString()Ljava/lang/String;

move-result-object v1

const-string v2, "123"

invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

move-result v1

# if-eqz v1, :cond_0

.line 27

new-instance v0, Landroid/content/Intent;

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

const-class v2, Lcom/example/testapk/ShowImage;

invoke-direct {v0, v1, v2}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

.line 28

.local v0, intent:Landroid/content/Intent;

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

invoke-virtual {v1, v0}, Lcom/example/testapk/MainActivity;->startActivity(Landroid/content/Intent;)V

.line 34

.end local v0 #intent:Landroid/content/Intent;

:goto_0

return-void

.line 31

:cond_0

iget-object v1, p0, Lcom/example/testapk/MainActivity$1;->this$0:Lcom/example/testapk/MainActivity;

const-string v2, "\u8f93\u5165\u9519\u8bef"

const/4 v3, 0x1

invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

move-result-object v1

invoke-virtual {v1}, Landroid/widget/Toast;->show()V

goto :goto_0

.end method

细心的人都能看见,我只添加了一个#号,就完成了整个破解,呵呵

下面是再次使用Apktool将其重新打包:



然后你就能看到result有所改变:



在dist文件夹下,可以看到重新打包后的Apk了,不过这个apk还未签名,所以还需要使用签名工具Auto-sign.rar



不演示如何使用Auto-sign.rar工具了,不懂得百度,经过签名后Apk可以安装到手机上,或者模拟器,结果是不管你在文本框里输入什么,都可以看到美女。。。



在这里废话一句,做人不能太过了,虽然会破解别人的软件,但是最好不要去做那些缺德事,毕竟别人也不容易,好了,下次如果有大的进展,我会再写博文的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: