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语言还是要多看一看。

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

时间: 2024-08-11 07:48:25

Android逆向工程初步(一) 15.4.24的相关文章

Android企业级应用程序开发完整训练:精通Android商业级开发最佳实践的24堂课

从企业级商业实战的角度入手,24小时内通过23个动手实战案例,循序渐进的对Android商业级别的应用程序开发要点各个击破,依托于在多年的Android(6款完整的硬件产品和超过20款应用软件)开发和企业级培训经验(超过150期的次Android的企业内训和公开课),旨在在实务的基础之上帮助你完成任何复杂程序的高质量Android应用程序开发,让Android开发跟上想象的速度.最后,通过ActivityManagerService揭秘Android应用程序一切行为背后的核心根源,让你从此开发应

Android 逆向工程 实践篇

Android逆向工程 实践篇 上篇给大家介绍的是基础+小Demo实践. 如果没有看过的同学可以进去看看.(逆向工程 初篇) 本篇主要给大家介绍如何反编译后修改源码, 并打包运行在手机上. 先介绍下本篇文章用到的工具和资源. 1: Android Killer 1.3.1.0 (工具) 2: crackme.apk 还没有破解之前会提示随意输入用户名密码会提示下面的信息. 下面我们来打开apk, 看看源码是怎么回事. 我先用工具(Android Killer) 打开creckme.apk 这个是

Android开发之获取系统12/24小时制的时间

//通过DateFormat获取系统的时间 String currentTime=DateFormat.format("yyyy-MM-dd hh-mm-ss", new Date()).toString(); currentTime="通过DateFormat获取的时间:\n"+currentTime; //通过SimpleDateFormat获取24小时制时间 SimpleDateFormat sdf=new SimpleDateFormat("yyy

Android逆向工程工具 - 3

<Android逆向工程工具 - 1 https://www.cnblogs.com/cuihengchaliao/p/6661871.html>提到经过修改重新打包的apk文件,需要再重新签名才能安装. 再重新签名时,如果是正规途径的修改,原来版本的签名证书可以使用:但如果是不正规途径的apk包修改,重新签名时原来开发者的证书是不可用的,这时修改者一般会用工具自己生成公钥.私钥对和证书,对修改的apk包进行重新签名,但是因为证书和原版的证书不一样,安装时是无法覆盖原版的,同时原版开发者也会自

Android逆向工程-破解 哈皮妹-萝莉

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/18797493 前言 新的一年新的开始,除了继续我的原有课题之外,我还打算研究下Android逆向工程的一些东西,主要包括反编译.Smali.APK打包.签名.反逆向和移动安全等.这篇就是新课题的第一篇文章,不过要牺牲下哈皮妹-萝莉这款应用了.通过对哈皮妹-萝莉的破解,让我更加深刻直观地认识到,Android的安全性是一个多么大的问题,如果我们的应用没有采用特殊手段去阻止破解

Android逆向工程工具Dare的使用方法(Mac OS X中)

其实这篇日志很简单,争取用两句话说完.Dare这个工具是宾州大学计算机系发布的apk逆向工程工具.可以将Android系统中使用的apk文件反编译为Java Class文件.目前支持Linux和Mac OS X中使用,在Mac中的使用方法尤其简单,在这个页面:http://siis.cse.psu.edu/dare/downloads.html 提供可执行文件的下载,下载解压之后在终端中进入其目录,输入: bash dare -d apkoutput WeChat_462.apk 上面是以最新的

Unparseable date: &quot;Mon Aug 15 11:24:39 CST 2016&quot;,时间格式转换异常

String datestr= "Mon Aug 15 11:24:39 CST 2016";//Date的默认格式显示 Date date=new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.UK)).parse(datestr); //格式化SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); String sDate=

Android学习心得(15) --- Dex文件结构解析(1)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下Android可执行文件dex的结构解析. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 1.Dex背景 Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,在编译时使用JDK将Java源程序编程成标准的Java字节码文件. 而

Android菜鸟成长记15 -- BitMap

BitMap简介 Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能. BitMap的常用属性 1. BitMap类 public void recycle()--回收位图占用的内存空间,把位图标记为Dead  public final boolean isRecycled() --判断位图内存是否已释放  public final int g