Я вообще не пойму откуда у меня компиляция происходит.
Я обновил zlib на 1.2.8 в MinGW и в PSPSDK. Компилируется всё так же нормально.
Но пробовал переименовать zlib.a и zlib.h - всё равно компилируется нормально. Что за чудеса?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Ну вот тогда, нашёлся здесь: C:\cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\lib
Кстати, разработчики игры Astonishia ведь как-то ужали так сильно файл в GZ какой-то библиотекой, значит должно ужаться с совместимостью.
Короче, тут дело в сжатии. Он просто не может сжать файл до исходного размера, как он был сжат ранее, поэтому сжимает и потом ищет не среди psp_header по размеру файла 0x28, а по размеру архива из KIRK-заголовков, продублированного в 0x70 в кирке (0xB0 в psp_header):
krawSize - это и есть размер архива, записанного в kirk_header по адресу 0x70.
Поэтому, даже если размер ELF >= размера в psp_header, то он берёт нужный хедер, но, если после сжатия размер архива не подходит к kirk_header, то он по списку ищет следующий подходящий по размеру среди kirk_header-ов.
Другой вопрос - действительно ли он ищет по порядку в списке или всё-таки из всего списка выбирает наиболее подходящий?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 02.05.2013 в 06:27.
Насколько знаю, архиватор 7-Zip всегда сжимает в правильный GZIP с любыми настройками сжатия, поэтому провёл ещё эксперимент...
Отключил в PrxEncrypter сжатие в GZIP /* закомментил */
Подключил внешнее сжатие через 7-Zip по максимуму (-mx=9 -mfb=128 -mpass=10 - Ультра)
Кидаем декриптованный ELF (DATA.PSP) в папку и запускаем SIGN.BAT - файл сжимается через 7-Zip и подписывается.
Собственно ELF Astonishia подписалась своим собственным заголовком и прекрасно функционирует на оффпрошивке.
Причём энкриптер по прежнему автоматом сам добавляет нули к архиву до размера в кирке 0x70.
Но есть одно но, т.к. мы подсовываем Энкриптеру готовый архив, предварительно прогнанный через 7-Zip, то к ELF-файлу нули не добавляются до размера 0x28, потому что он заархивирован ))) У Astonishia ничего добавлять не нужно, т.к. ELF уже имеет нужный размер к своему же заголовку.
Поэтому, если мы берём декриптованный файл меньше указанного в заголовке, то сначала добиваем его нулями, а потом кидаем для сжатия и подписи.
Так же чётко подписался архив "Cube Sample", предварительно конечно добитый нулями до указанного в заголовке размера в 0x28.
Можете сами потестить, всё в архиве заготовлено.
Как можно подключить библиотеки 7-Zip к исходникам? И где их ваще взять?
Кстати, Zlib в SDK лежит версии 1.2.5, а на оффсайте уже zlib 1.2.8 (April 28, 2013)
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 01.05.2013 в 09:30.
мусор при запаковке победил
интересная вещь, последние 4 байта декриптованого стаффа не нули.. что же они значат?
/upd
Очень интересно. Хедеры подбираются по 0x70 оффсету в Kirk хедере. В нем хранится размер закриптованого DATA.PSP.
Этот оффсет с выравниванием и поправками (хз зачем, но получается верно) сравнивается с размером считанного elf и подбирается подходящий хедер.
Я вот не пойму почему размер ELF меряется с размером криптованого файла?!
Последний раз редактировалось frostegater; 03.05.2013 в 17:36.
/upd
Очень интересно. Хедеры подбираются по 0x70 оффсету в Kirk хедере. В нем хранится размер закриптованого DATA.PSP.
Этот оффсет с выравниванием и поправками (хз зачем, но получается верно) сравнивается с размером считанного elf и подбирается подходящий хедер.
Ну так я об чём писал здесь и здесь и ещё одну строчку здесь.
Я уже по нескольку раз здесь переписал диссертацию, а вы по ходу её не читали
Сообщение от frostegater
интересная вещь, последние 4 байта декриптованого стаффа не нули.. что же они значат?
Они не всегда 4 байта. Это зависит от размера архива. При архивировании архив забивается нулями по размеру 0x70 в кирке и в конец добавляются какие-то байты, я встречал до 8-ми байт. Скорее всего контрольные суммы блоков.
И потом, после подписывания ты наверное проверяешь и декриптуешь. Но декриптер тебе выдаёт уже разархивированный файл, поэтому сам архив ты не видишь, как он выглядет внутри и сколько места занимает. Я уже писал вот здесь (Ликбез №2), что лучше в исходниках PrxDecrypter (не путать с Энкриптером) пофиксить расжатие 1F8B и он не будет разархивировать, а только декриптовать. Тогда ты сможешь подсмотреть, как сжимает Энкриптер в архив, сколько места занимает, на сколько добиватся нулями и что дописывает в конце. Конец архива GZ найдёшь по размеру декриптованного файла. - Поэтому я и говорю, что Astonishia Энкриптер не в состоянии ужать до исходника.
Сообщение от frostegater
Я вот не пойму почему размер ELF меряется с размером криптованого файла?!
Я думаю, что он сначала ищет по psp_header, затем проверяет по kirk-header, если кирк не подходит, то он снова отправляется в поиск по psp-header. То есть зацикленный круг, пока не сойдётся. Я тоже сначала полумал, с какой стати он из обработки кирка начинает искать в psp-header.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
ErikPshat, ну дак ты пишешь жидко, среди твоего рассуждения истину искать что иголку в стоге сена.
Для начала нужно устроить мега-компрессию. 7-zip юзает стандартную zlib библиотеку. Я нашел объявление функции сжатия:
ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
int level,
int method,
int windowBits,
int memLevel,
int strategy));
method
The method parameter is the compression method. It must be Z_DEFLATED in this version of the library.
windowBits
The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead
windowBits can also be –8..–15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value.
windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32.
memLevel
The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel.
strategy
The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications.
у нас стоит
deflateInit2(&strm,
9, // максимальный насколько я понимаю
Z_DEFLATED, // метод DEFLATED он в этой либе такой всегда
15+16,
8, // это размер памяти который будет выделен на внутрение операции (в уровнях, 8 по дефолту)
Z_DEFAULT_STRATEGY // алгоритм сжатия
);
Скажи мне какие параметры должны быть для максимального сжатия? Вроде они такие как и должны быть.
frostegater, да, я уже 100500 раз перечитыл исходники, изучил метод компрессии zlib
К сожалению тут всё выставлено на максимум и алгоритм deflateInit2 самый расширенный, поэтому не знаю даже куда копать.
Можно ещё memLevel=9 выставить, он у меня так и проставлено, но это на большее сжатие вроде не влияет.
Единственно тут не хватает сжатия по словарю, как в 7-Zip:
Changes in 1.2.5.2 (17 Dec 2011)
- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw)
- Add deflateResetKeep and fix inflateResetKeep to retain dictionary
- Fix gzwrite.c to accommodate reduced memory zlib compilation
Кстати, выше я скомпилировал zlib-1.2.8 для Win32, а оказывается нужно было под Unix, но у меня так выползает непонятная ошибка. Поэтому выкладываю zlib-1.2.7
Может как-то подключить либу 7z?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
После подписи Astonishia виснет на Now Loading, не вырубается.
Значит она запускается и это нормально. Просто с Астонишией должен в комплекте быть ещё один файл ресурсов "ASTO.DRM" (15 Мб), который она должна запускать. У тебя его по видимому нету. Хотя у меня оригинал и с этим файлом висит на Now Loading, может сам что-то не так проверял.
А сам EBOOT.PBP - это всего лишь лоадер.
Подбираем заголовок сравнивая 0x28 оффсет в pspHeader с размером исходного эльфа.
Пакуем 7-zip'ом через прямой вызов system.
Сравниваем размер архива с оффсетом 0xB0 в pspHeader. На сколько я понимаю, этот размер включает ~PSP хедер.
Если не проходит, то возвращаемся к 1 пункту.
Сделал 2 батничка на ELF и EBOOT подписывание. Только не могу все лишние exe уложить в Utils. unpack-pbp не хочет работать с относительными путями.
В общем.. доделаешь. Будет баг, стучи. http://rghost.ru/45825803
ErikPshat, ты хочешь чтобы папка создавалась с названием модуля и что с ней делать? туда DATA.ENC? Просто EBOOT создается уже батом и он не может знать названия модуля.
frostegater, ну да, туда помещать сразу EBOOT.PBP.
А через системный вызов, как 7z, разве нельзя перемещать его в ту папку, которую создали, по тем же параметрам mod_name?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
ErikPshat, да можно и нормально. Просто как-то не этично в prxencrypter пихать запаковку EBOOT. И придется дополнительные аргументы делать для ELF/EBOOT. Проще не делать совсем.
Декриптую без расжатия - получаю архив GZ (1F8B0808) = 368196 байта - внутри архива палится название temp.uncompressed
По размеру декриптованного файла 0хEF008 нахожу настоящий конец архива = 366578 байта настоящий архив.
Расжимаю в ELF = 978952 байта
Ну сжался получается прямо почти копейка в копейку. На 1618 байта меньше оригинального сжатия.
Astonishia запускается и работает замечательно!
Декриптую без расжатия - получаю архив GZ (1F8B0808) = 368196 байта - внутри архива палится название temp.uncompressed
По размеру декриптованного файла 0хEF008 нахожу настоящий конец архива = 19030 байта настоящий архив, в конце забитый только нулями, а не как было раньше - забитый остатками ELF-файла.
Расжимаю в ELF = 978952 байта, конец забит нулями очень много )))
В общем всё чётко, всё работает как надо.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 08.05.2013 в 19:41.
frostegater, ну да, я тоже подумал, что это будет лишняя морока, да и не нужно в принципе.
Кстати, в программе нет проверки на шифрованность файла.
Если я по запарке кидаю уже зашифрованный файл, то он его ещё раз шифрует и так можно до бесконечности.
Чтобы расшифровать 10 раз зашифрованный файл, приходится 10 раз его декриптовать , чтобы получить наконец-то ELF.
Короче, не хватает проверки на ~PSP.
Кстати, сегодня всю ночь посвятил к подготовке финальной сборки. И вот собрал для теста (смотри вложение)
Просто потом в батнике что-то нахимичил, всё экспериментировал, поэтому исходники не подготовил.
Нужно опять батник вернуть к нормальному виду и пора тему закрывать.
Ты хоть отвечай пошустрее, а то слишком долго это всё длится и стоит на месте.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram