java 无感hook实现(修改jdk)

news2024/11/20 7:21:02
背景

1

工作需要,需要修改一个java的程序逻辑,之前都是用的frida修改的,但是现在的工作场景,重视效率,所以frida这种重工具被pass了,只能重新选其他工具,初始的时候是想用java本身的一些修改工具的,上网发现了很多。比如cglib,javaassist,asm,byte buddy等;

java本身hook工具的限制

1

2

3

4

5

6

7

8

9

10

11

但是发现,这些都不符合我的应用场景,首先,我这个应用的jar包本身是加密的,需要加载的过程中在自定义的classloader中进行解密才能得到最终的dex文件,而这些工具大多都是通过调用默认的classloader来加载的,直接就会检测当前dex文件不符合文件格式而报错;

有一些可以绕过的,又只能修改未加载的dex;

后来redefineClass绕过了,发现他只能修改部分逻辑,而我要修改的变量是一个private的,redefineClass不能修改函数的签名,即不能增加一个方法来操作这个private变量;

再后来我又绕过了,可以修改了,但是又发现我的判断条件位于上一层,而这个类的实例中所有变量都无法判断我要执行的修改逻辑。。。。

越看问题越多,要修改的逻辑也越多;

同时程序中本身会打印日志,我修改了字节码,那他的日志中打印的行数也会有问题。。。。感觉爆炸了,最后想到通过修改jdk来实现java逻辑的修改。

jdk修改:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

为了修改这个,大概了解了下一个实例在内存中的分布以及jdk的实现。

首先想到jdk的类的实现,主要通过两个类来实现,一个是oopDesc,一个是Klass;我是这么理解的,Klass代表一个类的结构,oopDesc代表一个类的实例的结构;这样把实现和实例分离开来,多个类的实例oopDesc也只需要指向同一个Klass结构,这样可以大幅节省空间;

我计划的实现hook修改某个实例的大致流程如下:

1、在实例初始化的时候获取这个实例的地址

2、通过实例指向的Klass结构,找到我想修改的这个变量或方法的偏移地址

3、根据偏移,获取我想要的变量地址

4、在需要修改的地方,修改之前获取的变量地址中的内存数据。

下面一步步来解决:

1、我想修改的是某个实例,那么就在某个实例开始的地方来hook他。实例初始化的流程大概是:

->加载一个类,也就是把dex解析为一个klass类,存储在内存中

->根据klass分配一个指定大小的内存空间

->初始化这个内存空间为一个Oop结构

->根据Klass的定义,初始化成员变量

这里,我是在第二步获取的空间,反正实现就行,后续没跟了。我是用的openjdk17,修改了位于instanceKlass.cpp的allocate_instance函数,其中的oop返回之后,根据函数的入参获取当前的klass 的name,判断是否是自己需要的klass,来定位最终的oop的内存空间

1

2

3

4

看到这里的判断逻辑,为什么我加了个长度判断,而不是直接精准匹配某个字符串,是因为这里jdk有个问题,我同样新建一个a.b.c.d的类,他这里klass的名字,有的时候是"a.b.c.d",有的时候"a.b.c.d ",tmd多了一个" ",搞了我好久!

2、找偏移,硬核可以直接jdk里面找,我反正就该一个类,所以简单点,通过开启java的配置启动项PrintFieldLayout来设置打印的,可以得到如下的内容:

  ![图片描述](upload/attach/202309/642739_8XF5TPXE9KZV77H.webp)

这里就是Person在内存中的实例,打个比方,我要修改的是b变量,位于20偏移处,这里是10进制,不是16进制

1

2

3

3、根据偏移地址找到数据。这里借助了工具jhsdb,我从官网下载的jdk里面编译出来的,都是不带这个工具的,正好还下载了graal jdk,他里面是携带的。

jhsdb启动后注入进程,看看上面这个变量的内存分布:

1

2

3

4

5

6

7

上面是实例的结构,我们想要的b,发现并不是oop的地址加上20,那这里是为什么呢?

 因为我想要获取的是一个AtomicInteger类的实例,而不是简单的int实例,存储的是指向相应的实例oop的指针,而非简单的一个int数据。

 再看看下面内存的16进制分布吧 ,2016进制是0x14,我们偏移一加,得到是0x8adade24,这里我取了四字节,是因为这里jdk采用了一个叫压缩指针的方式来存储实际的oop数据,直接使用0x8adade24 * 8 = 0x456d6f120,就是我要去的实例地址,然后再取这个AtomicInteger的数据的偏移,即可得到实际我要改的那个b的地址;

 4 、在最终要修改的时候修改。这里就是我程序的逻辑了,各不一样了

总结

1

2

这个就是最终的流程了,优势就是不改java逻辑,java程序无法感知应该

这个markdown不会插图呀。。。算了,也懒得插了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1081453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java之TCP和UDP进行网络编程

目录 一.网络编程 1.1网络编程的作用 1.2网络编程的基本概念 1.3网络编程的实现 二.UDP网络编程 2.1UDP数据报套的初步了解 2.2Java数据报套接字通信模型 2.3Java编程实现UDP通信 三.TCP网络编程 3.1TCP流套接字api 3.2TCP通信代码实现 3.2.1短连接实现代码 3.…

【特纳斯电子】基于物联网的指纹密码锁系统设计-实物设计

资料下载链接:基于物联网的指纹密码锁系统设计-实物设计 - 电子校园网 编号: T3732205M-SW 设计简介: 本设计是基于单片机的指纹密码锁,主要实现以下功能: 1、可通过密码解锁 2、可通过云平台解锁 3、可通过指纹解…

基于SSM+Vue的大学学术交流论坛

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

