在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。
- 下载 github.com/newbit1/roo…
- 运转模拟器
- 履行
rootAVD.sh EMULATOR_IMAGE_PATH/ramdisk.img
- 模拟器自动重启,Magisk就装置好了
- Root完结,翻开Magisk能够进行授权办理
Magisk界面截图如下:
装置Xposed结构
Xposed结构现在由国内开发者开发了,姓名是LSPosed,包括一个Zip包给体系打补丁,一个Apk用于办理模块。 装置的话,有了Magisk之后,也是很简略。
- 下载 github.com/LSPosed/LSP… 最新的版本
- 将下载下来的压缩包,仿制到模拟器里
- 翻开Magisk办理器,装置刚仿制进来的模块
- 重启模拟器即可
LSPosed的apk其实是注入到了体系的一个app里的,首要意图是避免被微信、银行等敏感的三方使用检测到。因而开机之后,他没有单独的app图标,你能够在告诉栏看到一个常驻告诉,使用这个告诉创立一个发动快捷方式。
LSP界面截图如下:
一个入门的Hook模块
有了LSP,就能够对恣意使用包括体系进行hook了,咱们写一个比如,绑架Activity发动逻辑,打印个日志。
首要需求知道LSP模块是什么?
LSP模块是一个APK,就和咱们平时开发的APK相同,区别是相对一般APK,它能够让LSP加载到指定的进程中,并对该进程的Java进行Hook。
因而,相对一般APK开发,额定要做的两件事:
- 界说要入侵的进程,LSP官方叫做Scope,一个scope其实便是指定一个包名,例如此处咱们要hook android体系,那么包名便是android。
- 指定怎么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,启用咱们的模块,见下图。之后务必重启设备。这一步很重要!!
设备重新发动后,就能够在控制台,看见咱们的日志了,切换Activity的时分也打印了。
谢谢!