savetool
починка битых сейвов
CLI-утилита, которая читает бинарные сейвы старых RPG, проверяет контрольные суммы и объясняет по-человечески, что именно сломалось. Перед любой записью делает бэкап — я всё-таки учился на своих ошибках.
moth@berloga:~$ whoami
Я — Моль. Живу между терминалом и паяльником, разбираю старые игры: форматы сейвов, палитры, музыку, которую никто не трогал с 1998 года.
Не для того, чтобы «сломать», а чтобы понять, как это вообще работало, и чтобы оно снова запускалось. Заодно пишу мелкие тулзы, хожу на CTF и паяю железки, которые потом живут в ящике.
Сайт сделал потому, что надоело хранить всё это в txt-файлах на флешке, которую я уже дважды терял. Если пришёл за читами — уходи: у меня тут музей и мастерская, а не тир.
// сейчас работаю над…
обновлено: 22.10.2026
три новых формата сейвов и валидатор контрольных сумм.
412 из 700 текстур вычищены руками. глаза устали.
термопара врёт на ±3 °C. учусь её прощать.
про фиксированные тайминги в старых движках.
01 // обо мне
История человека, который однажды открыл hex-редактор и не смог остановиться.
Меня зовут Моль — не по паспорту, но уже привык. Первую игру я не «взломал», а испортил: часа два менял числа в сейве, пока она не перестала запускаться. С тех пор прошло много лет и примерно столько же бэкапов, но привычка осталась — сначала посмотреть, из чего штука сделана, и только потом трогать.
Днём — код и чужие ожидания. Вечером — стол, паяльник, старый ноутбук и один вопрос: «а почему тут 32-битное число, если хватило бы 16?». Иногда ответ приходит через три дня. Иногда через три года — когда находишь форум 2007-го с нужной ссылкой в архиве.
CTF научили главному: не бояться незнакомого кода. Там, где раньше был ступор, теперь спокойный xxd и список гипотез. Это, кстати, лучшая тренировка по безопасности, которую можно устроить себе бесплатно и никого не побеспокоив.
Ниже — принципы, которых я держусь. Они не поза, а результат нескольких неприятных вечеров.
~/private, которой нет на этом сайте.чего здесь не будет // и не проси
Есть много другого интересного: старые форматы, свои тулзы, CTF, железо. Вот это — можно и очень подробно.
02 // лаборатория
Пет-проекты, которые я делаю для себя. Все — личные и учебные: ничего чужого, ничего для распространения.
починка битых сейвов
CLI-утилита, которая читает бинарные сейвы старых RPG, проверяет контрольные суммы и объясняет по-человечески, что именно сломалось. Перед любой записью делает бэкап — я всё-таки учился на своих ошибках.
текстуры без мыла
Реставрация графики шутера 1997 года: аккуратный апскейл, вычистка артефактов вручную, возврат правильных пропорций на широких экранах. Цель не «улучшить», а привести к задуманному: чтобы было видно то, что художник рисовал.
MIDI-призрак
Конвертер музыки из старых игр в обычный MIDI плюс ручная правка банка инструментов, чтобы саундтрек звучал как в 1998-м, а не как из ведра. Делаю для себя, слушаю в плеере, ассеты никуда не выкладываю.
папка ctf/
Записки с тренировок: бинарь, немного криминалистики, иногда веб. Разбираю свои задачи и прошедшие соревнования, без спойлеров к активным. Главный вывод за два года: защита — это в первую очередь внимание.
паяльник с телеметрией
ESP32, термопара и OLED: логирует температуру жала, рисует график, ругается, если станция остыла. Корпус — фанера, саморезы и уважение к проводу. Датчик врёт на ±3 °C, поэтому проект, судя по всему, вечный.
аудит себя
Раз в месяц сажусь и проверяю свои же сервисы: обновления, сертификаты, открытые порты, бэкапы, санитайзеры по своим проектам. Итог — один markdown-файл с датой и списком «починить до следующего раза». Скучно, полезно, спасало.
Статусы честные: если написано idle — значит лежит и ждёт меня. Почти всё в лаборатории сделано ночью и на энтузиазме, как и положено.
03 // заметки
Короткие истории, мысли и разборы на уровне идей — без пошаговых инструкций. Кликни по файлу, он развернётся.
Это не заговор и не лень разработчиков. Старые игры писались под конкретное железо и искренне считали, что мир всегда будет таким: таймер тикает ровно с этой частотой, экран 4:3, звуковая карта понимает ровно один набор команд.
Дальше — три классические ловушки.
Поэтому реставрация — это чаще не «переписать заново», а «понять, на что игра рассчитывала, и вернуть ей эти условия». Скучная, кропотливая, очень уважительная работа. И, по-моему, самая интересная.
Из этой заметки вырос hd_restitch — точнее, из третьего пункта.
Короткая история. Я нашёл в сейве число, которое, как мне казалось, отвечает за золото. Изменил. Игра перестала открывать файл — молча, без объяснений, как это делают все программы, уверенные в своей правоте.
Причина оказалась обидной: в конце файла лежала контрольная сумма, посчитанная по всем байтам. Я изменил байт — сумма перестала сходиться. Формально я не «сломал игру», я всего лишь перестал проходить проверку, которую сам же и не заметил.
Хорошая новость: у меня был бэкап. Плохая: я сделал его за десять минут до этого — случайно, просто потому что копировал папку на другой диск.
Правило, которое теперь повторяю как мантру: перед любым экспериментом — копия. И ещё одна. И та, которую не жалко потерять.
Из этой истории и вырос savetool: он сначала объясняет, что с файлом, и только потом предлагает что-то менять. И, конечно, сначала копирует.
Первые два часа на первом CTF я просто смотрел на бинарник и ждал, когда меня осенит. Не осенило. Зато осенило на второй попытке, что осенять и не должно — должна быть процедура.
Ритуал простой: не пытаться понять всё сразу, а выписать список гипотез и методично их отбрасывать. Чем пахнет файл, какие строки видны, что он вообще ожидает на входе. Девяносто процентов задач сдаются не «скиллом», а вниманием к скучным деталям.
Самое смешное: после пары месяцев таких тренировок я стал спокойнее смотреть и на свой собственный код. Появилась привычка проверять края — что будет, если файл пустой, если поле отрицательное, если ровно ноль. Оказалось, что безопасность — это во многом гигиена, а не магия.
И да: соревнования легальны и бесплатны, задачи специально сделаны для того, чтобы их разбирали. Лучший вход в тему, который я знаю.
Продолжение — в папке ctf_dust из лаборатории.
Софт прощает многое: не так написал — откатил коммит, стёр ветку, сделал вид, что так и планировал. С железом так не работает. Перепутал полярность — и вот у тебя уже не датчик, а сувенир с запахом.
Зато железо честнее. Оно не притворяется, что всё в порядке. Не работает — значит, что-то не так, и рано или поздно ты найдёшь, что именно. Обычно на второй вечер, с фонариком и под увеличительным стеклом.
Мой счёт: три сгоревших стабилизатора, одна прожжённая футболка и один очень уставший ESP32, который до сих пор жив и работает логгером.
Люблю это за то же, что и реверс-инжиниринг: мир говорит с тобой на языке фактов, а не мнений. И если что-то не работает — это не «мне не везёт», это конкретный контакт, который надо пропаять.
Всего 4 свежих файла. Архив старых лежит в ~/notes/archive/ и ждёт, когда я его разберу.
04 // контакты
Открыт для разговоров про ретро, форматы, CTF и самоделки. Закрыт для всего, что попадает в список «чего здесь не будет».
fingerprint: A1B2 C3D4 E5F6 0708 0910 1A2B 3C4D 5E6F 7081 92A3 -----BEGIN PGP PUBLIC KEY BLOCK----- [ заглушка: ключ вымышленный, сюда ничего важного не шли ] -----END PGP PUBLIC KEY BLOCK-----