保姆式教程:MAC安装Android studio(包括安装JDK,Android SDK),解决gradle下载慢的问题

文章目录 参考文章安装JDK并配置环境变量安装JDK配置JDK相关的环境变量 Android studio 安装下载Android studiogradle下载慢解决方法 安装Android SDK选择jdk版本安装SDK并配置环境变量 参考文章 原文链接 原文链接 安装JDK并配置环境变量 安装JDK 下载地址 下载后双击安装…

Mongo

MongoDB MongoDB 基础 MongoDB 是什么? MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储…

java处理时间-去除节假日以及双休日

文章目录 一、建表:activity_holiday_info二、java代码1、ActivitityHolidayController.java2、ActivityHolidayInfoService.java3、ActivityHolidayInfoServiceImpl.java 三、测试效果 有些场景需要计算数据非工作日的情况,eg:统计每个人每月工作日签到…

拒绝求职诈骗,工作找好学会这一招!

马上又到了一年一季的秋招时期,社会险恶,投简历石沉大海;黑心企业拖欠农民工资、非法辞退或者遭受其他不公平待遇等等诸多问题。我们如何快速识别一家企业或公司值不值得入职,在众多竞争者中,脱颖而出,拿到…

如何选择一个向量数据库:Elastic Cloud 和 Zilliz Cloud 面面观

随着以 Milvus 为代表的向量数据库在 AI 产业界越来越受欢迎,诸如 Elasticsearch 之类的传统数据库和检索系统也开始行动起来,纷纷在快速集成专门的向量检索插件方面展开角逐。 例如,在提供类似插件的传统数据库中,Elasticsearch …

SIP对讲应用

SIP对讲应用 SIP对讲是基于标准SIP协议进行通信的对讲设备 SIP对讲一般应用到固定点位,进行求助报警所使用的一个设备,一般会应用在银行、机场、公园,医护对讲,地铁等公共场所,一般还分为防水型对讲终端(…

SpringMVC源码分析(一)启动流程分析

a、SpringMVC 在启动过程中主要做了什么事情&#xff1f; SpringMVC在启动过程中是什么时候解析web.xml文件的&#xff0c;又是什么时候初始化9大内置对象的&#xff1f; <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xml…

Django实现音乐网站 ⒆

使用Python Django框架做一个音乐网站&#xff0c; 本篇主要为排行榜功能及音乐播放器部分功能实现。 目录 排行榜列表 设置路由 视图处理 模板渲染 设置跳转入口 播放器功能开发 设置路由 模板页面 脚本渲染 列表渲染和播放器实现 音乐播放器列表展示关闭 总结 排…

U3d力扣基础刷题-2

移除元素 public int RemoveElement(int[] nums, int val){// int j 0;// for (int i 0; i < nums.Length; i) // {// if (nums[i] ! val)// {// nums[j] nums[i];// }// }// return j;int j0;for(int i0;i<nums.Length;i){if(nums[i]!v…

关于导出的Excel文件的本质

上篇文章中提到关于xlsx改造冻结窗格的代码&#xff0c;我是怎么知道要加pane的呢&#xff0c;加下来就把我的心路历程记录一下。 我改造之前也是没有头绪的&#xff0c;我网上查了很多&#xff0c;只告诉我如何使用&#xff0c;但源码里没有针对!freeze的处理&#xff0c;所以…

有效回收组分含量

声明 本文是学习GB-T 42944-2023 纸、纸板和纸制品 有效回收组分的测定. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了纸、纸板和纸制品中有效回收组分的测定方法。 本文件适用于各种纸、纸板和纸制品&#xff0c;也适用于铝箔…

单目标优化算法:墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)求解23个函数MATLAB

一、墨西哥蝾螈优化算法 墨西哥蝾螈优化算法&#xff08;Mexican Axolotl Optimization&#xff0c;MAO&#xff09;由Yenny Villuendas-Rey 1等人于2021年提出&#xff0c;该算法具有较强的平衡全局搜索与局部搜索能力。 参考文献&#xff1a; [1]Villuendas-Rey, Yenny, Jo…

Apollo源码

目录结构介绍 cyber 消息中间件&#xff0c;替换ros作为消息层 data 地图等生成好的数据放在这里&#xff08;其他数据待补充&#xff09; docker 容器相关 docs 文档相关 modules 定位&#xff0c;预测&#xff0c;感知&#xff0c;规划等自动驾驶模块 scripts 脚本 third_p…

工学云打卡签到自动实现关于异地时定位的问题解决|蘑菇钉

工学云打卡助手&#xff0c;能解决你在异地时每天不间断签到的问题&#xff0c;仔细看图哦 1.自动签到 2.自定义打卡地区 3.生成日周月报与总结自动发表 4.支持随机通用内容 5.支持打卡结果推送 你是否曾经因为缺乏自律而无法坚持学习目标&#xff1f;是否曾经因为无法衡量…

WorkPlus一站式解决方案,助力企业构建统一门户系统

在信息爆炸的时代&#xff0c;企业管理面临着海量的数据和各类业务应用的复杂性。如何实现信息的井然有序、高效管理&#xff0c;成为企业发展的关键。WorkPlus作为领先的品牌&#xff0c;致力于打造统一门户系统&#xff0c;为企业提供全方位的服务和解决方案。本文将以知乎的…

Java实现B树

1.介绍 B树是一种自平衡的搜索树数据结构&#xff0c;常用于数据库和文件系统中的索引结构。它具有以下好处和功能&#xff1a; 高效的查找操作&#xff1a;B树的特点是每个节点可以存储多个关键字&#xff0c;并且保持有序。通过在节点上进行二分查找&#xff0c;可以快速定位…

使用PyTorch处理多维特征输入的完美指南

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…