Android逆向工程初步(一) 15.4.24
最近看了看Android的逆向工程,破解的书,像是《Android Hack‘s Book》之类的,感觉挺有意思的,看了看一些smali的语法,试着自己写了个demo玩玩:
1.工具:
最新版的apktool2.0:http://connortumbleson.com/2015/04/20/apktool-v2-0-0-released/
安装方法在:http://ibotpeaches.github.io/Apktool/install/
apk签名工具(懒得手动了):http://www.pc6.com/softview/SoftView_60348.html
2.开始!
首先字节写一个简单的demo用于测试新建一个空白工程就行:
然后放两个Button:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 3 android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 4 android:paddingRight="@dimen/activity_horizontal_margin" 5 android:paddingTop="@dimen/activity_vertical_margin" 6 android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 7 8 <TextView android:text="@string/hello_world" android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:id="@+id/textView" /> 11 12 <Button 13 android:layout_width="match_parent" 14 android:layout_height="wrap_content" 15 android:text="Too Young!" 16 android:id="@+id/button" 17 android:layout_below="@+id/textView" 18 android:layout_marginTop="81dp" 19 android:layout_alignParentEnd="true" /> 20 21 <Button 22 android:layout_width="match_parent" 23 android:layout_height="wrap_content" 24 android:text="Too Simple!" 25 android:id="@+id/button2" 26 android:layout_alignParentBottom="true" 27 android:layout_marginBottom="162dp" /> 28 29 </RelativeLayout>
1 package com.lfk.myapplication; 2 3 import android.os.Bundle; 4 import android.support.v7.app.ActionBarActivity; 5 import android.view.View; 6 import android.widget.Toast; 7 8 9 public class MainActivity extends ActionBarActivity implements View.OnClickListener{ 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 findViewById(R.id.button).setOnClickListener(this); 16 findViewById(R.id.button2).setOnClickListener(this); 17 } 18 19 20 @Override 21 public void onClick(View v) { 22 if(v.getId()==R.id.button){ 23 Toast.makeText(getApplicationContext(), "也要按照基本法", Toast.LENGTH_SHORT).show(); 24 } 25 if(v.getId()==R.id.button2){ 26 Toast.makeText(getApplicationContext(), "我的意见也很重要", Toast.LENGTH_SHORT).show(); 27 } 28 } 29 30 }
再在Activity里绑定点击事件,这里没用switch,用了if是为了一会修改方便。
每一个按钮里面有一个弹出消息:tooyoung对应“基本法”,toosimple对应“我的意见也很重要”
然后我们开始反编译了!!!
1.首先把我们准备好的文件放在一个文件夹,并把生成的apk也放到这个文件夹(图里忘了=-=)
2.用cmd打开当前文件夹:
输入apktool d <app名称>.apk
出现如图所示的样子就是成功了。
3.打开所解压文件夹的smali子文件夹,并且沿着包名进入全是反编译后代码的文件夹:
4.打开主活动的文件:
1 .class public Lcom/lfk/myapplication/MainActivity; 2 .super Landroid/support/v7/app/ActionBarActivity; 3 .source "MainActivity.java" 4 5 # interfaces 6 .implements Landroid/view/View$OnClickListener; 7 8 9 # direct methods 10 .method public constructor <init>()V 11 .locals 0 12 13 .prologue 14 .line 9 15 invoke-direct {p0}, Landroid/support/v7/app/ActionBarActivity;-><init>()V 16 17 return-void 18 .end method 19 20 21 # virtual methods 22 .method public onClick(Landroid/view/View;)V 23 .locals 3 24 .param p1, "v" # Landroid/view/View; 25 26 .prologue 27 const/4 v2, 0x0 28 29 .line 22 30 invoke-virtual {p1}, Landroid/view/View;->getId()I 31 32 move-result v0 33 34 const v1, 0x7f090040 35 36 if-ne v0, v1, :cond_0 37 38 .line 23 39 invoke-virtual {p0}, Lcom/lfk/myapplication/MainActivity;->getApplicationContext()Landroid/content/Context; 40 41 move-result-object v0 42 43 const-string v1, "\u4e5f\u8981\u6309\u7167\u57fa\u672c\u6cd5" 44 45 invoke-static {v0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; 46 47 move-result-object v0 48 49 invoke-virtual {v0}, Landroid/widget/Toast;->show()V 50 51 .line 25 52 :cond_0 53 invoke-virtual {p1}, Landroid/view/View;->getId()I 54 55 move-result v0 56 57 const v1, 0x7f090041 58 59 if-ne v0, v1, :cond_1 60 61 .line 26 62 invoke-virtual {p0}, Lcom/lfk/myapplication/MainActivity;->getApplicationContext()Landroid/content/Context; 63 64 move-result-object v0 65 66 const-string v1, "\u6211\u7684\u610f\u89c1\u4e5f\u5f88\u91cd\u8981" 67 68 invoke-static {v0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; 69 70 move-result-object v0 71 72 invoke-virtual {v0}, Landroid/widget/Toast;->show()V 73 74 .line 28 75 :cond_1 76 return-void 77 .end method 78 79 .method protected onCreate(Landroid/os/Bundle;)V 80 .locals 1 81 .param p1, "savedInstanceState" # Landroid/os/Bundle; 82 83 .prologue 84 .line 13 85 invoke-super {p0, p1}, Landroid/support/v7/app/ActionBarActivity;->onCreate(Landroid/os/Bundle;)V 86 87 .line 14 88 const v0, 0x7f040017 89 90 invoke-virtual {p0, v0}, Lcom/lfk/myapplication/MainActivity;->setContentView(I)V 91 92 .line 15 93 const v0, 0x7f090040 94 95 invoke-virtual {p0, v0}, Lcom/lfk/myapplication/MainActivity;->findViewById(I)Landroid/view/View; 96 97 move-result-object v0 98 99 invoke-virtual {v0, p0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V 100 101 .line 16 102 const v0, 0x7f090041 103 104 invoke-virtual {p0, v0}, Lcom/lfk/myapplication/MainActivity;->findViewById(I)Landroid/view/View; 105 106 move-result-object v0 107 108 invoke-virtual {v0, p0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V 109 110 .line 17 111 return-void 112 .end method
能看到如上的代码:其中22-77行是ONclick方法的汇编指令:
对36:if-ne v0, v1, :cond_0这行进行修改
将if-ne改为if-eq(前者为正确则执行cond_0,后者为不正确才执行cond_0的内容)
这样点击tooyoung不会有反应,而toosimple会有两个弹出,保存退出。
5.最后在cmd里输入:
apktool b <解压文件名>
这时候你解压文件夹下的dist里面就有了新的apk文件了
6.最后还要对其进行加入签名:
直接使用签名工具就好。
7.最后拿着生成的带有签名的apk测试一下吧!
点击tooyoung的时候不会有任何反应,但是toosimple会有两个弹出
这就是用了一个最简单的demo来做逆向工程,逆向博大精深,操作码和smali语言还是要多看一看。
就这样,么么哒,求赞=-=
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。