• 安卓逆向 - Xposed入门教程


    一、引言

    Xposed框架,是Android中Hook技术的一个著名的框架,拥有非常丰富的模块,给我们分析app提供了极大的便利,Xposed框架是开源的。最高支持到Android 8(重要

    github地址:GitHub - rovo89/Xposed: The native part of the Xposed framework (mainly the modified app_process binary).

    二、Hook原理

    1、Xposed框架的工作原理是通过在Android系统的应用层和框架层之间插入钩子(hook)来实现。钩子可以截获和修改Android系统的核心函数调用,从而实现对系统行为的改变。

    2、Android 系统是基于 Linux 的,其第一个由内核启动的用户进程是 init 进程。init 进程随后会创建孵化进程(zygote ),Android 应用程序进程都是由 zygote 进程孵化而来。zygote 所对应的可执行程序是 app_process,xposed 框架通过替换系统的 app_process 可执行文件以及虚拟机动态链接库,让 zygote 在启动应用程序进程时注入框架代码,进而实现对应用程序进程的劫持。

    三、Xposed安装

    1、下载Xposed apk Xposed Installer,安装至手机或者模拟器上

    2、执行 mount -o remount -w /system  放开system写权限

    3、进入xposed管理界面,魔法上网可以直接下载zip文件(或者自己去下载zip文件,注意安卓版本问题,如:安卓5.1对应SDK22)

    四、Xposed Hook入门

    前置:需要有一点点Android开发经验(重要

    1、在build.gradle添加依赖:内部build.gradle

    compileOnly 'de.robv.android.xposed:api:82'

    2、编辑AndroidManifest.xml,添加

    1. <meta-data
    2. android:name="xposedmodule"
    3. android:value="true"/>
    4. <meta-data
    5. android:name="xposeddescription"
    6. android:value="hello xposed"/>
    7. <meta-data
    8. android:name="xposedminversion"
    9. android:value="82"/>

    3、新建一个类XposedInit实现IXposedHookLoadPackage,实现以下方法,该方法会在执行Application.onCreate()方法前调用

    1. @Override
    2. public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam){
    3. if (lpparam.packageName.equals("com.test.xposeddemo")) {
    4. }
    5. }

    4、新建assets文件夹,文件夹下新建xposed_init文件,编辑文件,填写XposedInit类的完整包名,class不能使用Class.forName()来获取,查看forName的源码,该方法需要传一个类加载器,默认使用的是VMStack.getCallingClassLoader(),这个是获取当前应用的ClassLoader,即xposed项目的ClassLoader,如果使用Class.forName("")获取不同应用的类会提示找不到

    5、编写Hook方法

    1. public class XposedInit implements IXposedHookLoadPackage {
    2. @Override
    3. public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) {
    4. if (lpparam.packageName.equals("com.test.xposeddemo")) {
    5. XposedHelpers.findAndHookMethod("com.test.xposeddemo.MainActivity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
    6. @Override
    7. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    8. //不能通过Class.forName()来获取Class
    9. Class c=lpparam.classLoader.loadClass("com.wrbug.xposeddemo.MainActivity");
    10. Field field=c.getDeclaredField("textView");
    11. field.setAccessible(true);
    12. TextView textView= (TextView) field.get(param.thisObject);
    13. textView.setText("Hello Xposed");
    14. }
    15. });
    16. }
    17. }
    18. }

    6、打包成apk文件,安装至手机

    7、Xposed模块管理界面,开启该模块,重启手机后。我们会发现该模块已经生效

    五、代码解释

    1、handleLoadPackage方法,该方法会在执行Application.onCreate()方法前调用,并且携带一个XC_LoadPackage.LoadPackageParam lpparam返回过来,lpparam包含了hook到的应用的相关信息

    2、参数

    fields

    type

    description

    packageName

    String

    应用包名

    processName

    String

    应用加载后的进程名

    classLoader

    ClassLoader

    应用的classloader

    appInfo

    ApplicationInfo

    应用的信息,包括verisonCode,uid等

    六、其他 

    1、IXposedHookInitPackageResources这个是在资源布局初始化时进行hook,需要实现handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) 方法,在初始化时调用,resparam有如下两个字段:

    packageName

    String

    应用包名

    res

    XResources

    资源相关

    2、IXposedHookZygoteInit:在Zygote启动时调用,用于系统服务的Hook回调方法initZygote() 

  • 相关阅读:
    基于SSM框架的《超市订单管理系统》Web项目开发(第二天)完成登录模块和用户退出模块
    [随笔] 具有产品意识的工程师
    探索RPA流程自动化在不同行业的应用案例
    Linux 日期、时区
    如何写出好的文档
    智能sql LLM
    Docker之查看并获取最新Ubuntu镜像(十)
    基于git+gitlab+jenkins实现python项目自动化发布
    PDF处理技巧分享之PDF合并:一键实现几个PDF合并成一个PDF
    ElasticSearch - 分词器介绍及中文分词器es-ik安装
  • 原文地址:https://blog.csdn.net/weixin_42840266/article/details/132955927