目前实现了通过JNI、JVMTI和反射来动态注入客户端,客户端功能的部分还只写了最基础的
该项目使用由我修改的ForgeGradle以支持Gradle 6+(暂不支持7+),但由于ForgeGradle用了Pack200等在新版本JDK被删除的功能,目前请继续使用JDK1.8,否则可能出现错误
首先通过HookLib2来Hook LWJGL的Native库(LWJGL.dll)以插入代码来实现通过LWJGL的Native的JNI环境来定义代码(用于绕过检测,直接Hook JVM容易寄),然后通过JVMTI调用客户端启动方法,实现启动客户端
客户端根据游戏环境自动识别版本并使用对应的混淆表,然后反射来实现动态Hook MC的Class/Method/Field。再通过加载Native-Transform来实现对MC的Class的字节码编辑
Native-Transform的基本原理通过JNI来Hook Java代码中定义的ClassTransformer类中的方法,方法实现了对传入的字节码进行修改(使用ASM)并返回修改后的字节码,随后通过JVMTI对方法进行调用,调用后再通过JNI把返回的字节码应用到MC中,实现动态更改Class的效果
./gradlew setupDecompWorkspace
首先将Client.kt
中的developEnv
设置为false,随后进行构建
./gradlew build
# This is a Powershell Script
cp -Force build\libs\lycoris-1.0.jar Lycoris-Loader
java -jar ./Lycoris-Loader/JavaDllPacker.jar ./Lycoris-Loader/lycoris-1.0.jar
cp -Force classes.h Lycoris-Loader/Lycoris-Loader/
Lycoris-Loader依赖HookLib,项目内有由MSVC(v143)的debug模式编译的.lib文件,如需其他编译环境请自行编译
# This is a Powershell Script
rm ./classes.h
rm ./Lycoris-Loader/lycoris-1.0.jar
rm ./Lycoris-Loader/Lycoris-Loader/classes.h
javac -sourcepath .\src\main\java .\src\main\java\rbq\lycoris\agent\instrument\impl\InstrumentationImpl.java
javah -jni -sourcepath .\src\main\java rbq.lycoris.agent.instrument.impl.InstrumentationImpl