Как заменить строку в скомпилированном .exe?

Есть .exe файл, когда с помощью hex редактора меняю в нём строку не меняя её размер - всё нормально. Если новая строка отличается размером от предыдущей - программа не запускается. Подозреваю, что это как-то связано с выделением памяти.
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka
Токсичный шарпист
Если строка длиннее - тогда всё что находится после такой строки будет сдвинуто и тогда поедут все указатели.
Если строка короче, но ты не удалял байты, а просто занулил их - должно работать, но может быть нюанс:
1. Строка может храниться не просто как её байты, а как длина + байты. Тогда тебе длину тоже надо поправить (например если это не си, где строки нуль-терминированные)
2. Тк строка эта константная - компилятор может при компиляции заинлайнить все проверки на длину, да и саму длину тоже.

Именно по этому нельзя менять длину строки. Ни в байтах, ни в символах.

В теории, программа может поломаться даже если ты поменяешь, например, текст на английском на текст на русском, если используется utf-8, тк разработчик, надеясь на то что строка его неизменна, может заслайсить такую строку по байтам, тк он знает точное расположение каждого символа, а после твоей манипуляции получится невалидный utf8, из-за которого может поломаться в другом месте, где эта валидность проверяется.
Ответ написан
Комментировать
freeExec
@freeExec
Участник OpenStreetMap
Можно пойти в конец секции, она для выравнивания размера забита не используемыми нулями. Либо если места не достаточно, увеличить размер секции. Затем остаётся только найти все старые ссылки на строку и поменять на новую. Возможно ещё придётся отломать защиту на проверку модификации файла.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы