当前位置: 代码迷 >> Android >> Android逆向分析学习与研究(一)————工欲善其事必先利其器
  详细解决方案

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

热度:84   发布时间:2016-04-28 03:21:25.0
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



    


2楼qq_21394609昨天 14:18
哎哟,不错哦~
Re: C_Major昨天 15:35
回复qq_21394609n友哥也很不错^_^
1楼yjjy0921昨天 13:46
这种逆向工程现在基本行不通了,市面上的apk加密工具分分钟让反编译毫无用武之地。不过我也比较好奇,这些加密工具到底是怎么做到的
Re: C_Major昨天 13:46
回复yjjy0921n确实有加密,有些公司如 爱加密 做的就很好,但绝大部分的加密还是能破解掉的。我发的是逆向工程最根本基础,工具也是Android逆向必用且是基本的,以后会陆续更新这方面的心得,包括解密。虽然移动平台逆向接触不长,但很欢迎来提建议^_^
Re: yjjy0921昨天 14:16
回复C_Majorn恩,挺好。我最近也在了解这方面的内容,关注了
  相关解决方案