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

2024-03-07 21:44

本文主要是介绍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启动流程图可知ÿ

这篇关于Lsposed 技术原理探讨与安装使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784927

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Win安装MySQL8全过程

《Win安装MySQL8全过程》:本文主要介绍Win安装MySQL8全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Win安装mysql81、下载MySQL2、解压文件3、新建文件夹data,用于保存数据库数据文件4、在mysql根目录下新建文件my.ini

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删