如何才能找到正在运行的java程序在内存中存储正在运行的字节码?我很欣赏这可能会或可能不会令人难以忍受。寻找字节码
寻找字节码
回答
看的源代码的本机函数java.lang.ClassLoader.defineClass1(String, byte[], int, int, ProtectionDomain, String, boolean)
这是一个VM specfic,所以没有通用的解决方案。
如果您想查看字节码,只需将该类加载为资源(例如getClass().getClassLoader().getResourceAsStream('java/lang/String.class')
)并使用类似ASM或类似工具分析该流。
如果您想在运行时修改字节码:祝您好运。虚拟机已经针对这种攻击进行了强化,所以即使你能够获得内存位置,也有可能发生这种变化。
请注意,调试器不会修改内存,它们使用特殊的类加载器(或内置的类加载器的功能)在IDE中更改源代码时有人要求类时返回不同的结果。但是这是有限的。例如,一个虚拟机在类加载一次后不能更改方法的数量和/或参数。
嗯..我不需要这个在我自己以外的任何机器上工作,真的。有没有一个JVM,我可以叉/扩展来允许这个? – providence
当然:http://openjdk.java.net/ –
您可以尝试使用调试器运行jvm,然后在加载类后立即在分配的内存中搜索字节代码模式,该模式可以在加载的类文件中找到。
jvm可能决定及时编译字节码,然后它可能决定释放为字节码分配的内存(因为它不再需要)。所以你可能会也可能不会在内存中找到字节码。
是否可以采用相同的方法开发调试工具以在调试模式之外访问这些内容? – providence
当JVM读取字节码时,它会多次处理它,直到它最终生成本地代码(它可能会执行多次)。尝试查找某处是存储字节码并更改它可能不会做任何事情,因为它可能不直接使用字节代码(甚至不保留它)
如果您想要更改字节代码,建议您在加载之前检查它,或者使用Instrumentation旨在改变字节码,并在这种情况发生时触发正确的行为。
字节码实际上是用,也不能保证它意味着什么真机(这是你所看到的“C”级)
数据+数据结构(可以说是一个数组)的字节码表示如何传递到正在运行的程序中?这些表示是否可以在运行时从外部生成并从外部传入? – providence
@providence:对此 –
@providence打开一个新问题,执行此操作的方法是按照我的建议进行更改。你采取的方法极不可能工作。 JVM在运行时会执行大量的优化,并且代码的概念远比您所认为的更流畅。 –
- 1. 字节/字寻址
- 2. 在Python中找到更好的代码寻找环节
- 3. 寻找数字
- 4. 码头 - 寻找EOF
- 5. 寻找PRNG,你可以用任何数字字节种子
- 6. 寻找从字典
- 7. MIPS可以字节寻址
- 8. 寻找与严重= XC1急性= XC2变音符号的单字节编码= XD0
- 9. 动态寻找条形码
- 10. 寻找代码定制
- 11. 寻找编码的类型
- 12. TSQL - 寻找代码澄清
- 13. 代码寻找游戏02.05
- 14. 寻找铬的源代码
- 15. 寻找部署PHP代码
- 16. 寻找Angular2类源代码
- 17. 寻找免费节点和詹金斯
- 18. 寻找叶节点的数量
- 19. 寻找page_stories_by_story_type的类型细节和page_consumptions_by_consumption_type
- 20. 递归XML步行寻找空节点
- 21. Python minidom寻找空的文本节点
- 22. XML - 寻找穿越给定节点
- 23. c#xml寻找标题为/的节点
- 24. 为什么字节寻址内存而不是4字节寻址内存?
- 25. 寻找GSM 7bit编码/解码算法
- 26. 问题:FFMPEG寻找av_seek_frame使用字节位置
- 27. 字寻址和字节寻址的区别
- 28. 寻找数字的力量
- 29. 寻找替代关键字
- 30. 寻找一个字符串
字节代码存储在.class文件。你具体是什么意思? – AlexR
当程序运行时它从磁盘加载到内存中,不是吗?如何找到存储在这个'.class'文件中的字节码? – providence
看来你并不是在问你的“真实”问题。你想解决什么问题?如果你想拦截类加载,可能会有更好更简单的解决方案。 – AlexR