最近看了看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     <Button13         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     <Button22         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     @Override12     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     @Override21     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对应“我的意见也很重要”

Android逆向工程初步(一) 15.4.24_第1张图片Android逆向工程初步(一) 15.4.24_第2张图片

然后我们开始反编译了!!!

Android逆向工程初步(一) 15.4.24_第3张图片

1.首先把我们准备好的文件放在一个文件夹,并把生成的apk也放到这个文件夹(图里忘了=-=)

2.用cmd打开当前文件夹:

 输入apktool d <app名称>.apk

Android逆向工程初步(一) 15.4.24_第4张图片

出现如图所示的样子就是成功了。

3.打开所解压文件夹的smali子文件夹,并且沿着包名进入全是反编译后代码的文件夹:

Android逆向工程初步(一) 15.4.24_第5张图片

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;)V100 101     .line 16102     const v0, 0x7f090041103 104     invoke-virtual {p0, v0}, Lcom/lfk/myapplication/MainActivity;->findViewById(I)Landroid/view/View;105 106     move-result-object v0107 108     invoke-virtual {v0, p0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V109 110     .line 17111     return-void112 .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.最后还要对其进行加入签名:

直接使用签名工具就好。

Android逆向工程初步(一) 15.4.24_第6张图片

7.最后拿着生成的带有签名的apk测试一下吧!

Android逆向工程初步(一) 15.4.24_第7张图片

点击tooyoung的时候不会有任何反应,但是toosimple会有两个弹出

这就是用了一个最简单的demo来做逆向工程,逆向博大精深,操作码和smali语言还是要多看一看。

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

更多相关文章

  1. android 5.1拍照后图片镜像处理
  2. Error : android studio 中mipmap引用.9图片出错
  3. ant编译android工程taskdef class not found
  4. android 图片切换,仿百叶窗效果
  5. eclipse中无法新建Android工程 出现问题:Plug-in org.eclipse.ajd
  6. Android的图片压缩类ThumbnailUtils
  7. android 中给图片加圆角效果
  8. android图片轮播+点击跳转广告页面
  9. Android 下拉加载更多 上拉刷新 框架 (太极 八卦样式刷新,支持自定

随机推荐

  1. Android下的USB Host介绍和开发
  2. Android内核的简单分析
  3. android 电容屏(三):驱动调试之驱动程序分析
  4. Android启动过程简析
  5. android:layout_gravity和android:gravit
  6. Android与js交互实例
  7. Android的Camera架构介绍
  8. Android获取CPU序列号
  9. 初涉Android之文件保存
  10. android 简单动画之 animtion