在大多部门的引流,或业务 *** 作中,大多数需要使用安卓的黑高科技术Xposed框架,近期我们部门采购了一批新的魅族80以上系统,大多数都是基于70以上系统版本,大多数不能够刷入Root权限,虽然一些能但很是麻烦,甚至也有刷入Root权限后重启设备就恢复无Root状态的情况出现,很是忧愁的一件事,导致无能正常激活Xposed框架,从而大多模块也就无能正常应用。
昨天下午刚好看了一下琢石模拟器近期更新的软件使用手册,居然发现新版本80以上版本可以支持无Root手机下使用,手册也提供了对应无Root手机激活XPOSED框架和模块的详细方法,很是高兴,赶紧按照手册一步一步进行琢磨,果然成功安装并激活了XPOSED,且软件可以正确模拟参数和模拟定位穿越。
大概魅族80以上系统的无Root手机激活Xposed框架的流程,首先,安装无Root版本框架,第二步在框架中安装琢石模拟器和需要具体使用的应用,接着在Xposed中激活琢石模拟器模块,最后重启无Root框架就可以了,注意整个过程仅相当重启框架自身,并无需重启手机,因此比Root手机的Xposed框架激活方式更方便。
对于其他XPOSED模块的使用也是同一的流程安装激活就可以,今儿大概记录一下这些,希望对大多数无root手机的朋友有所帮助,给大家一个在魅族80以上系统无root手机上安装激活XPOSED框架提供一点教程。
使用Xposed框架Hook第三方库API——以Google Admob广告为例
一背景
笔者一开始接触Xposed框架的时候,也是在此平台的博客上看到的一篇关于利用Xposed框架劫持登录界面的用户名和密码,链接如下 :Android逆向分析之Xposed的hook技术。关于Xposed环境的搭建也可以参考上述链接,在此不作赘述。
由于其用到的是XposedHelpersjar的findAndHookMethod,这个方法要传递待Hook函数的参数列表,比较麻烦。利用XposedBridgejar的hookMethod,这个方法只需传入待Hook函数的实例(instance),再实现XC_MethodHook这个回调接口就能完成对任意API的Hook。
回到主题,要获取函数的实例,可以使用Java反射机制,对于Android系统的API可以很容易地反射得到函数的实例,但对于本文提到的第三方库API,反射获取第三方库API的实例会在跨应用时失效,需要换一种方式来获取第三方库API的实例,以下将作详细说明,并以广告API作为例子。
二类/API说明
IXposedHookLoadPackage接口
方法 描述
handleLoadPackage(XC_LoadPackageLoadPackageParam loadPackageParam)
这个方法用于在加载应用程序的包的时候执行用户的 *** 作
loadPackageParam这个参数包含了加载的应用程序的一些基本信息,可以利用此参数获取API所在类的Class对象,从而获取API的实例。
XposedBridge类
方法 描述
hookMethod(Member hookMethod, XC_MethodHook callback)
1参数:Member hookMethod是待hook的API实例,即方法对象。
2回调接口:实现XC_MethodHook接口,重写待Hook API运行前和运行后的处理方法beforeHookedMethod和afterHookedMethod(举例如下)。
XposedBridge提供了很多API帮助开发者对函数进行hook,举个例子如下:
三编写Xposed模块Hook广告API
要对Google AdMob平台的API进行Hook,并且能够限制广告的显示。首先我们需要知道AdMob平台用于显示广告的API,通过查看AdMob广告接入指南,以横幅广告为例,其显示广告的API是属于comgoogleandroidgmsadsAdView类的loadAd()。Hook此API,并禁止它的运行。具体实现如下。
编写Xposed模块
四运行效果
1LogCat显示
在combigduckgamesflow这个包加载的时候,获取了loadAd这个API的实例,并限制了它的运行。
五总结
实际上,Xposed提供丰富的API给开发者对目标函数进行hook,由于本文是专门对于第三方库的函数进行hook,只提到了一些与之相关的API。在获取第三方库Class的时候,要利用到loadPackageParam这个参数,所以要实现IXposedHookLoadPackage这个接口。虽然,本文只是简单地提到了第三方广告库函数的hook,但可以扩展到通用的第三方库,可以以此提供参考。
11 概述
Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_process 程序控制 zygote 进程,使得 app_process 在启动过程中会加载 XposedBridgejar 这个 jar 包,从而完成对系统应用的劫持。
Xposed 框架的基本运行环境如下:
因为 Xposed 工作原理是在 /system/bin 目录下替换文件,在 install 的时候需要root 权限,但是运行时不需要 root 权限。
需要在 Android 40 以上版本的机器中
2 GitHub 上的 Xposed 资源梳理一下,可以这么分类:
XposedBridgejar : XposedBridgejar 是 Xposed 提供的 jar 文件,负责在 Native层与 FrameWork 层进行交互。 /system/bin/app_process 进程启动过程中会加载该jar 包,其它的 Modules 的开发与运行都是基于该 jar 包的。
Xposed : Xposed 的 C++ 部分,主要是用来替换 /system/bin/app_process ,并为 XposedBridge 提供 JNI 方法。
XposedInstaller : Xposed 的安装包,负责配置 Xposed 工作的环境并且提供对基于 Xposed 框架的 Modules 的管理。
XposedMods :使用 Xposed 开发的一些 Modules ,其中 AppSettings 是一个可以进行权限动态管理的应用
12 Mechanism :原理
121 Zygote
在 Android 系统中,应用程序进程都是由 Zygote 进程孵化出来的,而 Zygote 进程是由 Init 进程启动的。 Zygote 进程在启动时会创建一个 Dalvik 虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个 Dalvik 虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的 Dalvik 虚拟机实例。
Zygote 进程在启动的过程中,除了会创建一个 Dalvik 虚拟机实例之外,还会将 Java运行时库加载到进程中来,以及注册一些 Android 核心类的 JNI 方法来前面创建的 Dalvik 虚拟机实例中去。注意,一个应用程序进程被 Zygote 进程孵化出来的时候,不仅会获得 Zygote 进程中的 Dalvik 虚拟机实例拷贝,还会与 Zygote 一起共享 Java 运行时库。这也就是可以将XposedBridge 这个 jar 包加载到每一个 Android 应用程序中的原因。 XposedBridge 有一个私有的 Native ( JNI )方法 hookMethodNative,这个方法也在 app_process 中使用。这个函数提供一个方法对象利用 Java 的 Reflection 机制来对内置方法覆写。具体的实现可以看下文的 Xposed 源代码分析。
122 Hook/Replace
Xposed 框架中真正起作用的是对方法的 hook 。在 Repackage 技术中,如果要对APK 做修改,则需要修改 Smali 代码中的指令。而另一种动态修改指令的技术需要在程序运行时基于匹配搜索来替换 smali 代码,但因为方法声明的多样性与复杂性,这种方法也比较复杂。
在 Android 系统启动的时候, zygote 进程加载 XposedBridge 将所有需要替换的 Method 通过 JNI 方法 hookMethodNative 指向 Native 方法 xposedCallHandler , xposedCallHandler 在转入 handleHookedMethod 这个 Java 方法执行用户规定的 Hook Func 。
XposedBridge 这个 jar 包含有一个私有的本地方法: hookMethodNative ,该方法在附加的 app_process 程序中也得到了实现。它将一个方法对象作为输入参数(你可以使用 Java 的反射机制来获取这个方法)并且改变 Dalvik 虚拟机中对于该方法的定义。它将该方法的类型改变为 native 并且将这个方法的实现链接到它的本地的通用类的方法。换言之,当调用那个被 hook 的方法时候,通用的类方法会被调用而不会对调用者有任何的影响。在 hookMethodNative 的实现中,会调用 XposedBridge中的handleHookedMethod这个方法来传递参数。 handleHookedMethod 这个方法类似于一个统一调度的 Dispatch 例程,其对应的底层的 C++ 函数是 xposedCallHandler 。而 handleHookedMethod 实现里面会根据一个全局结构 hookedMethodCallbacks 来选择相应的 hook函数,并调用他们的 before, after 函数。
当多模块同时 Hook 一个方法的时候, Xposed 会自动根据 Module 的优先级来排序,调用顺序如下:
Abefore -> Bbefore -> original method -> Bafter -> Aafter
2 源代码分析
21 Cpp 模块
其文件分类如下:
app_maincpp :类似 AOSP 中的 frameworks/base/cmds/app_process/app_maincpp,即/system/bin/app_process 这个 zygote 真实身份的应用程序的源代码。关于zygote 进程的分析可以参照 Android:AOSP&Core 中的 Zygote 进程详解。
xposedcpp :提供给 app_maincpp 的调用函数以及 XposedBridge 的 JNI 方法的实现。主要完成初始化工作以及 Framework 层的 Method 的 Hook *** 作。
xposedh , xposed_offsetsh :头文件
Xposed 框架中的 app_maincpp 相对于 AOSP 的 app_maincpp 中修改之处主要为区分了调用 runtimestart() 函数的逻辑。 Xposed 框架中的 app_maincpp 在此处会根据情况选择是加载 XposedBridge 类还是 ZygoteInit 或者 RuntimeInit 类。而实际的加载 XposedBridge 以及注册 JNI 方法的 *** 作发生在第四步: xposedOnVmCreated中。
1.包含 cutils/propertiesh ,主要用于获取、设置环境变量, xposedcpp 中需要将XposedBridge 设置到 ClassPath 中。
2.包含了 dlfcnh ,用于对动态链接库的 *** 作。
3.包含了 xposedh ,需要调用 xposedcpp 中的函数,譬如在虚拟机创建时注册 JNI 函数。
4.增加了 initTypePointers 函数,对于 Android SDK 大于等于 18 的会获取到 atrace_set_tracing_enabled 函数指针,在 Zygote 启动时调用。
5.AppRuntime 类中的 onVmCreated 函数中增加 xposedOnVmCreated 函数调用。
6.源代码中的 Log 全部重命名为 ALog, 所以 Logv 替换为 Alogv ,但是功能不变。
7.Main 函数开始处增加了大量的代码,但是对于 SDK 版本小于 16 的可以不用考虑。
211 Main 函数: zygote 入口
int main(int argc, char const argv[])
最近在负责一个项目,需要获取其他应用的内部存储中的文件,即data/data/下的文件,并转存到sdcard上。有一点Android基础的都知道data/data/中的文件对其他应用是不可见的,在没有源码的条件下,无法直接访问data/data中的文件。问了公司的大佬,大佬提供了两种思路,一种是run-as命令进入data/data,直接copy;另一种是hook。具体怎么实施,且听我慢慢道来。
安装包是debug包(release包也可以利用反编译重新打包,变成debug包,网上有很多文章可以参考)
1、连接手机到电脑,打开usb调试
2、命令行中输入 adb shell run-as <包名>
示例:
comssandroidugcaweme(抖音)不是debug包,无法使用run-as命令。
comexampleyilialinjsonreport(我自己写的app)是debug包,使用run-as命令可以进入data/data目录下,输入 ls ,可以看到data/data目录下的所有文件/文件夹
3、输入 cat <文件名> > <sdcard中的文件名> ,直接拷贝到sdcard中
示例:
不出现任何提示,表明已经成功拷贝到了sdcard中。
几行命令直接搞定
1、需要手工敲命令,难以实现自动化
2、debug包才能使用
没有限制,安装包是release包或者debug包都可以,手机不需要root
有关于xposed插件可以参考文章:>
以上就是关于魅族8.0以上系统怎么无Root激活Xposed框架的步骤全部的内容,包括:魅族8.0以上系统怎么无Root激活Xposed框架的步骤、Android逆向 Xposed去除广告模块、如何hook android sdk等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)