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

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

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



548654020001051c05000445.jpg

一.什么是逆向

    所谓逆向,就是对于程序的“逆向工程”,英文叫“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();
	}
}

运行结果:


四.使用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,只不过是名字不同而已)

5486536600016f3801490053.jpg

如图所示,我的是ReverseDemo.apk

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

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

3.Start Reverse!

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

        548653790001676b02590112.jpg

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

        5486538d0001193105000166.jpg ,成功!

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

    548653d20001ecdb03600164.jpg

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

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

    548653e00001ff0c03720370.jpg

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

    

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

    548d8408000111ce05000496.jpg

    (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文件夹,问价夹结构如下所示

    548d8afd0001db5803810165.jpg

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

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

    548d8db70001273a04730067.jpg

    原因是重新编译的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

    548d8f410001ceb302660094.jpg

    用命令:signapk ReverseDermo.apk签名。

六、安装signed.apk

    

    548d8d8d0001a63404370085.jpg

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

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

    548d8d1a00011e6e04350100.jpg

    这里添加下,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    未知错误    

运行结果。

 548d891600014da705000889.jpg



    


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值