挂钩 Java API

逆向工程 爪哇 函数挂钩
2021-06-10 08:35:06

在 windows 上的本机代码中,可以通过用JMP指令替换它们的序言来挂钩

有没有办法对用 java 编写的应用程序做类似的事情?最后,我想记录发送到/从javax.net.ssl.SSLSocket.

我无法修改磁盘上的 jar 文件或 jre,因为如果散列不匹配,它会保释,但我可以在运行时从本机代码挂接任何函数。

我现在有一个可行的解决方案,但它非常混乱而且不那么灵活。我正在挂钩JNI_CreateJavaVM并插入-Djavax.net.debug=all传递给它的参数。这会导致通过套接字发送的所有数据都被写入磁盘,然后我WriteFile在它被写入磁盘之前挂钩以拦截该数据。

我发现了一些看起来与我想要的-javaagent参数很接近的东西,但是当我的代理加载时,所有的 java 标准库都加载了,所以我看不到使用代理挂钩它的方法。

2个回答

编辑:这个问题与动态 java 检测重叠

Jeong Wook Oh 在 Blackhat 2012 上做了一个演讲,他解释了如何通过修改字节码来调用钩子方法来跟踪 Java 程序,请参阅论文的“自动化”部分。据我所知,没有可用的来源或工具。

还有一个叫做Javasnoop的工具是可用的,我没有测试。它使用“Attach API”来监控 API 调用。对于您想要做的事情,这种方法似乎更清晰。

我以前在工作中使用过 javasnoop。使用 AspectJ,也有一个学习曲线,但它绝对是您的正确解决方案。