Lsposed 技术原理探讨与安装使用

目前市场上主流的Hook框架有两款,一个是Frida,另一个是Xposed。他们之间各有优缺点,简单总结来说:Frida快,但是不稳定;Xposed稳定,但是操作繁琐,减缓了分析的操作的速度。

1.1 Xposed && Lsposed

1.1.1 Xposed 系列工具发展历程

本章,先对Xposed展开讲解。那Lsposed是什么呢?和xposed有什么联系呢?既然大家购买了这本书,相信大家的技术水平已经不是停留在小白的水平了。这里只讲述核心的知识点。

对于Xposed、Edposed、Lsposed,非常有必要说明下它们的发展历程,方便于读者的理解。Xposed是早期的Hook框架,并且有成熟的社区以及API来支撑,但是它的作者在2017年就停止了项目的维护,如图1-1所示,Github的上Xposed的最新版本是v89,这个是后来增加的,最稳定的新版是v82版本,我们现在的框架依赖依然使用v82的版本。

图1-1 Xposed API

现对于2017年,已经过去5年的时间。技术是在不停的迭代升级的,虽然Xposed还能是使用,但是它本身繁琐的操作,每次编写完Hook代码后,需要重启手机,这样大大的减缓了分析的过程,并且浪费我们的生命。由于技术的升级,Xposed的特征也越来越多,被反调成了常有的事情。Xposed的作者对Xposed停止维护后,此框架依然起着很大的作用,后来出现了Edposed,并接管了Xposed的位置。但是Edposed的存在期间很短,框架本身也有很多弊病。于是,对于Edposed的改良框架Lspoded脱颖而出。Edposed我们在后面也不会提及,因为它只是一个过渡版本。

Lsposed是在Edposed的基础上进行改良的新框架。并且接管了Xposed的API,可以很好的兼容Xposed的API。所以我们后面的开发工作都是基于Xposed的API进行开发,再配合上Lsposed的优秀特性,体验感十分良好。

对于Xposed的弊端,这里有必要说明一下:Xposed会对所有的应用都进行注入,也就是全局模式,导致应用启动变得非常的慢,这个在Lsposed上有了很大的改良。在Lsposed上,我们可以对目标app选择注入,并且支持多选。这项改进也不算是重大的技术升级,说到底就是引导用户正确的使用Xposed,确保Xposed框架和模块不会做额外的事情。


图1-2 Lsposed github official declare

图1-2是Lsposed的官方声明,下面是对介绍的翻译:

Riru / Zygisk 模块试图提供一个 ART Hook 框架,该框架利用 LSPlant 挂钩框架提供与 OG Xposed 一致的 API。

Xposed 是一个模块框架,可以在不触及任何 APK 的情况下改变系统和应用程序的行为。这很棒,因为这意味着模块可以在不同版本甚至 ROM 上工作而无需任何更改(只要原始代码没有太大更改)。它也很容易撤消。由于所有更改都在内存中完成,您只需停用模块并重新启动即可恢复原始系统。还有许多其他优点,但这里只是一个优点:多个模块可以对系统或应用程序的同一部分进行更改。对于修改后的 APK,您必须选择一个。没有办法组合它们,除非作者用不同的组合构建了多个 APK。

从图1-2中还能看到它支持Android 8.1-13 的系统版本。补充说明下,Xposed旧版的API只支持的Android7,后来更新的出来的一些版本,如v89,是支持Android 8的版本的。

1.1.2 Xposed && Lsposed 框架原理

Xposed的Hook原理是从整个Android的启动流程入手而设计出来的框架,看懂Android的启动流程,也是从从按了开机键后,从硬件到软件,到底做了什么事情,我们才能更好的理解Xposed框架。

1.1.2.1 Android 启动流程

如图1-3所示:是Android启动的整个流程图,下面我们一一对每个节点进行介绍。


图1-3 Android 启动流程图

Android整系统分为四层,分别为kernel、Native、FrameWork、应用层(APP),loader也可以单独算一层,是硬件的启动加载预置项。

  1. 首先当我们长按开机键(电源按钮)开机,此时会引导芯片开始从固化到ROM中的预设代码处执行,然后加载引导程序到RAM。然后启动加载的引导程序,引导程序主要做一些基本的检查,包括RAM的检查,初始化硬件的参数。

  2. 到达内核层的流程后,这里初始化一些进程管理、内存管理、加载各种Driver等相关操作,如Camera Driver、Binder Driver 等。下一步就是内核线程,如软中断线程、内核守护线程。下面一层就是Native层,这里额外提一点知识,层于层之间是不可以直接通信的,所以需要一种中间状态来通信。Native层和Kernel层之间通信用的是syscall,Native层和Java层之间的通信是JNI。

  3. 在Native层会初始化init进程,也就是用户组进程的祖先进程。init中加载配置文件init.rc,init.rc中孵化出ueventd、logd、healthd、installd、lmkd等用户守护进程。开机动画启动等操作。核心的一步是孵化出Zygote进程,此进程是所有APP的父进程,这也是Xposed注入的核心,同时也是Android的第一个Java进程(虚拟机进程)。

  4. 进入框架层后,加载zygote init类,注册zygote socket套接字,通过此套接字来做进程通信,并加载虚拟机、类、系统资源等。zygote第一个孵化的进程是system_server进程,负责启动和管理整个Java Framework,包含ActivityManager、PowerManager等服务。

  5. 应用层的所有APP都是从zygote孵化而来

1.1.2.2 Xposed 注入源码剖析

上述是Android的大致流程,接下来我们从代码执行的角度来看执行链。

从图1-3中,我们可以总结出一条启动链:

 复制代码 隐藏代码
init => init.rc => app_process => zygote => ...

一个应用的启动,核心的步骤是Framework层的zygote启动,zygote是所有进程的父进程,也就是说,所有APP应用进程都是由zygote孵化而来。为什么要从Native层开始说明呢?这是因为Native层开始就是Android源码的运行过程,Xposed的注入也就是从Native层开始的。

根据Android启动流程图可知,zygote是由

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值