最近看了看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. asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法

    MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交

  2. 重新想象 Windows 8 Store Apps (39) - 契约: Share Contract

    [源码下载] 重新想象 Windows 8 Store Apps (39) - 契约: Share Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之  ...

  3. csharp: Data binding in WPF DataGrid control

    <Window x:Class="WpfProjectDemo.MainWindow" xmlns="http://schemas.microsoft.com/wi ...

  4. 【Android】Android SDK Manager更新慢/失败的问题

    前言:更新下载Intel x86 Atom_64 System Image的时候总是失败,速度只有几KB,我这是10M的网啊. 最后找到一篇日志,解决了这个问题.非常感谢!其参考地址:http://w ...

  5. css 负边距 小记

    水平格式化 当我们在元素上设置width的时候,影响的是内容区的宽度  但是当我们又为元素指定指定了内边距 边框 外边距 还是会增加宽度值  (IE传统盒模型 内边距 边框 会在元素的宽度内扩展 ma ...

  6. windows上JSP开发环境全搭建

    JSP开发环境全搭建 最近需要用到JSP做项目,所以要配置JSP的开发环境,总结一下配置步骤以备以后再配置需要. 配置JAVA开发环境,配置JDK 下载JDK,在这里下载开发所需的JDK,可以根据自己 ...

  7. SharePoint 2013 开启访问请求

    1.通常,我们进入SharePoint 2013站点,如果没权限会提示该站点未被共享,而没有切换账号或者申请访问,实在是很流氓:其实,SharePoint为我们提供了访问请求页面,但是可能需要手动开启 ...

  8. 使用RDCMan管理SharePoint虚拟机的重复要求验证的问题

    首先,这个软件可以从这里下载: Remote Desktop Connection Manager 同类型的软件还有很多,我没有很多复杂功能的要求,就选择了这款微软官方的,虽然很久都没有更新过了. 为 ...

  9. 第一个WCF的程序

    第一个WCF的程序,按照书上的基本已经完成,就是创建配置文件那里卡住了,因为书上写的不太全,明天再进行深入调试,输入http://127.0.0.1:3721/calculatorservice/me ...

  10. UI交互设计的网站

    1.http://www.xueui.cn/other-tutorials/ui-interaction-design.html 2.http://www.3lian.com/edu/2015/12- ...