在Android模拟器上玩转Xposed

这篇文章演示了怎么Root Android模拟器。 别的经过一个简略的比如,演示咱们根据Xposed结构,hook Android体系,实时打印当时Activity的信息。

学完这个咱们就能依照需求,随意绑架Android体系或者三方App了。

Root 模拟器

此处以Android13为例。

现在Root技能,首要由Magisk完结,这是一套Root东西,包括一个刷入手机的Zip包,以及装置到手机上的Apk用于进行Root授权办理。

在真机上Root和模拟器Root是有区别的,真机相对比较麻烦,需求解锁BL,刷入康复体系之后,才干刷入Magisk root包。

而在模拟器上,相对简略,只需求修正Boot镜像,在其中参加Magisk root包即可,有一个开源的模拟器Root东西 RootAVD,可快速完结root。

  1. 下载 github.com/newbit1/roo…
  2. 运转模拟器
  3. 履行rootAVD.sh EMULATOR_IMAGE_PATH/ramdisk.img
  4. 模拟器自动重启,Magisk就装置好了
  5. Root完结,翻开Magisk能够进行授权办理

Magisk界面截图如下:

在Android模拟器上玩转Xposed

装置Xposed结构

Xposed结构现在由国内开发者开发了,姓名是LSPosed,包括一个Zip包给体系打补丁,一个Apk用于办理模块。 装置的话,有了Magisk之后,也是很简略。

  1. 下载 github.com/LSPosed/LSP… 最新的版本
  2. 将下载下来的压缩包,仿制到模拟器里
  3. 翻开Magisk办理器,装置刚仿制进来的模块
  4. 重启模拟器即可

LSPosed的apk其实是注入到了体系的一个app里的,首要意图是避免被微信、银行等敏感的三方使用检测到。因而开机之后,他没有单独的app图标,你能够在告诉栏看到一个常驻告诉,使用这个告诉创立一个发动快捷方式。

LSP界面截图如下:

在Android模拟器上玩转Xposed

一个入门的Hook模块

有了LSP,就能够对恣意使用包括体系进行hook了,咱们写一个比如,绑架Activity发动逻辑,打印个日志。

首要需求知道LSP模块是什么?

LSP模块是一个APK,就和咱们平时开发的APK相同,区别是相对一般APK,它能够让LSP加载到指定的进程中,并对该进程的Java进行Hook。

因而,相对一般APK开发,额定要做的两件事:

  1. 界说要入侵的进程,LSP官方叫做Scope,一个scope其实便是指定一个包名,例如此处咱们要hook android体系,那么包名便是android。
  2. 指定怎么Hook,便是要写hook的代码了,经过代码hook java method,将其替换成咱们自己的逻辑。

下面开端代码示例:

首选新建一个工程,没什么要求,可随便创立。

首要增加Scope界说

在AndroidManifest.xml里,界说以下meta data,首要是告知LSP咱们是一个模块,以及咱们的scope在哪个xml里,让它去解析。

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.MyApplication"
    tools:targetApi="31" >
​
    <meta-data
      android:name="xposedmodule"
      android:value="true" />
    <meta-data
      android:name="xposeddescription"
      android:value="This is a demo for Xposed" />
    <meta-data
      android:name="xposedminversion"
      android:value="53" />
    <meta-data
      android:name="xposedscope"
      android:resource="@array/xposed_scope" />
​
  </application>
​

Scope XML 界说如下,支撑界说多个,咱们还是以Android体系为例。

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string-array name="xposed_scope">
    <item>android</item>
  </string-array>
</resources>

接下来,指定Hook逻辑

LSP加载咱们的Hook逻辑时,要知道咱们的Hook代码进口,因而,咱们需求创立一个xposed_init文件,放在app/assets目录下,供LSP解析。

文件内容如下:

com.example.xposed.demo.HookEntry

下面就要开端完结HookEntry这个类了,到此咱们需求引证一个lib依靠,这个依靠供给了Hook相关的一些东西以及接口,咱们要完结接口,利用东西去修正method。

在app依靠中增加,留意是compileOnly的,由于在装置LSP时,这个lib现已集成到体系运转时了:

compileOnly("de.robv.android.xposed:api:82")

由于这个库出来很久了,所以要在根目录settings.gradle,加上jcenter库房,不然拉不下来。

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    google()
    mavenCentral()
    // here.
    jcenter()
   }
}
​

现在开端正式编码:

const val LOG_TAG = "XposedDemo"class HookEntry : IXposedHookLoadPackage {
​
  // 加载一个使用的进程的时分,会调用这个办法
  override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
    // 如果多个scope,那么要经过lpparam判别,详细加载的是哪个使用
    if (lpparam.packageName == "android") {
      // 用XposedBridge打印的日志,能够在LSPosed办理器中看到日志记载
      XposedBridge.log("$LOG_TAG Loading Android")
​
      // 经过东西,找到要绑架的class
      val classToHook = XposedHelpers.findClass(
        "com.android.server.wm.ActivityStarter",
        // 这个classloader便是目标app的,用它才干定位到目标class
        lpparam.classLoader
       )
      XposedBridge.log("$LOG_TAG classToHook: $classToHook")
​
      // https://cs.android.com
      // 咱们能够查阅AOSP代码,看下Activity发动流程
      // 此处咱们hook以下ActivityStarter的发动办法
      // 原型如下:
      // private int executeRequest(Request request) {...}
      XposedBridge.hookAllMethods(
        // 类
        classToHook,
        // 要hook的办法名
        "executeRequest",
        object : XC_MethodHook() {
          // AOP办法之一,在办法履行之前要做的事情,此处咱们打印日志
          // 提示:此处除了能够获取到method参数,返回值信息之外,还能修正返回值
          override fun beforeHookedMethod(param: MethodHookParam) {
            super.beforeHookedMethod(param)
​
            val request = param.args[0]
            // 东西很便利
            val intent = XposedHelpers.getObjectField(request, "intent")
​
            // 打印日志,意图达到了
            XposedBridge.log("$LOG_TAG Starting Activity: $intent")
           }
​
         })
​
     }
   }
​
}

至此,编码完结,打包装置apk到模拟器上。翻开LSP办理器,进入模块Tab,启用咱们的模块,见下图。之后务必重启设备。这一步很重要!!

在Android模拟器上玩转Xposed

设备重新发动后,就能够在控制台,看见咱们的日志了,切换Activity的时分也打印了。

在Android模拟器上玩转Xposed

谢谢!