我的世界 vape 是什么原理?
的有关信息介绍如下:
~-- 二更 --
原理在最下面初始答案,
自己尝试做了一个VAPE,使用FMLCorePlugin做的
链接:https://pan.baidu.com/s/1PDzP_RUOuAIEZAfP4kQiEQ 提取码:vd6x
包含成品,源代码。
编译出的 Vapu-1.0.jar 本身是mod,可以直接放入mods文件夹加载,也可以使用 Launch.jar 将其作为代理注入到已经启动的minecraft进程。
顺便说明,对于修改class,正常的FMLCorePlugin在开发环境是修改反混淆后的,比如,类的字段名字是 net/minecraft/client/EntityRenderer/renderHand 这样,而生产环境是 notch 格式,比如,bfk/C,但游戏启动后,注入代理修改class格式又是 srg 格式的,比如,net/minecraft/client/EntityRenderer/field_175074,这样编写 transform 时要考虑3种情况就很头疼,所以此mod修改了tweaker加载顺序,详见 ProductPlugin.java、ModList.java,将 LaunchClassLoader 的 transforms 这个List改成自己的List,保证自己的 ClassTransformer 位于 其他 Transformer 后面,模拟了运行时注入的情况(其他Transformer应该都应用了才轮到自己的ClassTransformer修改class)。这样就不用考虑 bfk/C 这种notch格式的情况了。
-- 一稿答案 ---------
使用了JVM 的 ATTACH 机制和 java agent 功能。
我的世界是JAVA编写的游戏,使用JVM(JAVA虚拟机)运行。而JVM提供ATTACH机制允许在运行时访问JVM并通过Java agent修改加载的class和调用某些方法。
比如,Reach 长臂猿是把加载了的 PlayerControllerMP.class 的 getBlockReachDistance() 方法修改,本来是:
改成:
方块破坏距离就拉长了。
又比如,反隐身是修改 EntityPlayer.class 的 isInvisbleToPlayer(EntityPlayer player),这个实体是否对某 player 不可见:
把这方法体直接改成:
就是反隐身。
至于如何实现修改,Vape是attach上游戏进程后,加载java-agent.jar(文件名可以叫其他),jvm会加载java-agent.jar 中指定的agent类,调用其agentmain方法,传入instrumentation 实例,然后可以通过instrumentation 获取到对应class,比如上方提到的 PlayerControllerMP.class、EntityPlayer.class,使用 ASM 动态修改方法体。
具体细节可以参考:
如果你想简单修改体验一下,可以用arthas、jbe的工具,arthas在上面的文章也有提到。
arthas可以帮你完成attach、dump(获取class文件)、redefine(加载修改后的class文件)。
修改class可以是用jbe(java bytecode editor)、dex2jar等工具。
可以参考:



