注:头连天参加一个慕课网的活动发表的文章,从那里搬到这里来
工具可到看雪移动下载:点击打开链接下载,里面有工具列表,很详细。
一.什么是逆向
所谓逆向,就是对于程序的“逆向工程”,英文叫“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 未知错误
运行结果。
Android逆向分析学习与研究(1)————工欲善其事必先利其器
原文地址:http://blog.csdn.net/c_major/article/details/41957779