一.原理

android每打开一个 app,zygote 进程 fork(进程复用)出一个虚拟机来运行 app,xposed 就是通过改造 zygote来实现对 app_progress的替换

二.安装 xposed 支持

1.版本 Xposed Installer
2.版本 EdXposed (支持高版本:https://repo.xposed.info/module/org.meowcat.edxposed.manager)

三.编写步骤

1.新建项目
2.更改 AndroidMainfest.xml ,在 application 标签内部添加如下配置:

 <!--添加 module--><meta-dataandroid:name="xposedmodule"android:value="true"/><!--添加 描述--><meta-dataandroid:name="xposeddescription"android:value="xposedHookPorject"/><!--添加 jar 版本 --><meta-dataandroid:name="xposedminversion"android:value="54"/>

3.在 app 目录下新建 lib,导入 xposedBridge.jar(xposed 的开发 api的 jar)
或者:在 build.gradle 引入:compileOnly ‘de.robv.android.xposed:api:82’

4.新建程序入口类 HookTest 实现自 IXposedHoodLoadPackage
5.新建 xposed程序入口配置文件 xposed_init(名字固定),内容为:包名+入口名

四.避免修改 hook 后重启 (没有试过,网上有方案,原理如下)

1.重启方式,性能优、每次需要重启,直接加载IXposedHookLoadPackage中的 handleLoadPackage

2.避免重启,遍历 data/app下的apk并加载,损耗性能,采用加载中间IXposedHookLoadPackage类然后加载 apk文件,再调用实际需要 hook 的IXposedHookLoadPackage,每次修改 hook 之后,需要重启中间IXposedHookLoadPackage程序

五.常用的 hook api

1.hook 方法参数 -> findAndHookMethod

XposedHelpers.findAndHookMethod(包名+类名,param.classLoader,"",//方法名String.class,String.class,//参数new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);XposedBridge.log("第一个参数:" + param.args[0]);XposedBridge.log("第二个参数:" + param.args[1]);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {param.setResult("Hook succeed");XposedBridge.log("返回值:" + param.getResult());param.setResult(true);}});

2.主动调用类中的方法 -> callMethod(普通方法)/callStaticMethod(静态方法)

String result = XposedHelpers.callStaticMethod(loadPackageParam.getClass(), "方法名", new Object[]{""});

3.调用字段属性方法等

Class<?> clazz = param.thisObject.getClass();//获取类
Field field = clazz.getDeclaredField(字段名);//通过字段名字获取属性
field.setAccessible(true);//设置对外可见
Object obj = (Object) field.get(param.thisObject);Method method = clazz.getDeclaredMethod(方法名,new Class[]{byte[].class,String.class});//获取方法
method.setAccessible(true);//方法可见
String resultStr = (String) method.invoke(param.thisObject,参数 1, 参数 2,....);

4.多 dex 情况下hook
方案 1:遍历所有的类,进行匹配
方案 2:通过参数获取当前程序的类加载器Application.class,通过获取到的类加载器,再 hook 方法或字段

## 五.坑

1.Xposed Installer 打开后提示,模块加载失败
解决:直接更新

2.Xposed Installer 里面没有模块
解决:工程 xposed_init入口和 AndroidManifest.xml 配置是否正确

3.模块加载进来,hook 所有日志不打印(太惨了~ ~)
解决:在 Xposed Installer模块中,重新开关模块之后重启设备

android逆向之 hook相关推荐

  1. Android逆向-Xposed Hook基础 游戏

    首先上游戏安卓包: 链接:https://pan.baidu.com/s/1fNe29ZwOhOvywcvjzVrcug 提取码:a21f 附上xposed的github地址:https://gith ...

  2. xposed安装,与android逆向工程之xposed的hook

    Xposed installer安卓安装和使用 文章目录 Xposed installer安卓安装和使用 (一)Xposed installer安卓安装 0.百度网盘-我所用的apk(3.1.5)和z ...

  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )

    文章目录 前言 一.Class.cpp#dvmDefineClass 函数分析 二.Class.cpp#findClassNoInit 函数分析 三.DexFile.cpp#dexFindClass ...

  4. 【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )

    文章目录 一.脱壳点简介 二.修改系统源码进行脱壳 一.脱壳点简介 在上一篇博客 [Android 逆向]整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 rewriteD ...

  5. 【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )

    文章目录 前言 一.刷新 CPU 高速缓存 二.处理拦截函数 1.桩函数 2.处理拦截函数 三.返回特定结果 四.相关完整代码 前言 [Android 逆向]函数拦截实例 ( 函数拦截流程 | ① 定 ...

  6. 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )

    文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...

  7. 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

    文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...

  8. Android逆向与病毒分析

    本文由同程旅游安全团队对内移动安全培训的PPT整理而来,面向对象为对移动安全感兴趣的研发同事,所以讲的有些宽泛.介绍了入门Android逆向需要掌握的一些知识点, 通过简单的几个案例讲解Android ...

  9. Android 逆向分析大全

    转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. ...

最新文章

  1. 人工智能及其应用(第5版).蔡自兴-4章课后习题。【部分参考答案】
  2. Spark-Scala算子
  3. Python 人脸识别 OpenCV (haarcascades)
  4. 2008_12_24_星期三
  5. Node_初步了解(4)小爬虫
  6. 数据库:推荐几款 Redis 可视化工具,你都用过吗?
  7. C#LeetCode刷题之#641-设计循环双端队列(Design Circular Deque)
  8. 拿来就能用!去哪儿网消息中间件 QMQ 详解 | 技术头条
  9. C#:在u3d中操作sqlite的数据库
  10. 打断点是什么意思_英语微课堂:“Give me a break”是什么意思呢?
  11. GJB438C-2021规范详解其二
  12. Remoting技术
  13. windows图片和传真查看器打不开的解决办法
  14. Minecraft mod制作简易教程(四)——创建一个方块
  15. 李欣桐 计算机竞赛,【赛出精彩】我校举行数学计算能力竞赛活动
  16. 斐讯n1 linux连接wifi,斐讯 N1 部署 Docker 和 OpenWRT,并利用 Hostapd 开启 Wi-Fi 热点
  17. 逻辑函数(表示方法、形式转换、化简、最小项、最大项)
  18. Springmvc中文乱码问题
  19. mPaas小程序(支付宝、钉钉...) 筛选器/格式化数据
  20. 销宝:落地页转换率如何提高?

热门文章

  1. surface book3屏幕背后发热问题解决(无法解决)
  2. 可调电源LM317 的内部原理 - 特殊的电压跟随器
  3. python伪装微信post提交
  4. springboot vue黑板檫在线教育系统
  5. 为什么两表关联查询时唯一索引没有生效
  6. 如何开启phpStudy服务器
  7. Ubuntu20虚拟机克隆以及克隆后静态IP和主机名的修改
  8. 远程教学平台_关于远程教学
  9. 裁剪图片的同时将xml标注文件里的真实框裁剪,使得他们一一对应
  10. 输入姓名,问好,字符切片