Патчить апдейтер, а не только лаунчер
Вендорный 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 файлов.
This commit is contained in:
+45
-5
@@ -101,6 +101,16 @@ if ($Uninstall) {
|
||||
Say 'env убран из конфига лаунчера'
|
||||
Remove-Item $Marker -Force -ErrorAction SilentlyContinue
|
||||
Say 'маркер удалён'
|
||||
# the updater has to go back to stock, otherwise it keeps skipping app.jar
|
||||
# downloads for a launcher that is no longer patched
|
||||
$updaterExe = Join-Path $env:APPDATA 'kjstudio\updater\updater.exe'
|
||||
$updaterBackup = "$updaterExe.orig"
|
||||
if (Test-Path $updaterBackup) {
|
||||
Copy-Item $updaterBackup $updaterExe -Force
|
||||
Remove-Item $updaterBackup -Force
|
||||
Say 'updater.exe восстановлен'
|
||||
}
|
||||
Remove-Item (Join-Path $env:APPDATA 'kjstudio\updater\rsx-launcher-patch.jar') -Force -ErrorAction SilentlyContinue
|
||||
Say 'Готово. Лаунчер снова запускается как обычно.' Green
|
||||
exit 0
|
||||
}
|
||||
@@ -157,8 +167,14 @@ if ($code -ne 0) {
|
||||
Die "Патч не удался (код $code). Если лаунчер запущен с правами администратора - закрой его и повтори."
|
||||
}
|
||||
|
||||
Set-Content -LiteralPath $Marker -Value 'patched app.jar: rsx modloader' -Encoding ASCII
|
||||
Say 'маркер .rsx-patched создан'
|
||||
# the patcher writes .rsx-patched itself: it needs baseSha256 (the hash of the
|
||||
# untouched jar) so the updater hook can tell our patch from a real update
|
||||
if (-not (Test-Path -LiteralPath $Marker)) {
|
||||
Set-Content -LiteralPath $Marker -Value 'baseSha256=unknown' -Encoding ASCII
|
||||
Say 'маркер .rsx-patched создан'
|
||||
} else {
|
||||
Say 'маркер .rsx-patched обновлён патчером'
|
||||
}
|
||||
|
||||
# --------------------------------------------------------------- wire the agent
|
||||
$agentArg = "-javaagent:`"$ModHome\bridge\rsx-bridge.jar`""
|
||||
@@ -178,11 +194,35 @@ $check = & $java -jar $patcher showenv $Config 2>&1
|
||||
$ErrorActionPreference = $prev
|
||||
$check | ForEach-Object { Say $_ }
|
||||
|
||||
# --------------------------------------------------------------- patch the updater
|
||||
# The stock updater re-downloads app.jar, which would wipe the patch. We hook its
|
||||
# embedded jar so it keeps our app.jar and re-patches after a real update.
|
||||
$UpdaterHome = Join-Path $env:APPDATA 'kjstudio\updater'
|
||||
$UpdaterExe = Join-Path $UpdaterHome 'updater.exe'
|
||||
Say ''
|
||||
Say 'Патчу апдейтер...'
|
||||
if (-not (Test-Path -LiteralPath $UpdaterExe)) {
|
||||
Say " не нашёл $UpdaterExe - пропускаю (лаунчер сам предложит обновление)"
|
||||
} else {
|
||||
Copy-Item -LiteralPath $patcher -Destination (Join-Path $UpdaterHome 'rsx-launcher-patch.jar') -Force
|
||||
$ErrorActionPreference = 'Continue'
|
||||
$out = & $java -jar $patcher patchupdater $UpdaterExe $ModHome 2>&1
|
||||
$code = $LASTEXITCODE
|
||||
$ErrorActionPreference = $prev
|
||||
$out | ForEach-Object { Say $_ }
|
||||
if ($code -ne 0) {
|
||||
Die "Не удалось пропатчить updater.exe (код $code). Запускай лаунчер через start-launcher.cmd"
|
||||
}
|
||||
if (-not (Test-Path -LiteralPath (Join-Path $UpdaterHome 'updater.exe.orig'))) {
|
||||
Die 'Резервная копия updater.exe не создана - откатываю изменение'
|
||||
}
|
||||
}
|
||||
|
||||
Say ''
|
||||
Say 'Готово.' Green
|
||||
Say ''
|
||||
Say 'Дальше:'
|
||||
Say ' 1. запускай лаунчер через start-launcher.cmd, а не ярлыком -'
|
||||
Say ' updater.exe перекачает app.jar и сотрёт патч'
|
||||
Say ' 1. запускай лаунчер обычным ярлыком - обновления больше не сотрут патч'
|
||||
Say ' 2. жми «Играть» - появится выбор «С модами / Ванилла»'
|
||||
Say " 3. моды клади в $ModHome\mods"
|
||||
Say " 3. моды клади в $ModHome\mods"
|
||||
Say ' 4. если лаунчер всё же предложит обновление - согласись, патч применится сам'
|
||||
Reference in New Issue
Block a user