一个Android的逆向工程

无邪近学会了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可以安装到手机上,或者模拟器,结果是不管你在文本框里输入什么,都可以看到美女。。。

 

 

在这里废话一句,做人不能太过了,虽然会破解别人的软件,但是最好不要去做那些缺德事,毕竟别人也不容易,好了,下次如果有大的进展,我会再写博文的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值