Как пожать, упаковать и зашифровать исполняемый ELF-файл для PSP
Привет. Я Dedok179, разработчик новых версий трейнеров для Sony консолей. Возникла такая проблема что для данной платформы из упаковщиков исполняемых файлов нашел только psp-packer, но файлы запакованные через него не желают запускаться ни на эмуляторе ни на консоли. Сжатие мне важно так как оригинальный исполняемый входит в состав чит-лоадера и заменяет оригинальный в образе, чтобы хватило места для замены. Может кто предложить чего по этому поводу?
Примеры работ для PS1/PS2
Последний раз редактировалось ErikPshat; 26.05.2020 в 05:00.
Dedok179, если игры не ISO, то исполняемый ELF пакуется как DATA.PSP в EBOOT.PBP как цифровоая версия игра с карты памяти. Для этого лучше подойдёт вот это: PrxEncrypter Mod v1.0.0.1
Он максимально сжимает файлы 7Zip-ом и такие игры работают на OFW.
Если EBOOT.BIN из ISO-образа, тогда SEBOOT, про него имеется ссылка в той же теме в описании. Но по-моему он не сжимает, не помню точно.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Мне нужно что-то что сможет запаковать так его, чтобы он сам распаковался в памяти (как UPX например). Так как сам метод загрузки подразумевает наличие бутабельного elf файла. PSP-Packer казалось бы идеальное решение для меня, если бы сжатые им файлы запустились.
Мне нужно получить именно пожатый бутабельный elf, ибо схема загрузки такая - Загружается elf трейнера->выбираются нужные коды->в память записывается пожатый elf->цепляется чит-загрузчик->запускается пожатый elf с последующей его самораспаковкой.
Последний раз редактировалось ErikPshat; 26.05.2020 в 05:05.
Ну а я вам что предлагаю? По-ходу вы вообще не читаете что я вам пишу. Как будто бывает какой-то небутабельный ELF. Мы же говорим о загрузчике игры, а не о каких-то вспомогательных модулях.
ELF всегда работает таким образом - сначала он компилируется разработчиками как непожатый ELF, затем он сжимается в gz-архив или в zlib, либо в lzma, ну и ещё есть методы сжатия, потом к пожатому файлу прикрепляется заголовок ~PSP, записывается размер пожатого файдла, размер расжатого декриптованного файла и контрольные суммы блоков, называемые общим словом KIRK, ну и тело пожатого файла шифруется этим кирком.
Затем, когда вы запускаете этот ~PSP, он первым делом декриптуется, затем расжимается из архива и запускается чистый ELF. После этого он загружается в память и начинают работать читы и программа.
На PSP этот ELF в цифровых играх и программах называется DATA.PSP, который пакуется в EBOOT.PBP. В вашем случае для дебаг-тестов не обязательно его паковать, а просто взять пожатый и подписанный из папки ENCRYPT, в другой папке будет лежать упакованный EBOOT.PBP, но вам он не нужен. Вам просто нужно дать файлу правильное название, там программа сама даёт подсказку, какого вида надо файл подсунуть и какие можно дополнительные файлы подкинуть для упаковки.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 25.05.2020 в 06:21.
Возможно я немного не так прочитал сначала. Попробовал утилиту, да жмет (Хуже чем psp-packer но жмет). Но, эмуль наглухо выдает ошибку "не удалось загрузить игру: файл поврежден". На консоли еще не проверял. Или я где-то косячу, или хрен его знает. Обычно в случае как с PS2 я к загрузчику всегда прикомпилирую уже пожатый исполняемый файл игры, а не пережимаю сам загрузчик. Думал что тут будет уместен этот же метод, но видимо немного ошибся.
Вот эта строка указывает на количество байт: unsigned char kirkHeader[272] - по этому количеству вы должны ориентироваться, чтобы не спутать блоки и там и там.
Из kirk.c выделяете движением мышки слева весь цифровой код сверху вниз, не затрагивая скобки { и };, копируете, затем выделяете в исходнике main.c такой же код и заменяете.
Теперь открываете оригинальный шифрованный не декриптованный EBOOT.BIN (~PSP). Выделяете с самомго начала заголовок, размером 336 байт (0x150).
И делаете всё тоже самое File -> Export -> С Source (*.c, *.cpp).
У вас сохранится файл EBOOT.c
Теперь откройте его в Notepad++ и так же откройте в исходниках файл main.c - вы должны увидеть сходство в EBOOT.c размером 336 байт с исходным кодом в этом месте: unsigned char pspHeader[336]
Точно так же копируете, вставляете, сохраняете main.c и компилируете новый PrxEncrypter.
Ну вот и всё, у вас есть энкриптер именно для этого вашего файла.
Берёте ваш кастомный файл, который надо упаковать как оригинал, кидаете рядом с программой или прямо на программу, либо в консоли натравливаете команду
PrxEncrypter.exe EBOOT.BIN
На выходе вы должны получить файл DATA.ENC - это и есть ваш пожатый и подписанный EBOOT.BIN, переименовываете его потом и пакуете в ISO.
У него будет тот же заголовок как у оригинала, точно такой же размер, как и записано в хедере и он будет работать на любой OFW, как и оригинал.
P.S. Я ухожу сегодня, нужно освобождать комп. Завтра с утра зайду проверить как дела
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 26.05.2020 в 06:44.
Вот эта строка указывает на количество байт: unsigned char kirkHeader[272] = - по этому количеству вы должны ориентироваться, чтобы не спутать блоки и там и там.
Из kirk.c выделяете движением мышки слева весь цифровой код сверху вниз, не затрагивая скобки { и };, копируете, затем выделяете в исходнике main.c такой же код и заменяете.
Теперь открываете оригинальный шифрованный не декриптованный EBOOT.BIN (~PSP). Выделяете с самомго начала заголовок, размером 336 байт (0x150).
И делаете всё тоже самое File -> Export -> С Source (*.c, *.cpp).
У вас сохранится файл EBOOT.c
Теперь откройте его в Notepad++ и так же откройте в исходниках файл main.c - вы должны увидеть сходство в EBOOT.c размером 336 байт с исходным кодом в этом месте: unsigned char rawData[336] =
Точно так же копируете, вставляете, сохраняете main.c и компилируете новый PrxEncrypter.
Ну вот и всё, у вас есть энкриптер именно для этого вашего файла.
Берёте ваш кастомный файл, который надо упаковать как оригинал, кидаете рядом с программой или прямо на программу, либо в консоли натравливаете команду
PrxEncrypter.exe EBOOT.BIN
На выходе вы должны получить файл DATA.ENC - это и есть ваш пожатый и подписанный EBOOT.BIN, переименовываете его потом и пакуете в ISO.
У него будет тот же заголовок как у оригинала, точно такой же размер, как и записано в хедере и он будет работать на любой OFW, как и оригинал.
Все собралось, запустилось из образа нормально. Останется на сжатие проверить, потому что сейчас паковал файл меньше оригинального по размеру. Такой вопрос, могу ли я немного модифицировать ваш исходник для некоторой автоматизации процесса? Напишу утилиту, которой скармливаешь кирк и криптованный файл, а на выходе получаешь готовый пакер который уже дальше зажимает файл, ключи сгенерированные можно будет в конфиг файл проекта трейнера писать чтобы использовать их при следующей сборке проекта трейнера. Мне так всяко по проще будет файлы разных игр паковать. Если конечно будет разрешено.
Думаю, с PS3 меня будут ожидать примерно такие же проблемы если не больше
Последний раз редактировалось ErikPshat; 26.05.2020 в 05:16.
Yoti, да ладно, не придирайся, парень дедок вполне смышлённый, просто имеются немного пробелов
Сообщение от Dedok179
К сожалению файл размером больше первоначального он отказывается принимать
Ну так правильно. В кирке и в заголовке проставлены размеры шифрованного файла и так же декриптованного ELF, тело шифруется исходя из размера оригинала и размера пожатого, записанного в хедере, который изменять никак нельзя, иначе хэши блоков не совпадут. Размеры записаны в позициях 0x28 и 0x2C по 4 байта в Little Endian.
Так что размер ELF не может превышать оригинал, но может быть меньше, просто концовка забивается нулями до нужного размера.
Либо можно упаковать и подписать увеличенный кастомный файл - кирком и хедером другого официального файла большего размера.
Сообщение от Dedok179
Такой вопрос, могу ли я немного модифицировать ваш исходник для некоторой автоматизации процесса?
Да без проблем, модифицируйте как вам угодно
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 26.05.2020 в 06:47.
да ладно, не придирайся, парень дедок вполне смышлённый, просто имеются немного пробелов
Уже привычно что некоторые пользователи из известного места где только не появятся, начинают разливать свои токсины. Просто не обращай внимания.
Сообщение от ErikPshat
Так что размер ELF не может превышать оригинал, но может быть меньше
Ну, это немного не состыковывается с конечной целью. Видимо все таки без пересборки образа тут не обойдется. Всегда старался обойти этот процесс ибо на PS1/2 он не только геморный, но и есть шанс нарушить некоторые данные при неверно составленной карте образа.
Последний раз редактировалось Dedok179; 26.05.2020 в 11:16.
Ну так правильно. В кирке и в заголовке проставлены размеры шифрованного файла и так же декриптованного ELF, тело шифруется исходя из размера оригинала и размера пожатого, записанного в хедере, который изменять никак нельзя, иначе хэши блоков не совпадут. Размеры записаны в позициях 0x28 и 0x2C по 4 байта в Little Endian.
Так что размер ELF не может превышать оригинал, но может быть меньше, просто концовка забивается нулями до нужного размера.
Либо можно упаковать и подписать увеличенный кастомный файл - кирком и хедером другого официального файла большего размера.
Т.е эту "хитрожопость" не обойти так полагаю? В предыдущих работах была вполне уместная такая схема: оригинальный файл+загрузчик и другие данные(больше оригинального)->упаковка->получаем файл меньше оригинального что удобно для простой замены в образе
Другие консоли: Все PSP, все PSV, SCPH-1002, SCPH-102, SCPH-77008, CECH-4208C, SCPH-1000R
Регистрация: 19.03.2008
Адрес: Россия
Сообщений: 5,763
Вы сказали Спасибо: 823
Поблагодарили 3,894 раз(а) в 2,043 сообщениях
Сила репутации: 1
Репутация: 3894 
(репутация неоспорима)
BlackDaemon,
ну, кстати, тоже верно, там даже с запасом место будет. Просто смысла в этих извращениях немного - на диск образ не запишешь всё равно. Также можно оригинальную исполняшку декриптнуть и как boot.bin положить, а свой код на место eboot.bin засунуть. Тут смотря какого размера исполняшка сама, иногда там мелкий лодырь для модуля лежит.
ну, кстати, тоже верно, там даже с запасом место будет. Просто смысла в этих извращениях немного - на диск образ не запишешь всё равно. Также можно оригинальную исполняшку декриптнуть и как boot.bin положить, а свой код на место eboot.bin засунуть. Тут смотря какого размера исполняшка сама, иногда там мелкий лодырь для модуля лежит.
Как-то даже не подумывал об этом. Может это будет один из выходов, спасибо.
В общем немного упростил сборку, залил во вложение на всякий, пускай хранится здесь.
Сделал Example, просто запустить 1 MAKE.BAT и закидывать папку "SIGNED GAME" на консоль в ms0:/PSP/GAME/ кто не в курсе.
Потом наводите курсор на игру и можете слушать часами модную современную музыку без остановки.
Название композиции не скажу секрет. И что за игра не скажу, сами смотрите...
P.S. из main.c убрал #include <zlib.h>, ибо прога давно не использует архиватор zlib, а вместо него 7-Zip. Из Makefile убрал LDFLAGS=-lz, пускай без него собирается.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram