码迷,mamicode.com
首页 > 移动开发 > 详细

Android逆向分析学习与研究(1)————工欲善其事必先利其器

时间:2014-12-16 13:38:18      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:android   android逆向   

注:头连天参加一个慕课网的活动发表的文章,从那里搬到这里来

工具可到看雪移动下载:点击打开链接下载,里面有工具列表,很详细。



bubuko.com,布布扣

一.什么是逆向

    所谓逆向,就是对于程序的“逆向工程”,英文叫“reverse”,是计算机安全领域中一项重要的技术。常见使用情景:1.手里有一个软件(可以是Win平台的,可以是Android的,也可以是ios的),软件本身功能实现的很好,但是由于商业和版权的原因,大部分软件是不开源的,这时你有很想对其源码层面一探究竟或者你的项目中急需这种功能,剩下的只有“逆向”了,通过逆向可以得到软件程序的大体流程和主要代码;2.发现病毒、木马或者有漏洞的软件(或者你想挖漏洞),那这时逆向是了解目的软件程序最佳的办法。

二.关于Android应用的逆向

    本文即以后文章主要围绕Android平台讨论,Windows平台和IOS不做讨论。

三.从apk文件说起

    平时大家在手机里安装app时,其实安装的是apk文件,apk通常被认为是“Android的可执行文件”,想windows的exe文件,其实你理解它为可执行文件不是不可以,它里面确实包含可执行文件,但是这却不是一个完全正确的说法。apk是英文“Android Package”的缩写,即安卓包文件。apk文件可以解压,这里不再演示。故而它不是真正的可执行文件,真正的可执行文件是“.dex”文件。dex文件是英文“Dalvik execute”的缩写,即Dalvik可执行文件。但不要真的以为它是2进制文件,它其实是Dalvik的字节码文件,将来要提交到Dalvik虚拟机进行解释执行的。这里又提到Dalvik虚拟机,它是Android平台里的java虚拟机,与PC上的jvm虚拟机功能类似,但Dalvik绝不是JVM!前者是谷歌自己研发的,后者是Oracle的,尽管到现在两家公司还在打官司。逆向的初步就是对apk文件的逆向,通过一些工具得到一些目标文件,再对其分析。

四.写个简单的Android应用。

MainActivity.java

package com.example.reversedemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	private Button btn;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn =(Button) findViewById(R.id.button_1);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO 自动生成的方法存根
				MessageBox("Hello World!");
			}
		});
	}
	public void MessageBox(String text){
		Toast.makeText(this, text, Toast.LENGTH_LONG).show();
	}
}

运行结果:

bubuko.com,布布扣

四.使用apktool。

    APKTool是GOOGLE提供的APK编译工具,能够反编译及回编译apk,同时安装反编译系统apk所需要的framework-res框架,清理上次反编译文件夹等功能。需要java支持 。

    使用前,配置好环境变量:例子:我的:将D:\adsec\apktool-install-windows-r05-ibot\apktool-install-windows-r05-ibot;添加到PATH下。

基本命令:

decode:

该命令用于进行反编译apk文件,一般用法为

apktool d <file.apk> <dir>

<file.apk>代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\HelloWorld.apk

<dir>代表了反编译后的文件的存储位置,比如C:\HelloWorld

如果你给定的<dir>已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令

apktool d –f <file.apk> <dir>

这样就会强行覆盖已经存在的文件。


build

该命令用于编译修改好的文件,一般用法为

apktool b <dir>

这里的<dir>就是刚才你反编译时输入的<dir>(如C:\HelloWorld),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。


install

install-framework命令用于为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件。


开始使用apktool:

1.找到你的.apk(注意:第一次发的是FirstReverse.apk,由于上传图片确实费劲,下文图片中的FirstReverse.apk

全部改成ReverseDemo.apk,只不过是名字不同而已)

bubuko.com,布布扣

如图所示,我的是ReverseDemo.apk

2.将apk拷贝到你特定的工作目录(这步随意)。

比如我的是D:\adsec\APK。

3.Start Reverse!

    (1)使用cmd窗口cd到目标工作目录。例如我的:

        bubuko.com,布布扣

    (2)使用“apktool d apk文件名.apk  目的目录  ”开始反编译。

        bubuko.com,布布扣 ,成功!

    (3)打开目的工作目录FirstReverse

    bubuko.com,布布扣

    得到如上所示的文件夹结构。

    (4)打开smali文件夹,在打开com文件夹,再依次\example\firstreverse,找到众多smali文件

    bubuko.com,布布扣

    (5)用记事本打开smali文件(你可能会问,用记事本好低端啊,有没有带代码提示的编辑器啊,答:有的,现在不着急,以后慢慢说)。

    

    smali文件就是反编译的结果,我们可以从smali代码中看出软件的端倪。

    bubuko.com,布布扣

    (6)修改smali代码

    MainActivity$1.smali

