一个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可以安装到手机上,或者模拟器,结果是不管你在文本框里输入什么,都可以看到美女。。。
在这里废话一句,做人不能太过了,虽然会破解别人的软件,但是最好不要去做那些缺德事,毕竟别人也不容易,好了,下次如果有大的进展,我会再写博文的。
先介绍我破解的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可以安装到手机上,或者模拟器,结果是不管你在文本框里输入什么,都可以看到美女。。。
在这里废话一句,做人不能太过了,虽然会破解别人的软件,但是最好不要去做那些缺德事,毕竟别人也不容易,好了,下次如果有大的进展,我会再写博文的。
相关文章推荐
- diy-apk:C#写的一个用于Android逆向工程的工具
- 《一个Android工程的从零开始》阶段总结与修改1-base
- 将Android源码作为一个工程导入到Eclipse
- android学习笔记(1)---eclipse中新建一个Android工程如何选择sdk
- Android导入一个工程时提示 Invalid project description的解决方法
- Cocos-X创建JS工程,编译Android .apk包,加载nanolink.so文件,创建一个实时对战游戏
- Android Studio 与 Github 的使用 (创建一个 Android 工程 with Git 命令行)
- 26款优秀的Android逆向工程工具
- 一个android工程代码多个差异化项目管理方法探讨
- Android一个工程引用另一个工程
- 创建一个Android工程
- 【Android Developers Training】 1. 创建一个Android项目工程
- Android逆向工程工具Dare的使用方法(Mac OS X中)
- Android 逆向工程工具集
- 将一个Android的工程打成Jar包。右键工程--->Export
- [一个简单的.NET逆向工程]给没有源代码的.NET程序打补丁
- Android导入一个工程时提示 Invalid project description的解决方法
- Eclipse中在android项目中出现新建一个Activity后,出现整个工程的报错以及包导入以后无法运行等等情况分析。
- 吴昊品工程级别项目 Round 3(追加) —— 一个基于android的手机防盗软件的实现
- 26款优秀的Android逆向工程工具