Andy0214 发表于 2019-2-20 09:00

Android Studio + Xposed实现简单的hook(详细篇)

本帖最后由 Andy0214 于 2019-2-20 09:14 编辑

一、Xposed框架实现Hook的原理介绍
Dalvik 孵化器 Zygote是 Android 的核心,每运行一个 app,Zygote 就会 fork 一个虚拟机实例来运行 app,Xposed Framework 深入到了Android 核心机制中,通过改造 Zygote 来实现一些很牛逼的功能。Zygote 的启动配置在/init.rc 脚本中,由系统启动的时候开启此进程,对应的执行文是/system/bin/app_process,这个文件完成类库加载及一些函数调用的工作。
当系统中安装了 Xposed Framework 之后,会对 app_process 进行扩展,也就是说,Xposed Framework 会拿自己实现的app_process 覆盖掉 Android 原生提供的 app_process 文件,当系统启动的时候,就会加载由 Xposed Framework 替换过的进程文件,并且,XposedFramework 还定义了一个 jar 包,系统启动的时候,也会加载这个包:
/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar

二、工具的准备:
1、Android Studio
2、Xposed 安装程序

3、一部root的手机或者模拟器
4、将Xposed程序安装到手机上
安装后效果:


安装后要安装更新框架:


三、Hook模块的实现(使用Android Studio实现)
1、创建Xposed工程
(1)建lib文件夹将XposedBridgeApi-xxx.jar拖入其中 :



(2)选中XposedBridgeApi-xxx.jar文件单击右键选择Add As Library导入

(3)修改build.gradle->dependencies->****files(‘lib/XposedBridgeApi-xxx.jar’)的***为provided

(4)在AndroidManifest.xml中增加三个meta-data用来标示Xposed模块以及模块信息

(5)新建一个类,实现接口IXposedHookLoadPackage以及接口中的handleLoadPackage方法

(6)创建assets文件夹

(7)在assets文件夹中创建文件xposed_init并在其中写上实现接口IXposedHookLoadPackage类的完整路径

(8)要修改的五个地方,切记

至此,基本的工作都做完了,然后就是hook想要的东西了

四、Hook基本程序的实现
我的案例是一个登录程序,登录的时候需要账户和密码,我们就来hook这两个参数
具体代码:
参数说明|LoadPackageParam lpparam 这个参数包含了加载的应用程序的一些基本信息。

然后我们将写好的hook模块和要hook的程序安装到手机上,打开Xposed程序,勾选添加hook模块

重启手机

运行我们要hook的程序,在monitor中查看hook到的数据

或者在Xposed日志中查看日志:


上面介绍到的是hook方法,在方法调用前后hook方法参数;
接下来介绍一下怎么hook某各类中的所有值:
还是上面的登录程序的例子,程序中明文写了要判断登录的账户和密码;我们可以直接hook出来,看看能够成功登录的账户和密码:
登录程序主要代码:

我们就hookACCOUNT和   PASSWORD这两个值
在afterHookedMethod方法中实现:

注意:
1、重写XC_MethodHook的两个方法beforeHookedMethod和afterHookedMethod,这两个方法会在原始的方法的之前和之后执行.
您可以使用beforeHookedMethod 方法来打印/篡改方法调用的参数(通过param.args) ,甚至阻止调用原来的方法(发送自己的结果).
afterHookedMethod 方法可以用来做基于原始方法的结果的事情.您还可以用它来操纵结果 .当然,你可以添加自己的代码,它将会准确地在原始方法的前或后执行.
2、只能 hook 方法和构造方法,不能 hook 接口和抽象方法抽象类中的非抽象方法是可以 hook的, 接口中的方法不能 hook (接口中的method默认是publicabstract抽象的.field 必须是publicstaticfinal)
3、hook 一个类的方法,该类是子类并且没有重写父类的方法,此时应该 hook 父类还是子类.(hook 父类方法后,子类若没重写,一样生效.子类重写方法需要另外 hook) (如果子类重写父类方法时候加上 spuer ,hook 父类依旧有效)

案例中的hook模块和测试的程序源码

所有附件:
链接: https://pan.baidu.com/s/1pQ6BskWhu22t498X5zCs8A 提取码: ysrq



gunxsword 发表于 2019-2-20 12:31

期待更多的后续教程,比如怎么把HOOK的结果,用一个悬浮窗显示出来之类的实用教程,再次感谢!

gunxsword 发表于 2019-2-20 12:24

感谢分享,非常好,条理清晰,之前也看过几个入门的教程,您这个算是讲的最清楚,易懂的了,感觉看过这个.我就会了.呵呵!

汇成千古的守望 发表于 2019-2-20 09:21

感谢分享!

王哪摸 发表于 2019-2-20 09:50

牛逼,一点儿都看不懂

ouyanghua 发表于 2019-2-20 10:00

谢谢分享。。。。。

多幸运遇见baby 发表于 2019-2-20 10:08

谢谢@Thanks!

沉浮2018 发表于 2019-2-20 10:15

挺不错的。

weliong 发表于 2019-2-20 10:16

牛 就这样的 还叫简单的hook

yaojing 发表于 2019-2-20 10:36

页: [1] 2 3
查看完整版本: Android Studio + Xposed实现简单的hook(详细篇)