Android Hook框架Xposed入门
来源:互联网 发布:乌云 知乎 编辑:程序博客网 时间:2024/05/16 11:22
转:http://chendd.com/blog/2016/05/15/learn_xposed/
一.基础知识
Xposed是Android平台上较为出名的一个开源框架。在这个框架下,我们可以加载很多插件App,这些插件App可以直接或间接操纵普通应用甚至系统上的东西。Xposed原理上是Hook Android 系统的核心进程Zygote来达到修改程序运行过程和结果。讲到这里,可能有人会问什么是Hook?什么是Zygote?
Hook(钩子),钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
Zygote(Android进程名),Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,这也许就是为什么要取名英文本意为受精卵的Zygote原因吧。
由于Xposed框架Hook了Android的核心进程Zygote,而其他应用启动都是从Zygote进程fork而来,就够达到针对系统上所有的应用程序进程的Hook。
二.Xposed简介
官网地址: http://repo.xposed.info/
源码地址: https://github.com/rovo89
rovo89大神github主页,如图所示
主页大致可以看出,xposed主要由三个项目来组成的
- Xposed,Xposed的C++ 部分,主要是用来替换/system/bin/app_process,并为XposedBridge提供JNI方法
- XposedBridge,Xposed 提供的jar文件,app_process启动过程中会加载该jar包,其他的Modules的开发都是基于该jar包
- XposedInstaller,Xposed的安装包,提供对基于Xposed框架的Modules的管理
xposed目前已逐步支持ART虚拟机,兼容android 5.0以上版本
三.Xposed使用
在Android 4.0以上Android设备(需root权限,建议直接用模拟器)安装XposedInstaller
启动XposedInstaller点击 【框架】
点击 【安装/更新】 并重启,再点击框架看到看到 激活底下两个都是绿色 代表框架安装成功
我们可以点击【下载】来查看热门插件进行安装
安装完插件点击【模块】进行勾选激活
之后还需重启,插件才能生效。大家可以自己下载几个插件玩玩,本文重点不在这,就不演示了。
四.编写插件
这里我们hook自己编写的一个小的登录app来获取用户名密码。
界面比较简单,输入用户名密码点击登录弹出用户输入的密码
界面代码
1.在AndroidManifest.xml文件中配置
2.导入其jar包
XposedBridgeApi-.jar,下载完毕后我们需要将Xposed Library复制到lib目录(注意是lib目录,不是Android提供的libs目录),然后将这个jar包添加到Build PATH中。
3.声明主入口路径
需要在assets文件夹中新建一个xposed_init的文件,并在其中声明主入口类。如这里我们的主入口类为
4.使用findAndHookMethod方法Hook
这是最重要的一步,我们之前所分析的都需要到这一步进行操作。如我们之前所分析的登陆程序,我们需要劫持,就是需要Hook其com.example.logintest.MainActivity中的isCorrectInfo方法。我们使用Xposed提供的findAndHookMethod直接进行MethodHook操作。在其Hook回调中使用XposedBridge.log方法,将登陆的账号密码信息打印至Xposed的日志中。具体操作如下所示
5.运行程序,查看效果
重启Android设备,进入XposedInstaller点击【日志】查看,因为我们之前使用的是XposedBridge.log方法打印log,所以log都会显示在此处。我们发现我们需要劫持的账号密码都显示再来此处。
这里由于demo是我们自己写的,所以知道hook它的帐号校验方法isCorrectInfo来获取用户名密码,如果有些程序账户校验没有封装方法呢?其实我们可以hook其它一些必有的方法,如button的onClick方法,甚至可以动态改变EditText的内容,做法如下:
点击登录按钮,发现输入框内容改变了
之前登录app密码EditText声明为 private 时,导致反射获取报NoSuchFileException,原因是普通的反射不能获取私有变量, 改为EditText声明改为public后成功,或者不能改EditText声明时,可以用以下方法,无论公有私有都可以获取
4.总结
既然能成功Hook自己的App,那么系统应用和其它应用的也同理,只不过需要知道系统公开接口或者反编译获得相应的接口,下次讲解Hook不是自己的应用做些好玩的东西。
附:
本文源码: https://github.com/chendd/XposedTest.git
官方教程: https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
官方例子: https://github.com/rovo89/XposedExamples
参考文章: http://www.csdn.net/article/1970-01-01/2825462
- Android Hook框架Xposed入门
- Android Hook框架Xposed入门
- Android Hook框架Xposed入门
- Xposed Android hook框架入门 -开发步骤
- Android Hook框架Xposed详解
- Android Hook框架Xposed进阶
- Android.Hook框架xposed篇
- android hook 框架 xposed 如何实现注入
- Android xposed框架开发入门
- Android Xposed框架 -- 入门篇
- xposed hook入门篇
- hook系列——Xposed框架入门(一)
- Xposed Android Java Hook
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed原理与源代码分析
- 使用渗透测试框架Xposed Framework hook调试Android APP
- 使用渗透测试框架Xposed Framework hook调试Android APP
- Android Hook框架Xposed原理与源代码分析
- emoji demo
- 1.尚硅谷_佟刚_SSH 整合案例_需求
- 自定义绑定点绑定武器
- android中BuildConfig.DEBUG的使用
- Spring+JPA+Hibernate+Junit Test + maven Demo 整合配置
- Android Hook框架Xposed入门
- C++多线程和任务等待问题
- 各种jar包,工具,文档 下载路径
- leetcode 219. Contains Duplicate II
- 真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService
- 20160825群赛round8
- PHP中字符串处理函数
- SQL之存储过程
- 有关Android 6.0权限问题java.lang.SecurityException: Permission Denial