Improve launcher injection and hook reliability
Find Fabric through the render thread's class loader and make bytecode transformations safer for launcher-provided class definitions. Improve hook reporting, process-picker refresh behavior, and self-destruct cleanup; document Dawn and Lunar 1.21.11 setup.
This commit is contained in:
1 parent
38ff6d387c
commit
036b24f2ae
12 files changed
+186
-48
No files matched your search
+17
-2
@@ -16,7 +16,7 @@ The injector and library must be built for the same architecture as the target J
|
||||
|
||||
## How it works
|
||||
|
||||
1. **Injector** lists the running Fabric client JVMs, then loads the library into the chosen process.
|
||||
1. **Injector** lists the running Minecraft JVMs, then loads the library into the chosen process.
|
||||
- **Windows:** lists visible `java.exe`/`javaw.exe` windows (refreshed every 750 ms), then runs `LoadLibraryW` in the chosen
|
||||
process through `CreateRemoteThread` and confirms the module is mapped.
|
||||
- **Linux / macOS:** uses the HotSpot attach protocol (the same mechanism as `jcmd <pid> JVMTI.agent_load`). The injector
|
||||
@@ -29,7 +29,8 @@ The injector and library must be built for the same architecture as the target J
|
||||
unix, which also hands over the `JavaVM*`). The worker:
|
||||
- waits for the JVM (Windows: `jvm.dll`, `JNI_GetCreatedJavaVMs`), attaches, acquires the JVMTI redefine/retransform capabilities;
|
||||
- writes the embedded payload jar (the remapped `prestige-*.jar`) to the temp directory under `PrestigeLoader`;
|
||||
- `FabricLauncherBase.getLauncher().addToClassPath(jar)` so payload and game classes share the Knot class loader;
|
||||
- looks for Fabric through the render thread's context class loader, then the system and other thread loaders;
|
||||
- `FabricLauncherBase.getLauncher().addToClassPath(jar)` so payload and game classes share the launcher's game class loader;
|
||||
- registers `NativeBridge.classBytes` / `NativeBridge.redefine` and calls `Bootstrap.start()`.
|
||||
3. **`Bootstrap`** (Java) waits for the client window, then for every ClassTransform hook target gets the current class bytes
|
||||
(JVMTI retransform capture), runs the hooks through `InPlaceTransformer` and redefines the class. The bundled ClassTransform
|
||||
@@ -71,6 +72,20 @@ PrestigeInjector <pid> [lib path] # inject into a specific pid, optionally w
|
||||
|
||||
On Windows this is `PrestigeInjector.exe`. By default the library is looked up beside the injector.
|
||||
|
||||
### Dawn and Lunar Client 1.21.11
|
||||
|
||||
Use a 1.21.11 Fabric profile in Dawn or enable Lunar Client's Fabric add-on for 1.21.11. The target
|
||||
profile needs Fabric Loader 0.19.x and Fabric API. Wait for the title screen before selecting the game
|
||||
in the injector. The default Prestige menu key is Right Shift, which may overlap with a launcher keybind.
|
||||
|
||||
For Lunar, the native log should identify `GenesisClassLoader`. Check the game log for `hooks installed`
|
||||
and `client initialised`. Hook counts refer to classes with changed bytecode. A skipped or failed hook
|
||||
can leave its feature unavailable even if the menu opens.
|
||||
|
||||
An offline JVM replay accepted all 42 changed classes from Lunar's installed 1.21.11 cache after
|
||||
recalculating stack and local limits on the cached classes. Live injection and Dawn's in-game profile
|
||||
still need smoke testing.
|
||||
|
||||
## Install as a mod instead
|
||||
|
||||
The payload jar is also a normal Fabric mod. Put `prestige-*.jar` (from `dist/` or the CI `payload-jar` artifact) in the
|
||||
|
||||
Reference in new issue
Block a user