移动安全入门教程--Xposed篇
Written By Killshadow Rights
移动安全入门教程--Xposed篇一、术语介绍1. Xposed2. Zygote3.Hook技术4. 反射二、环境准备三、编写第一个Xposed插件1. 用AS新建一个空项目
一、术语介绍
1. Xposed
Xposed Framework 为来自国外XDA论坛(forum.xda-developers.com)的rovo89自行开发的一个开源的安卓系统框架。
能够让Android设备在没有修改源码的情况下修改系统中的API运行结果可实现对java层任意HOOK,比如修改IMEI、IMSI、ICCID这些全球唯一的身份标志。HOOK三方应用:微信、QQ、实现抢红包、自动回复。
Xposed框架的原理是修改系统文件,替换了/system/bin/app_process可执行文件,在启动Zygote时加载额外的jar文件(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),并执行一些初始化操作(执行XposedBridge的main方法)。然后我们就可以在这个Zygote上下文中进行某些hook操作。
There is a process that is called "Zygote". This is the heart of the Android runtime. Every application is started as a copy ("fork") of it. This process is started by an
/init.rc
script when the phone is booted. The process start is done with/system/bin/app_process
, which loads the needed classes and invokes the initialization methods.This is where Xposed comes into play. When you install the framework, an extended app_process executable is copied to
/system/bin
. This extended startup process adds an additional jar to the classpath and calls methods from there at certain places. For instance, just after the VM has been created, even before themain
method of Zygote has been called. And inside that method, we are part of Zygote and can act in its context.The jar is located at
/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar
and its source code can be found here. Looking at the class [XposedBridge] (https://github.com/rovo89/XposedBridge/blob/master/src/de/robv/android/xposed/XposedBridge.java), you can see themain
method. This is what I wrote about above, this gets called in the very beginning of the process. Some initializations are done there and also the modules are loaded (I will come back to module loading later).
项目 | 说明 |
---|---|
Xposed | Xposed框架的native部分(主要是改性app_process二进制文件) |
XposedInstaller | Xposed框架的Android端本地管理,环境架构搭建,以及第三方module资源下载的工具。 |
XposedBridge | Xposed向开发者提供的API与相应的工具类库 |
2. Zygote
Zygote本身是一个应用层的程序,和驱动、内核模块之类的没关系,可以认为是Android framework大家族的祖先。详见
在Android中,zygote是整个系统创建新进程的核心进程。zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态。
在之后的运作中,当其他系统模块(比如AMS)希望创建新进程时,只需向zygote进程发出请求,zygote进程监听到该请求后,会相应地fork出新的进程,于是这个新进程在初生之时,就先天具有了自己的Dalvik虚拟机以及系统资源。
zygote进程是由init进程启动起来,由init.rc 脚本中关于zygote的描述可知:zygote对应的可执行文件就是/system/bin/app_process,也就是说系统启动时会执行到这个可执行文件的main()函数里。
3.Hook技术
Hook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步地向下执行。而「钩子」的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事件。
Hook 的这个本领,使它能够将自身的代码「融入」被勾住(Hook)的程序的进程中,成为目标进程的一个部分。API Hook 技术是一种用于改变 API 执行结果的技术,能够将系统的 API 函数执行重定向。在 Android 系统中使用了沙箱机制,普通用户程序的进程空间都是独立的,程序的运行互不干扰。这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是 Hook 的出现给我们开拓了解决此类问题的道路。当然,根据 Hook 对象与 Hook 后处理的事件方式不同,Hook 还分为不同的种类,比如消息 Hook、API Hook 等。
4. 反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制(注意关键词:运行状态)换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
二、环境准备
一部安卓机(已经获得root权限,并开启开发者模式,usb调试选项打开)或者虚拟机
-
安装虚拟机
推荐海马(画质高,清晰度好,流畅),夜神(用户多),接下来以海马安装为例(看到有个师傅一直搞安卓虚拟机, 于是我也想掺和帮帮忙, 费了不少功夫...移动安全玩下来的,都是爱折腾的大佬啊!)
1. 安装好之后首先修改配置:
2. 进入模拟器里的设置,连续多次点击"版本号",进入开发者模式,并打开"开发者选项":
3. 找到海马模拟器安装目录,能看到adb.exe:
4. 打开powershell或cmd,到该目录下,运行
adb.exe
(千万不要用自己安装的adb!!!否则进不了adb shell, 原因是:端口冲突 or 版本不一样. 有位师傅重新下载了一个adb.exe替代掉原来的自己安装的adb,有点麻烦不推荐)
-
安装APK
XposedInstaller.apk(密码:u65c)
-
安装Android Studio(后续编写Xposed插件需用)
-
Xposed Framework
XposedBridgeApi-20150213.jar(密码:9odw) 官网下载
XposedMain.java(密码:aqg3)
-
安装IDA7.0
IDA_Pro_v7.0and_Hex-Rays_Decompiler(ARMx64,ARM,x64,x86).zip(密码:vuus)
-
安装AndroidKiller
AndroidKiller_v1.3.1.zip(密码:dl2k)
-
额外推荐一个很基情的"绿色"网站:
三、编写第一个Xposed插件
1. 用AS新建一个空项目
一路next下去,进入AS,将下载好的XposedBridgeApi-20150213.jar导入到lib。
推荐链接
https://www.2cto.com/kf/201609/550043.html
推荐书籍
移动应用安全
链接:https://pan.baidu.com/s/1o9DEzrG 密码:55m4
linux二进制分析
暂无扫描版,想往深的学,买实体书吧
Android开发书籍推荐:从入门到精通系列学习路线书籍介绍