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

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

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

一.什么是逆向

所谓逆向,就是对于程序的“逆向工程”,英文叫“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,只不过是名字不同而已)

如图所示,我的是ReverseDemo.apk

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

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

3.Start Reverse!

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

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

 ,成功!

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

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

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

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

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

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

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

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

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

用命令:signapk ReverseDermo.apk签名。

六、安装signed.apk

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

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

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

运行结果。

时间: 2024-11-12 18:42:47

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

Android逆向分析学习与研究(2)————通过“轮盘赌”简要看看smali的基本流程控制

1.我写的一个简单的Andriod小Demo,"轮盘赌!". 我写的这个轮盘赌小游戏(姑且称它为游戏吧),主要玩法是第一次点击屏幕中间的大按钮,会弹出"子弹已上膛"的提示,再次点击会出现"扣动扳机开火吧!"的提示,第三次点击就是"赌命"的时刻了,如果有子弹,会弹出"啪!你被爆头了!",如果没有,则会弹出"你真幸运"的提示. 游戏很简单,用到了Random,代码可能在一些人看来会稍显幼稚,

工欲善其事必先利其器--------搭建Android平台

工欲善其事必先利其器--------搭建Android平台 1.1            安装JDK 在Eclipse的开发过程中需要JDK或JRE的支持,否则会报错. (1)     下载JDK(建议去JDK官网下载)[Java SE Downloads 中的Java platform(JDK)](最好不要安装在带空格的目录下) 图1-1 JDK下载 (2)     配置环境变量(此步骤很重要,过程可参照网上步骤) JAVA_HOME:  C:\Program Files\Java\jdk1.

android逆向入门及工具下载

本文所用到的工具下载: 链接:http://pan.baidu.com/s/1i3uw4NN 密码:8hz5 最近在研究如何逆向android的app,于是就有了这篇android逆向入门的总结回馈互联网. 由于Android的.apk文件实际上就是一个zip文件,修改文件后缀后直接可以打开,效果如下图所示: 里面包含了的文件有: META-INF:这个文件夹是用于保存签名文件,确保包的完整性的 res:apk所要用的资源文件,都是原封不动地保存,我们可以直接提取出来,做汉化时就可以直接阅读st

Android 逆向初探(一)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000; min-height: 13.0px } span.s1 { } span.Apple-tab-span { white-space: pre } 逆向分析是一门技术,也是一门艺

Android逆向-Android基础逆向(2-2)

[toc] #0x00 前言##不知所以然,请看Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)##以及java系列:Android逆向-java代码基础(1)Android逆向-java代码基础(2)Android逆向-java代码基础(3)Android逆向-java代码基础(4)Android逆向-java代码基础(5)Android逆向-java代码基础(6)Android逆向-java代码基础(7)Android逆向-java代码基础(8

Android逆向系列文章— Android基础逆向(6)

本文作者:HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1) Android逆向-Android基础逆向(2) Android逆向-Android基础逆向(2-2) Android逆向-Android基础逆向(2-3补充篇) Android逆向-Android基础逆向(3) Android逆向-Android基础逆向(4) Android逆向-Android基础逆向(4-2) Android逆向-Android基础逆向(5) 以及java系列: Andr

Android逆向从未如此简单

哈,又标题党了..不过我一定竭尽所能,写一篇最亲民的入门文章. 本文仅供学习交流之用,切勿用于非法用途,读者若运用所学知识,进行非法任何商业目的或者非法牟利,一切责任由操作者自行承担,与本人无关.希望读者仅仅从了解原理,保护自身APP尽量减少危害出发来阅读本文. 本文发布自wing的地方酒馆,转载请注明出处. 本文以一个最简单的例子,来教给大家Android逆向入门的一些知识.所以首先我们需要准备一个APK,做的简单一些,就是一个EditText,已经一个按钮,模拟验证注册码. 当验证码填写正确

Android与Unity交互研究

Android与Unity交互研究 转载请注明出处:http://blog.csdn.net/crazy1235/article/details/46733221 Android与Unity交互研究 unity与android交互的由来 unity简单介绍 unity与android交互介绍 unity调用android的方法 android调用untiy的方法 unity与android交互的由来 本人在项目开发过程中,遇到这样一个需求,把unity的场景放到android中去显示.刚开始做的

android 1.6 launcher研究之自定义ViewGroup (转 2011.06.03(二)——— android 1.6 launcher研究之自定义ViewGroup )

2011.06.03(2)——— android 1.6 launcher研究之自定义ViewGroup2011.06.03(2)——— android 1.6 launcher研究之自定义ViewGroup 1.用xml来作为ViewGroup里面的View参考:http://www.eoeandroid.com/thread-30888-1-1.html MyViewGroup.java package com.lp; import android.content.Context; impo