.class Lcom/example/reversedemo/MainActivity$1;
.super Ljava/lang/Object;
.source "MainActivity.java"

# interfaces
.implements Landroid/view/View$OnClickListener;


# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
    value = Lcom/example/reversedemo/MainActivity;->onCreate(Landroid/os/Bundle;)V
.end annotation

.annotation system Ldalvik/annotation/InnerClass;
    accessFlags = 0x0
    name = null
.end annotation


# instance fields
.field final synthetic this$0:Lcom/example/reversedemo/MainActivity;


# direct methods
.method constructor <init>(Lcom/example/reversedemo/MainActivity;)V
    .locals 0
    .parameter

    .prologue
    .line 1
    iput-object p1, p0, Lcom/example/reversedemo/MainActivity$1;->this$0:Lcom/example/reversedemo/MainActivity;

    .line 19
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method


# virtual methods
.method public onClick(Landroid/view/View;)V
    .locals 2
    .parameter "arg0"

    .prologue
    .line 24
    iget-object v0, p0, Lcom/example/reversedemo/MainActivity$1;->this$0:Lcom/example/reversedemo/MainActivity;
####################################################################################################################
#######################将要修改下面这段代码#########################################################################
####################################################################################################################
    const-string v1, "Hello World!"############修改为const-string v1,"Hello World! Changed!"

    invoke-virtual {v0, v1}, Lcom/example/reversedemo/MainActivity;->MessageBox(Ljava/lang/String;)V

    .line 25
    return-void
.end method

(7)重新打包为apk文件

    命令:apktool b ReverseDemo

    注意:上面是ReverseDemo文件夹,就是你逆向后得到的文件夹

    不出意外会在ReverseDemo里生成dist文件夹,问价夹结构如下所示

    bubuko.com,布布扣

    打开dist问价夹,里面会有ReverseDemo.apk 文件

    别着急安装,这时安装会出错的,比如:

    bubuko.com,布布扣

    原因是重新编译的apk文件无签名所致。至此apktool使用到此结束

五、使用signapk

    signapk是一款apk文件签名工具,只有签名的apk才能安装使用!

    写个批处理:signapk.bat如下

    java -jar "%~dp0signapk.jar" "%~dp0testkey.x509.pem" "%~dp0testkey.pk8" %1 signed.apk

    将signapk.jar等如下四个问价所在的一个文件夹,将signapk.bat添加到PATH环境变量。

    将signapk.bat

    bubuko.com,布布扣

    用命令:signapk ReverseDermo.apk签名。

六、安装signed.apk

    

    bubuko.com,布布扣

    这里应该注意,如果你手机里已经有ReverseDemo.apk 安装后的应用(有的话是刚才逆向之前的)

    一定要卸载后在执行install,不然如下所示:

    bubuko.com,布布扣

    这里添加下,adb 命令的错误提示

    INSTALL_FAILED_ALREADY_EXISTS    程序已经存在    

    INSTALL_FAILED_INVALID_APK    无效的APK    

    INSTALL_FAILED_INVALID_URI    无效的链接    

    INSTALL_FAILED_INSUFFICIENT_STORAGE    没有足够的存储空间    

    INSTALL_FAILED_DUPLICATE_PACKAGE    已存在同名程序    

    INSTALL_FAILED_NO_SHARED_USER    要求的共享用户不存在    

    INSTALL_FAILED_UPDATE_INCOMPATIBLE    版本不能共存    

    INSTALL_FAILED_SHARED_USER_INCOMPATIBLE    需求的共享用户签名错误    

    INSTALL_FAILED_MISSING_SHARED_LIBRARY    需求的共享库已丢失    

    INSTALL_FAILED_REPLACE_COULDNT_DELETE    需求的共享库无效    

    INSTALL_FAILED_DEXOPT    dex优化验证失败    

    INSTALL_FAILED_OLDER_SDK    系统版本过旧    

    INSTALL_FAILED_CONFLICTING_PROVIDER    存在同名的内容提供者    

    INSTALL_FAILED_NEWER_SDK    系统版本过新    

    INSTALL_FAILED_TEST_ONLY    调用者不被允许测试的测试程序    

    INSTALL_FAILED_CPU_ABI_INCOMPATIBLE    包含的本机代码不兼容    

    CPU_ABIINSTALL_FAILED_MISSING_FEATURE    使用了一个无效的特性    

    INSTALL_FAILED_CONTAINER_ERROR    SD卡访问失败    

    INSTALL_FAILED_INVALID_INSTALL_LOCATION    无效的安装路径    

    INSTALL_FAILED_MEDIA_UNAVAILABLE    SD卡不存在    

    INSTALL_FAILED_INTERNAL_ERROR    系统问题导致安装失败    

    DEFAULT    未知错误    

运行结果。

 bubuko.com,布布扣



    


Android逆向分析学习与研究(1)————工欲善其事必先利其器

标签:android   android逆向   

原文地址:http://blog.csdn.net/c_major/article/details/41957779

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!