【观架构】JVM应用Hook思路小结

833 阅读4分钟

A、婆姐IDEA(java GUI)的思路流程

首先,咱们认识到IDEA(jet brain)是java 应用。

一般我们提及的java应用,都暗指java web应用,因为这也是java 应用的主要开发目标。

此外,通过java.awt 包(布局管理器)、javax.swing 包(提供各种UI组件)、java.awt.event 包(GUI事件处理),java也可以开发桌面应用,比如我们常用的jet brain IDEA、Final Shell等。

既然是java应用,必然涉及jvm运行class文件和字节码文件的过程,在java运行过程中,通过jvm提供的潜在hook方式,针对性“移花接木”就是有可能。

故,婆姐java GUI的基础思路就是从jvm基础机制入手,分为:

1、【收集信息】嗅探java GUI 厂商注册码接口,嗅探内存中核心判断值。

2、【实施修改】使用javaagent 虚拟机层AOP hook思路,要么直接修改内存中关键vip判断数值,要么直接屏蔽注册码验证了api的调用返回。

为了方便理解jvm,我们放一张,jdk 应用架构图,如下图:

ps: 其中JavaFX 据称是下一代Java GUI 构建技术,应该是更好封装了Swing AWT 技术,方便java GUI的应用开发。

B、深入了解java hook操作

任何语言都会存在hook技术的实现方式,即便是最原始的C,我们也可以通过修改截断函数指针来达成广泛意义的hook操作。(这里的hook操作,很多时候被翻译成钩子技术,启示从实质内容组成意义上来理解,应该将钩子理解成“截断调用”)

实现java hook,常见对java 字节码进行操作,达到修改数据(变量、函数地址)的目的。常见的Java字节码操作框架有BCEL、CGLIB、ASM、ByteBuddy、Javassist等。

如果要对一个java GUI 实现hook,可以通过javaagent 配置来实现jvm实例运行前的控制。实现一个Java Agent程序不难,只需要了解一些机制和内部原理。主要是java.lang.Instrument包,这是JDK5后引入的,它把Java的instrument功能从本地代码中解放出来,使之可用Java代码的方式解决问题,有了Instrument包,开发者就能实现更为灵活的运行时虚拟机监控和Java class操作了。这样的特性实际上是提供了一种虚拟机级别支持的AOP实现方式。

为了方便理解jvm运行过程,下图是一个jvm 内部结构图:

C、实现方案分析

网上有一位“知了”大佬,经常分享idea破解工具,上一个工具是 IDE Eval Reset,gitee上源码已经关闭了,推测应该是修改存放试用期天数的数值变量。

这一次的工具叫ja-netfilter(zhile.io/),通过截断正常注册流程来屏蔽IDEA的注册认证步骤。

知乎有一篇分析了ja-netfilter原理(zhuanlan.zhihu.com/p/494706735)。写的挺好。细节放在hook细节,对于具体实现有好处。但在这里我们想抓主要思想。所以,在这里只从整体架构图上进行解剖理解。

ja-netfilter 实现架构图

实现一个java agent 步骤

1、编写premain函数。使用java.lang.instrument进行class的操作,如上图中5种插件就是针对不同class进行操作实现。

2、修改MANIFEST.MF文件。修改相关配置信息。

3、构建出jar-agent包。

上面最重要的就是使用java.lang.instrument对目标class进行操作。纯手工使用instrument,就会比较生硬,在这个层面就有几个第三方库可以大显身手了,就像上方提到的ASM、Javassist、ByteBuddy。ASM是个底层的框架,功能强大;ByteBuddy依赖ASM,用法较简单;Javassist则简单方便,依赖较少,使用者不需要深入了解Java字节码的知识。

比如,基于instrument+ByteBuddy的操作,可以实现上图几个插件的功能:

1、url模块,该模块目标就是对某些url规则进行操作。诸如实现fake json数据返回之类。(欺骗idea,服务器已经授权啦)

2、dns模块,概模块目标是对dns进行欺骗,比如返回host不存在,或者返回伪装的服务器地址(破解作者自己的服务器)

3、power模块,这个模块在ja-netfilter则用于修改 method 的入参值和返回值。这种欺骗用在非对称加密算法的验证上会非常受用。

4、hideme模块,用于屏蔽class的反射功能,欺骗idea,当前jvm实例不存在敏感的破解类工具的class name。

5、mymap模块,这个比较简单,就是用于更改map的键值对。

具体实现,这里忽略,只抓住主要思想。主干破解java GUI 的概略思路出来后,若有心有时间即可动手去分析某些java GUI 。当然,破姐主要困难不在于工具🔨的使用,而是追踪出哪个是可以敲打的钉子。在破解过程中,有个清晰脉络,亦能事半功倍。

破解主要难点不在于使用这些hook技术。而在于分析出原java GUI 开发人员使用的加密心思和验权技巧。这点就需要相关解剖经验支持,也消耗较大耐心能量。