返回介绍

17.3 编写模块功能

发布于 2024-10-10 22:32:20 字数 3762 浏览 0 评论 0 收藏 0

环境搭建好了,下面就开始操作了。上面安装的那个工具其实是一个模块管理器,如果想做一些 hook 操作还得自己编写模块,然后把这个模块安装到设备中,这个工具就可以检测出来了,会提示加载这模块然后重启设备,模块功能就有效果了。那么下面来看一下如何编写一个 Xposed 模块。

第一步:新建模块项目

导入 Xposed 工具包,如图 17-6 所示。

图 17-6 模块工程

这里一定要注意:不能使用 libs 文件夹而要使用 lib 文件夹,如果这里使用了 libs 文件夹,在安装模块成功之后重启,会发现 Hook 是失败的,通过打印 tag 为 xposed 的日志信息会发现这样的错误:

这个错误主要是因为把接口包含到了插件项目中了,那么可以猜想错误问题也是这个 Xposed 工具导致的。那么只需要把 libs 文件夹改成 lib 文件夹,然后用 add buildpath 命令即可。

注意:在 Eclipse 中,如果把工具包放到 libs 文件中,默认是加入到编译路径中的,同时在编译出来的程序中也是包含了这个工具包中的所有类,而对于其他非 libs 文件夹,添加工具包之后执行 add buildpath 只是做到了项目引用工具包的功能,而最终并不会把这个工具包包含到程序中。

第二步:编写模块代码

编写模块代码只要新建一个实现 IXposedHookLoadPackage 接口类,然后在 handle-LoadPackage 回调方法中进行拦截操作即可,而具体的拦截操作是借助 XposedHelpers.findAndHookMethod 方法和 XposedBridge.hookMethod 方法实现的,这两个方法从参数含义可以看到,主要是需要 Hook 的类名和方法名,还有一个就是拦截的回调方法,一般是拦截之前做什么的 beforeHookedMethod 方法,以及拦截之后做什么的 afterHookedMethod 方法,如图 17-7 所示。

图 17-7 模块代码

对于 IXposedHookLoadPackage 这个接口和回调方法,可以知道,应该是拦截系统中所有应用的运行信息,传递回来的一个 LoadPackageParam 参数类型就是包括了 Hook 应用的具体信息,打印应用的包名就可以看到效果了。

注意:如果想 Hook 一个类的具体方法,那么就必须要清楚地了解到这个方法的详细信息,比如参数类型和个数,返回类型等。因为在拦截的过程中必须要对这个方法进行分析,比如得到方法参数来进行具体参数修改,返回值信息来进行返回值修改。

看到了获取 imei 值的方法是一个无参数的返回字符串类型的方法,那么如果要拦截它的返回值,就需要修改它的返回值,使用 setResult 方法即可。所以从这里可以看到不管是 Hook 系统的方法,还是以后去 Hook 第三方应用的具体类方法,第一步都得了解到 Hook 对象的具体信息。关于系统方法可以通过查看源码来得到信息,而对于第三方应用的话只能借助反编译技术了,比如修改游戏金币功能,必须先反编译游戏知道修改金币的类和具体方法才可行。

这里不仅 Hook 了系统的 imei 信息,也简单 Hook 了系统的地理位置信息,在 Android 中获取经纬度信息有三种方式,这里为了演示简单,用了 GPS 定位功能,一般获取经纬度信息的代码主要是两处。

第一处是初始化的时候调用 getLastKnowLocation 方法获取最后一次系统中的地理位置信息,如下代码:

第二处就是监听地理位置变化的回调接口中的 onLocationChanged 回调方法,如下代码:

如果想 Hook 系统的地理位置信息进行拦截,就需要操作这两处代码。而它们有一个区别,第一处是通过返回值得到的,第二处是通过回调方法中的参数得到的。下面来看一下具体的 Hook 代码。

Hook 第一处代码比较简单,直接构造一个假的 Location 对象,然后设置返回值即可,如下代码所示:

Hook 第二处代码有点复杂,需要先找到添加位置监听的方法 requestLocationUpdates,然后通过反射得到这个回调对象,找到具体的回调方法,再进行操作,因为回调方法是通过参数把 Location 对象传递回来的,所以这里需要修改参数值。如下代码所示:

到这里就编写好了 Hook 系统的 imei 值和地理位置信息的模块了。

第三步:添加模块入口

这一步是非常重要的,也是最容易忘记的,就是要告诉 Xposed 框架一个模块中 Hook 的入口,可以看到模块的入口是 Main 类,所以需要在模块的 assets 中添加一个 xposed_init 文件,如图 17-8 所示。

图 17-8 入口文件 xposed_init

这里的内容就是模块入口类的全称名称即可,如图 17-9 所示。

图 17-9 xposed_init 文件内容

第四步:添加模块的额外信息

最后一步需要在模块的 AndroidManifest.xml 文件添加额外信息,具体包括模块的描述信息、版本号等,如下所示:

其中:

·xposedmodule:是 Android 程序作为 Xposed 中的一个模块,所以值为 true。

·xposeddescription:是对本模块的功能的描述,可以自己简单叙述一下就可以了。

·xposedminversion:是本模块开发时用到的 Xposed 的 jar 包最低版本号,这里是 30,这里所用的 Xposed 的 jar 包版本是 54。

经过上面 4 步之后就完成了模块的定义,最后为了验证 Hook 的结果,再新建一个 Activity 类,在内部调用一下系统的获取 imei 方法以及位置信息方法,并且显示在屏幕中,如下代码所示:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文