This repository has been archived on 2026-10-17. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
rsx-modloader/profiles/latest.rsxp
T
SashegDev 9f43d35f44 Патчить апдейтер, а не только лаунчер
Вендорный updater.exe перекачивает app.jar, и патч лаунчера после этого
стирался. Теперь патчится и сам апдейтер: в его payload (jar, пришитый к
PE-заглушке Launch4j после offset 65024) вставляются два хука.

- UpdaterGui.runLauncher -> beforeLauncher: перепатчить app.jar перед стартом
  лаунчера, если апдейтер достал его из своего кэша.
- DownloadEngine.findFilesToDownload -> filterUpdates: убрать app.jar из
  скачивания, но только если хеш манифеста равен baseSha256 из .rsx-patched.
  Другой хеш означает настоящее обновление, и файл качается как обычно.

Хук сделан обёрткой вокруг findFilesToDownload, а не правкой call site: у
invokespecial получатель лежит под аргументами, и замена вызова ломала стек.

Ещё лаунчер при старте чинит свой updater.exe (jb -> l качает "updater.exe"),
из-за чего хук жил ровно один запуск. Этот путь закрыт третьим guard.

Ещё:
- .rsx-patched теперь пишет сам патчер: baseSha256 нужен фильтру, чтобы
  отличать наш патч от настоящего обновления.
- patchupdater идемпотентен и берёт pristine-копию из updater.exe.orig.
- Перед записью payload проверяется загрузкой классов.
- Установщик патчит апдейтер, а uninstall откатывает и его.
- Маркер и log больше не прибиты к %APPDATA%\kjstudio: папки выводятся из
  расположения апдейтера.

Проверено на живой установке два запуска подряд: хук выживает, app.jar
остаётся пропатченным, updater качает 0 файлов.
2026-10-17 01:48:24 +03:00

28 lines
1.4 KiB
Plaintext

rsxprofile 1
build 9ad8c4aac5d835fc 9ad8c4aac5d835fc38f68d0648ffd67c809f8342e88b9636ee36205f8f96bf35 3759 7695 59020857 1792011090
loader ilxq super special.Main
patch.a2 wsygzaib joml.fastmath
patch.a6 pvdafug snooper pC
class net.minecraft.client.Minecraft wwk
field net.minecraft.client.Minecraft player zb Lwpqgx;
field net.minecraft.client.Minecraft world ta Lwwhgz;
field net.minecraft.client.Minecraft currentScreen S Lbsh;
field net.minecraft.client.Minecraft timer Zb Lmlyn;
field net.minecraft.client.Minecraft instance WA Lwwk;
field net.minecraft.client.Minecraft renderGlobal jC Ldqtrv;
field net.minecraft.client.Minecraft gameSettings y Ldmoadr;
field net.minecraft.client.Minecraft playerController fa Ltdsh;
method net.minecraft.client.Minecraft getMinecraft super ()Lwwk;
method net.minecraft.client.Minecraft displayGuiScreen super (Lbsh;)V
class net.minecraft.client.entity.EntityPlayerSP wpqgx
class net.minecraft.entity.player.EntityPlayer obzsyig
class net.minecraft.world.World oisywi
class net.minecraft.client.multiplayer.WorldClient wwhgz
class net.minecraft.entity.Entity ddvqd
class net.minecraft.entity.EntityLivingBase bgtojhxo
class net.minecraft.network.PacketBuffer dcuglw
class net.minecraft.client.multiplayer.PlayerControllerMP tdsh
class net.minecraft.client.gui.GuiScreen bsh
class net.minecraft.client.settings.GameSettings qoa
override.server catch