-
-
[原创]frida版xposed
-
发表于:
2025-4-26 21:32
16886
-
主要是因为使用frida server的时候,时间长一点,系统会不稳定,时不时系统就好像重启了一样,虽然没有真的重启,但是qtscrcpy就会断掉,蓝牙也会断掉,frida server也卡死,就又得重新搞,很烦;根本原因就是因为frida的server不仅hook了目标进程,还hook了system server,为了实现spawn以及获取进程信息等等功能,所以server一旦蹦掉,遗害整个系统环境;故而想把frida想xp一样,集成一下,每次应用启动的时候就已经带了,可以直接使用。
在app启动的时,并且任意app自己的代码执行前,会启动一个服务端,这个服务会接受客户端命令,主要是三个命令,load脚本,update脚本,unload脚本,以实现frida相关功能;并且支持配置,只对目标app才会启动这个服务端。这样一来,使用frida就方便了很多,不需要启动server,检测面少了好多;其次是避免了server的一系列副作用,比如影响系统等;最后是,它的启动早于任何app代码,也就是说第一时间能拿到app的控制权,方便后续做一些检测对抗,接下来说说具体实现,效仿前辈xposed,修改zygote,这里就得提一下zygote相关的必要知识
zygote的启动

对应的文件是
/root/aosp/frameworks/base/cmds/app_process/app_main.cpp的main函数,对应app_process64
/root/aosp/frameworks/base/core/jni/AndroidRuntime.cpp的start函数,对应libandroid_runtime.so
/root/aosp/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java,对应framework.jar
zygote干完他该干的活(启动art,预加载一些常用系统资源,fork系统服务)之后,就启动了一个服务端,进入循环等死状态,等待ams给他发送app fork请求
zygote接受到ams的fork请求之后,执行fork,如下
/root/aosp/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp的
com_android_internal_os_Zygote_nativeForkAndSpecialize{
ForkCommon{
SpecializeCommon{
void SetThreadName(const std::string& thread_name)
根据我的观察,SetThreadName函数具有非常良好的性质,
1、首先它是在fork之后的,也就是运行在了app进程空间,此时启动我们的服务,是比较好的,如果在fork前执行的话,fork调用执行的时候,服务会死掉,因为fork是单线程的
2、其次,这时候在app任何代码执行之前,意味着能在最先的时机拿到app控制权,方便做一些检测的对抗
[培训]科锐逆向工程师培训第53期2025年7月8日开班!