Files
Knowledge/sunyard/7 信安/逆向/Lsposed 技术原理探讨.md
T

34 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
https://www.52pojie.cn/thread-1694093-1-1.html
Xposed 是一个模块框架,可以在不触及任何 APK 的情况下改变系统和应用程序的行为。这很棒,因为这意味着模块可以在不同版本甚至 ROM 上工作而无需任何更改(只要原始代码没有太大更改)。它也很容易撤消。由于所有更改都在内存中完成,您只需停用模块并重新启动即可恢复原始系统。还有许多其他优点,但这里只是一个优点:多个模块可以对系统或应用程序的同一部分进行更改。
##### 1.1.2 Xposed && Lsposed 框架原理
Xposed的Hook原理是从整个Android的启动流程入手而设计出来的框架,看懂Android的启动流程,也是从从按了开机键后,从硬件到软件,到底做了什么事情,我们才能更好的理解Xposed框架。
###### 1.1.2.1 Android 启动流程
如图1-3所示:是Android启动的整个流程图,下面我们一一对每个节点进行介绍。
![[bc0173aa925fdd5c3214f97fa0101a01_143719wnzoznoe7eggulep.png]]
图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孵化而来。
- MethodHookParam 类使用介绍
// 当前 Hook 方法的对象实例,如果 Hook 的方法是静态方法就是 null Object thisObject = param.thisObject; // 当前 Hook 方法的参数值 Object[] args = param.args; // 当前 Hook 方法的信息(方法的名称、方法所在类名、方法修饰符、是否为同步方法) Member method = param.method; // 获取方法的返回值 Object result = param.getResult(); // 修改方法的返回值 param.setResult(result); // 判断方法执行是否出现了异常 param.hasThrowable(); // 获取方法调用出现的异常 Throwable throwable = param.getThrowable(); // 修改方法调用出现的异常 param.setThrowable(throwable); // 返回方法调用的结果,这个结果可能是正常的结果,也可能是一个异常对象 Object resultOrThrowable = param.getResultOrThrowable();