Адреса для данных (в данном случае, для Hello, world! и Another string.) резервируются в процессе компиляции и предполагается, что они не могут быть изменены, т.к. они используются в коде. Как видим, первая строка отделена от второй строки нулевым байтом, и если мы заменим его на пробел, то при обращении к первой строке будут выведены обе строки (!!!). Здесь и просматривается правило ненарушения размера.
Однако это правило можно обойти, если в коде, ссылающемся на строку, изменить адрес этой строки. Например, если в русской версии эта строка больше на 2 символа, то при локализации нужно записать эту строку на 2 символа раньше (но так, чтобы она не пересекалась со строкой перед ней) и в коде, ссылающемся на эту строку, уменьшить адрес на двойку.
Другой темой является поиск адреса, ссылающегося на эту строку. Но это не так сложно. Зная адрес первого символа строки можно запросто найти участок кода ссылающегося на этот адрес. Для этого нужно воспользоваться следующим правилом:
Адрес строки нужно дополнить четверкой, которую нужно поставить на чётную позицию (позиция отсчитывается слева, с единицы): 5DAB8 — 45DAB8.
Разбейте адрес строки (45DAB8) в шестнадцатиричном виде по 2 числа (45 DA B8) и запишите полученный список в обратном порядке (B8 DA 45) и дополните нулями до восьми знаков (B8DA4500).
Теперь попробуйте поискать получившееся число (B8DA4500) по всей программе. Найденное вхождение, а их может быть несколько, и будет ссылкой из кода на нужную нам строку. В случае чего, эту ссылку можно подкорректировать.
Еще ближе к практикеКогда-то мне довелось перевести Valve Hammer Editor (VHE) на русский. А "зашитых" строк там было полно. Вот так я и научился совершать перевод.
Итак, для примера нам понадобится WinHex и VHE 3.5. Сначала нужно выполнить перевод PE-части. Есть немало сторонних программ, с помощью которых можно с лёгкостью это сделать. После этого вы сможете увидеть, какая часть интерфейса осталась нерусифицированной, скорее всего, она и будет внутри кода.
Находим какую-нибудь строчку на английском, которая на русском будет длиннее.
Например, Lift — в данном контексте Подъём, Установка, Переключение на текстуру.
Открываем в WinHex исполняемый код VHE. Ищем "Lift", но таких адресов есть несколько. Выбираем именно тот, где фраза окружена нулевыми байтами — адрес D3978.
Теперь ищем ссылки на эту строчку: Ctrl+Alt+F, ищем число 78394D (переделанный по правилу адрес). Оно нашлось по адресу 1А112. Это значит, что код из этого места ссылается на данные по адресу D3978. Меняем 78 на 77.
Такая замена означает, что строчка должна начаться на один символ раньше. Теперь "Lift" меняем на "Подъём", но запись начинаем с одного символа раньше.