【问题标题】:How can I clear a string from a Java program's memory?如何从 Java 程序的内存中清除字符串?
【发布时间】:2017-09-11 02:23:03
【问题描述】:

我正在尝试学习 JVM 附加。我已经学会了如何将代理附加到 JVM,并且一切正常。我的问题是,附加后是否可以从目标内存中删除字符串?如果您使用 Process Hacker 2 搜索 .jar,您可以在内存中找到它的路径。例子:

我见过做类似事情的程序,比如 LSquad(这是一个用于清除 Minecraft hacks 字符串的程序)。我尝试使用 Luyten 对其进行反编译,发现它使用了外部 DLL。可以用原生java做吗,还是需要外部库?

【问题讨论】:

  • 您可以通过不再引用该字符串来删除该字符串(并执行 GC,很可能需要完整的 GC)
  • @PeterLawrey:但你怎么知道它也已从字符串池中删除/gc'd?
  • 会在代理帮助中执行 System.gc() 吗?
  • @HovercraftFullOfEels 进行堆转储并查找字符串。
  • 对敏感数据使用 char 数组。

标签: java jvm


【解决方案1】:

您可以通过不再引用该字符串来删除字符串或任何对象(并执行 GC,很可能需要完整的 GC)

在您的情况下,突出显示的字符串用于 jar,您很可能需要卸载该 DLL 以释放它。 (我不知道在 JVM 中是否或如何做到这一点)

【讨论】:

  • 它实际上不是一个.dll文件,它只是一个.jar文件,其中包含一个Main类和Agent类。代理类通过创建一个新的 VirtualMachine 加载到 JVM 中,该虚拟机附加到目标,成功加载后将分离。不过我不知道如何卸载该类
  • @TsvetomirBonev 要卸载一个类,您需要卸载加载它的 ClassLoader(以及对该 ClassLoader 加载的任何实例的所有引用)
  • 你能给我举个例子吗?我在 Java 方面没有那么经验丰富(这可能很明显)
  • @TsvetomirBonev 很可能,有一种更简单的方法可以实现您想要实现的目标。例如卸载类的最简单方法是重新启动 JVM。
  • 我见过其他人在做类似的事情,实际程序并没有关闭但它会重新加载,我可能会尝试查找如何做到这一点。
猜你喜欢
  • 2015-11-22
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多