最近看了看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:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Too Young!"
android:id="@+id/button"
android:layout_below="@+id/textView"
android:layout_marginTop="81dp"
android:layout_alignParentEnd="true" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Too Simple!"
android:id="@+id/button2"
android:layout_alignParentBottom="true"
android:layout_marginBottom="162dp" /> </RelativeLayout>
 package com.lfk.myapplication;

 import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast; public class MainActivity extends ActionBarActivity implements View.OnClickListener{ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
} @Override
public void onClick(View v) {
if(v.getId()==R.id.button){
Toast.makeText(getApplicationContext(), "也要按照基本法", Toast.LENGTH_SHORT).show();
}
if(v.getId()==R.id.button2){
Toast.makeText(getApplicationContext(), "我的意见也很重要", Toast.LENGTH_SHORT).show();
}
} }

再在Activity里绑定点击事件,这里没用switch,用了if是为了一会修改方便。

每一个按钮里面有一个弹出消息:tooyoung对应“基本法”,toosimple对应“我的意见也很重要”

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

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

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

 输入apktool d <app名称>.apk

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

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

4.打开主活动的文件:

 .class public Lcom/lfk/myapplication/MainActivity;
.super Landroid/support/v7/app/ActionBarActivity;
.source "MainActivity.java" # interfaces
.implements Landroid/view/View$OnClickListener; # direct methods
.method public constructor <init>()V
.locals 0 .prologue
.line 9
invoke-direct {p0}, Landroid/support/v7/app/ActionBarActivity;-><init>()V return-void
.end method # virtual methods
.method public onClick(Landroid/view/View;)V
.locals 3
.param p1, "v" # Landroid/view/View; .prologue
const/4 v2, 0x0 .line 22
invoke-virtual {p1}, Landroid/view/View;->getId()I move-result v0 const v1, 0x7f090040 if-ne v0, v1, :cond_0 .line 23
invoke-virtual {p0}, Lcom/lfk/myapplication/MainActivity;->getApplicationContext()Landroid/content/Context; move-result-object v0 const-string v1, "\u4e5f\u8981\u6309\u7167\u57fa\u672c\u6cd5" invoke-static {v0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v0 invoke-virtual {v0}, Landroid/widget/Toast;->show()V .line 25
:cond_0
invoke-virtual {p1}, Landroid/view/View;->getId()I move-result v0 const v1, 0x7f090041 if-ne v0, v1, :cond_1 .line 26
invoke-virtual {p0}, Lcom/lfk/myapplication/MainActivity;->getApplicationContext()Landroid/content/Context; move-result-object v0 const-string v1, "\u6211\u7684\u610f\u89c1\u4e5f\u5f88\u91cd\u8981" invoke-static {v0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v0 invoke-virtual {v0}, Landroid/widget/Toast;->show()V .line 28
:cond_1
return-void
.end method .method protected onCreate(Landroid/os/Bundle;)V
.locals 1
.param p1, "savedInstanceState" # Landroid/os/Bundle; .prologue
.line 13
invoke-super {p0, p1}, Landroid/support/v7/app/ActionBarActivity;->onCreate(Landroid/os/Bundle;)V .line 14
const v0, 0x7f040017 invoke-virtual {p0, v0}, Lcom/lfk/myapplication/MainActivity;->setContentView(I)V .line 15
const v0, 0x7f090040 invoke-virtual {p0, v0}, Lcom/lfk/myapplication/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 invoke-virtual {v0, p0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V .line 16
const v0, 0x7f090041 invoke-virtual {p0, v0}, Lcom/lfk/myapplication/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 invoke-virtual {v0, p0}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V .line 17
return-void
.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语言还是要多看一看。

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

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

  1. 26款优秀的Android逆向工程工具

    26款优秀的Android逆向工程工具

  2. Unparseable date: "Mon Aug 15 11:24:39 CST 2016",时间格式转换异常

    String datestr= "Mon Aug 15 11:24:39 CST 2016";//Date的默认格式显示 Date date=new SimpleDateForma ...

  3. Android 逆向工程之步骤

    PS:本系列文章中所涉及到的技术.数据和接口地址,仅供学习交流,务必不可做坏事或者是用于商业用途!否则后果自负! 来源:http://blog.csdn.net/zhaokaiqiang1992 逆向 ...

  4. Android系统改动时间格式为24小时制

    1. frameworks/base/packages/SettingsProvider/res/values/defaults.xml 添加<stringname="time_12_ ...

  5. [旧][Android] Retrofit 初步使用

    备注 原发表于2016.04.13,资料已过时,仅作备份,谨慎参考 Retrofit 是什么? Retrofit is a type-safe HTTP client for Android and ...

  6. Android菜鸟成长记15 -- BitMap

    BitMap简介 Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bi ...

  7. Android Studio初步使用教程

    今年的Google全球开发者大会虽然没有新的Android系统和设备,但是还是推出了一些不错的产品,Android Studio就是其中之一.这个基于Intellij IDEA开发的Android I ...

  8. 【Android Developers Training】 15. 启动一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Android逆向工程

    在Root前提下,我们可以使用Hooker方式绑定so库,通过逆向方式篡改数值,从而达到所谓破解目的.然而,目前无论是软件加固方式,或是数据处理能力后台化,还是客户端数据真实性验证,都有了一定积累和发 ...

随机推荐

  1. MVC5+EF6 入门完整教程12--灵活控制Action权限

    大家久等了. 本篇专题主要讲述MVC中的权限方案. 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一. 前面的系列文章中我们用到了 SysUser, SysRole, SysUserR ...

  2. Servlet获得Http请求,GET/POST

    Servlet获得Http请求 Http请求信息格式 请求行(方法提交方式,URI,Http协议版本) GET方式提交:URI会包含查询字符串 POST方式提交:URI不会包含查询字符串 请求头 Ho ...

  3. Spring框架之AOP

    SpringAop: 1.加入 jar 包 com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver ...

  4. 股票价格涨跌预测—基于KNN分类器

    code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...

  5. 将 C# 编译为原生机器码

      C# 用户似乎都希望 C# 可以和 C++ 一样编译为本地的机器码.如果 C# 可以编译为机器码,将可以做到: 1. 效率提高,可以取代 C++ . 2. 反编译.   当然微软在商业利益的考虑下 ...

  6. FEE Development Essentials

    FEE Development Essentials JS Basic function call() and apply() func1.bind(thisObj,arg1...argn) Cust ...

  7. SharePoint 2013 创建web应用程序报错"This page can’t be displayed"

    错误描述 This page can’t be displayed •Make sure the web address http://centeradmin is correct. •Look fo ...

  8. Engine中执行gp工具返回的要素图层如何获取?

    来自:http://zhihu.esrichina.com.cn/?/question/12087 Engine中执行gp工具返回的[解决办法]:需要用gpUtils.DecodeFeatureLay ...

  9. 独立博客开张!有关读书、GTD和IT方面的内容将发布在新网站上

    2015年自己建个独立博客http://www.shenlongbin.com,以后与读书.GTD和IT技术有关的主题都放在个人博客中,2015年计划基本制定,请移步到这里. 感谢博客园提供了如此优秀 ...

  10. android XMl 解析神奇xstream 三: 把复杂对象转换成 xml

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...