Сигнатура у разных файлов будет всегда такая?
Насколько мне удалось это проверить, используя разные архиваторы ZLIB, то сигнатура одна и та же, только в зависимости от реализации компоновки архива, заголовок файла с данными о архиве, может размещаться или в начале файла перед сигнатурой 78DAEC, или в конце, после потока данных архива. Каждый автор архиватора делает это по разному. Вот к примеру архиватор Simplyzip http://www.paehl.de/cms/simplyzip.
А не пробовали визуально в HEX-Редакторе найти окончание архива, может там идет какое-нибудь разделение в виде кучи нулей?
Да посмотрите сами в НЕХ-редакторе, адреса начала и конца я указал выше для SysTracer v2.6.0.59. Но это же частный случай. В другой программе будет все по-другому. Наработок в этом направлении у меня ещё нет.
А разве в zlib'е не надо знать ключ, по которому строится алгоритм сжатия?
Конечно же надо! Но какие ключи использовал автор, известно ему одному. Из спецификаций архиватора ZLIB известно, что он поддерживает сжатие по трем алгоритмам: No - без сжатия, Default - по умолчанию, Maximum - максимальное. Но там еще есть куча ньюансов по использованию таблиц Хаффмана для оптимизации. Изучать всю эту билитристику плюс программирование на С/С++ только для того, чтобы перевести одну программу - мне жизни не хватит. Я иду простым путем. Распаковал поток - получил файл. Потом запаковал его обратно по трем алгоритмам сжатия. Архив получился идентичным исходному при сжатии "Maximum". Потом от балды изменил в несжатом файле в НЕХ-редакторе один байт и снова запаковал - размер архива увеличился на 2 байта. Изменил два байта - увеличился на 4 байта. Изменил 3 байта - на 6 байт. И т.д.
Потом просто в НЕХ-редакторе нашел строку "How to use" и перевел так "Как исполь". Сохранил изменения и запаковал файл - его размер получился на 22 байта больше оригинального. Отбросил эти 22 байта и вставил в SyaTracer.exe на место исходного потока. Сохранил изменения и запустил файл.
Делаю вывод: направление решения задачи правильное. Но переводить в НЕХ-редакторе мне не улыбается, тем более хотелось бы сделать это по человечески, без сокращений. Извлек оверлей. Открыл в текстовом редакторе и вместо фразы "How to use" написал "Краткое руководство". Сохранил изменения в файле. Прицепил к файлу библиотеки и запаковал её ZLIB. Размер файла стал еще больше. Но я отбросил лишнее в Нех-редакторе и вставил в SyaTracer.exe. Сохранил и запустил. Программа не запустилась и сообщила обшибке. Возможные причины ошибки: 1) отброшенная часть архива оказалась важной и 2) данные в файле оверлея поделены на блоки через разделитель 00. Фраза, которую я перевел "How to use", содержит 10 символов (10 байт), а на русском "Краткое руководство" содержит 19 символов. Делаю вывод, что последующие блоки из-за увеличения длины строки сместились на 9 байт. Делаю предположение, что программа обращается к оверлею не полностью, а только к его частям, поэтому размещение блоков в оверлее очень важно! Чтобы проверить это, в тексте (в первом предложении после строки "How to use") удаляю 9 символов (что равноценно 9 байтам). Сохраняю файл оверлея, цепляю его к файлу DLL, пакую его архиватором. Отбрасываю не помещающиеся байты и вставлю данные в SyaTracer.exe на место исходного потока. Сохранил изменения и запустил файл.
Как видите из скриншота программа запустилась и надпись нормально отображается в окне программы. Отсюда я делаю вывод, что таки ДА, размещение блоков в файле оверлея очень важно. Программа как-то к ним обращается. Поэтому и спрашивал как можно узнать эти адреса и изменить их, чтобы не мучаться с подгонкой текста. Если это нереально, то тогда можно попробовать сделать перевод так, что размер блоков остался без изменений.
Другой вопрос, в том, что архив получается неполным, чтобы вставить его в файл. Как это скажется на дальнейше работе программы, фиг его знает. Поэтому спрашивал, как можно перенести данные архива в конец файла.