zoukankan      html  css  js  c++  java
  • 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, "u4e5fu8981u6309u7167u57fau672cu6cd5"
     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, "u6211u7684u610fu89c1u4e5fu5f88u91cdu8981"
     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语言还是要多看一看。

    就这样,么么哒,求赞=-=

  • 相关阅读:
    PL/SQL编写的SQL语句插入SqlPlus时,报错 PLS-00302
    JTree实现电脑资源管理器
    【Machine Learning·机器学习】决策树之ID3算法(Iterative Dichotomiser 3)
    【Android】ViewModel+LiveData:更加直接地控制视图的方式
    【Android】Jetpack中的ViewModel:自动保存页面数据
    Android Studio项目/Flutter 案例中Gradle报错通用解决方案(包括Unable to tunnel through proxy问题)
    UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常
    GCD的Queue-Specific
    2_Swift基本数据类型
    1_Swift概况
  • 原文地址:https://www.cnblogs.com/lfk-dsk/p/4454392.html
Copyright © 2011-2022 走看看