- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
17.3 编写模块功能
环境搭建好了,下面就开始操作了。上面安装的那个工具其实是一个模块管理器,如果想做一些 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论