PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   PSP хакинг и девелопмент (https://www.pspx.ru/forum/forumdisplay.php?f=195)
-   -   Как пожать, упаковать и зашифровать исполняемый ELF-файл для PSP (https://www.pspx.ru/forum/showthread.php?t=110249)

Dedok179 24.05.2020 18:01

Как пожать, упаковать и зашифровать исполняемый ELF-файл для PSP
 
Привет. Я Dedok179, разработчик новых версий трейнеров для Sony консолей. Возникла такая проблема что для данной платформы из упаковщиков исполняемых файлов нашел только psp-packer, но файлы запакованные через него не желают запускаться ни на эмуляторе ни на консоли. Сжатие мне важно так как оригинальный исполняемый входит в состав чит-лоадера и заменяет оригинальный в образе, чтобы хватило места для замены. Может кто предложить чего по этому поводу?

Примеры работ для PS1/PS2




ErikPshat 24.05.2020 18:23

Dedok179, если игры не ISO, то исполняемый ELF пакуется как DATA.PSP в EBOOT.PBP как цифровоая версия игра с карты памяти. Для этого лучше подойдёт вот это: PrxEncrypter Mod v1.0.0.1
Он максимально сжимает файлы 7Zip-ом и такие игры работают на OFW.

Если EBOOT.BIN из ISO-образа, тогда SEBOOT, про него имеется ссылка в той же теме в описании. Но по-моему он не сжимает, не помню точно.

Dedok179 24.05.2020 18:34

Цитата:

Сообщение от ErikPshat (Сообщение 1214566)
EBOOT.BIN из ISO-образа

Мне нужно что-то что сможет запаковать так его, чтобы он сам распаковался в памяти (как UPX например). Так как сам метод загрузки подразумевает наличие бутабельного elf файла. PSP-Packer казалось бы идеальное решение для меня, если бы сжатые им файлы запустились.

ErikPshat 24.05.2020 18:59

Цитата:

Сообщение от ErikPshat (Сообщение 1214566)
Он максимально сжимает файлы 7Zip-ом и такие игры работают на OFW.


Dedok179 24.05.2020 19:49

Результат работы psp-packer


Мне нужно получить именно пожатый бутабельный elf, ибо схема загрузки такая - Загружается elf трейнера->выбираются нужные коды->в память записывается пожатый elf->цепляется чит-загрузчик->запускается пожатый elf с последующей его самораспаковкой.

ErikPshat 24.05.2020 21:06

Цитата:

Сообщение от Dedok179 (Сообщение 1214572)
Мне нужно получить именно пожатый бутабельный elf

Ну а я вам что предлагаю? По-ходу вы вообще не читаете что я вам пишу. Как будто бывает какой-то небутабельный ELF. Мы же говорим о загрузчике игры, а не о каких-то вспомогательных модулях.

ELF всегда работает таким образом - сначала он компилируется разработчиками как непожатый ELF, затем он сжимается в gz-архив или в zlib, либо в lzma, ну и ещё есть методы сжатия, потом к пожатому файлу прикрепляется заголовок ~PSP, записывается размер пожатого файдла, размер расжатого декриптованного файла и контрольные суммы блоков, называемые общим словом KIRK, ну и тело пожатого файла шифруется этим кирком.

Затем, когда вы запускаете этот ~PSP, он первым делом декриптуется, затем расжимается из архива и запускается чистый ELF. После этого он загружается в память и начинают работать читы и программа.
На PSP этот ELF в цифровых играх и программах называется DATA.PSP, который пакуется в EBOOT.PBP. В вашем случае для дебаг-тестов не обязательно его паковать, а просто взять пожатый и подписанный из папки ENCRYPT, в другой папке будет лежать упакованный EBOOT.PBP, но вам он не нужен. Вам просто нужно дать файлу правильное название, там программа сама даёт подсказку, какого вида надо файл подсунуть и какие можно дополнительные файлы подкинуть для упаковки.

Dedok179 24.05.2020 22:38

Цитата:

Сообщение от ErikPshat (Сообщение 1214575)
Мы же говорим о загрузчике игры

Возможно я немного не так прочитал сначала. Попробовал утилиту, да жмет (Хуже чем psp-packer но жмет). Но, эмуль наглухо выдает ошибку "не удалось загрузить игру: файл поврежден". На консоли еще не проверял. Или я где-то косячу, или хрен его знает. Обычно в случае как с PS2 я к загрузчику всегда прикомпилирую уже пожатый исполняемый файл игры, а не пережимаю сам загрузчик. Думал что тут будет уместен этот же метод, но видимо немного ошибся.

ErikPshat 25.05.2020 06:52

Цитата:

Сообщение от Dedok179 (Сообщение 1214577)
Попробовал утилиту, да жмет (Хуже чем psp-packer но жмет).

Dedok179, я так понимаю, вы используете psp-packer от 4.01 SDK от Dark_Alex :D Это же просто кастомная утилита для упаковки в фейковый ~PSP, где тело от 0x150 жмётся в GZ-архив и вставляется фейковый заголовок. Я так понимаю, вы сами не понимаете механизма сжатия, судя по вашим объяснениям :) вот почитайте про GZIP-сжатие: Декриптовка - Русификация - Запаковка. Там вас должна интересовать последняя секция III) Запаковка с новой криптовкой., да и начало тоже.

На самом деле никакой psp-packer вообще не нужен, я им и не пользовался никогда. Всё делается элементарно ручками. И да, psp-packer не может жать в GZIP лучше, чем моя утилита, т.к. она жмёт с помощью 7-Zip, который явно жмёт лучше. Ну бывают некоторые исключения.

В принципе, разница между psp-packer и PrxEncrypter Mod небольшая. Первый жмёт ELF в кастомный ~PSP, который работает только на кастомных прошивках, второй жмёт в официальный ~PSP, который работает на официальных прошивках. Ну а жмут они файл в одинаковые архивы, просто первый жмёт с помощью модуля GZIP, а второй с помощью 7-Zip.

По-идее и то и другое должны работать на PPSSPP в обычном режиме загрузки игры, как и любой другой официальной игры, но не в дебаг-режиме, ибо в этом режиме работают только голые ELF, если не ошибаюсь.

Dedok179 25.05.2020 08:27

Цитата:

Сообщение от ErikPshat (Сообщение 1214582)
Dedok179, я так понимаю, вы используете psp-packer от 4.01 SDK от Dark_Alex :D Это же просто кастомная утилита для упаковки в фейковый ~PSP, где тело от 0x150 жмётся в GZ-архив и вставляется фейковый заголовок. Я так понимаю, вы сами не понимаете механизма сжатия, судя по вашим объяснениям :) вот почитайте про GZIP-сжатие: Декриптовка - Русификация - Запаковка. Там вас должна интересовать последняя секция III) Запаковка с новой криптовкой., да и начало тоже.

На самом деле никакой psp-packer вообще не нужен, я им и не пользовался никогда. Всё делается элементарно ручками. И да, psp-packer не может жать в GZIP лучше, чем моя утилита, т.к. она жмёт с помощью 7-Zip, который явно жмёт лучше. Ну бывают некоторые исключения.

В принципе, разница между psp-packer и PrxEncrypter Mod небольшая. Первый жмёт ELF в кастомный ~PSP, который работает только на кастомных прошивках, второй жмёт в официальный ~PSP, который работает на официальных прошивках. Ну а жмут они файл в одинаковые архивы, просто первый жмёт с помощью модуля GZIP, а второй с помощью 7-Zip.

По-идее и то и другое должны работать на PPSSPP в обычном режиме загрузки игры, как и любой другой официальной игры, но не в дебаг-режиме, ибо в этом режиме работают только голые ELF, если не ошибаюсь.

Я бы и рад был для начала чтобы хоть что-то после сжатия работало. Мне не нужно понимать механизм, мне нужно чтобы оно сжалось и все, чтобы с этим можно было работать дальше. Не знаю поняли мы друг друга или нет. Конечный готовый трейнер заменяет в образе оригинальный исполняемый файл, но так как он содержит в себе и оригинальный файл и загрузчик, нужно сжать или итоговый файл или файл игры прикомпилируемый к загрузчику, чтобы все это добро нормально зашло в образ без надобности лопатить его.


ErikPshat 25.05.2020 09:08

Dedok179, я не пойму, что вы там мутите? Вы суёте образ игры для PSP через CDMage для PS1 образов? А потом образ PS1 пытаетесь запустить в PPSSPP для PSP?

А кто вас такому трюку научил? Может лучше собирать образ PSP через родную для неё программу UMDGen v4.00
?

Dedok179 25.05.2020 09:45

Цитата:

Сообщение от ErikPshat (Сообщение 1214591)
я не пойму, что вы там мутите?

Посмотрите видео в начале поста если не смотрели, пояснее будет зачем вообще нужно сжать файл.
Цитата:

Сообщение от ErikPshat (Сообщение 1214591)
Вы суёте образ игры для PSP через CDMage для PS1 образов?

Функция замены в нем не только с PS1 образами работает..PS..заменил (ох..пересобрал) через UMDGEN и проблема не делать никуда ни на сантиметр.
Цитата:

Сообщение от ErikPshat (Сообщение 1214591)
А потом образ PS1 пытаетесь запустить в PPSSPP для PSP?

А я его и не сохранял как PS1 образ. Только заменил блок байт и все, это там именно так работает (будет тоже самое если просто через hex изменить этот блок), а не как все привыкли через пересохранение полной структуры.


Цитата:

Сообщение от ErikPshat (Сообщение 1214591)
Может лучше собирать образ PSP через родную для неё программу UMDGen v4.00?

Собирать естественно через него
Цитата:

Сообщение от ErikPshat (Сообщение 1214591)
А кто вас такому трюку научил?

Оно со временем само приходит

ErikPshat 25.05.2020 10:19

Цитата:

Сообщение от Dedok179 (Сообщение 1214601)
А я его и не сохранял как PS1 образ. Только заменил блок байт и все, это там именно так работает (будет тоже самое если просто через hex изменить этот блок), а не как все привыкли через пересохранение полной структуры.

Спасибо, не знал, что он просто как хекс-редактор работает :) Но всё равно, для сборки ISO для PSP существуют специальные программы.

Dedok179, а вообще что я говорил про EBOOT.BIN? В этом энкрипторе собирают декриптованный EBOOT.BIN только для цифровых игр и программ для карты памяти, которые работают из EBOOT.PBP, а не для дисковых ISO-образов, там метод упаковки и шифрования другой, только через SEBOOT.

Dedok179 25.05.2020 10:40

Цитата:

Сообщение от ErikPshat (Сообщение 1214591)
там метод упаковки и шифрования другой, только через SEBOOT.

Ну тогда на этом все, ибо SEBOOT не предоставляет сжатия от слова совсем, что значит место никак не освободить. Спасибо вам за консультацию по этому вопросу.

ErikPshat 25.05.2020 11:34

Цитата:

Сообщение от Dedok179 (Сообщение 1214614)
Ну тогда на этом все, ибо SEBOOT не предоставляет сжатия от слова совсем, что значит место никак не освободить.

Ну существуют и другие методы, там разница лишь в том, что заголовок ~PSP немного с другими тегами шифрования. Можно паковать тем же PrxEncrypter-ом, но тогда из исходников собирать пакер с Кирком другим, от EBOOT.BIN, но про это долго рассказывать.

Dedok179 25.05.2020 17:07

Цитата:

Сообщение от ErikPshat (Сообщение 1214621)
Ну существуют и другие методы, там разница лишь в том, что заголовок ~PSP немного с другими тегами шифрования. Можно паковать тем же PrxEncrypter-ом, но тогда из исходников собирать пакер с Кирком другим, от EBOOT.BIN, но про это долго рассказывать.

Можно было бы попробовать собрать, правда он после сборки начинает требовать неведомые библы, после подсовывания которых в ошибку 7b уходит. Исходник брал отсюда

https://i.imgur.com/XJucVTU.png

ErikPshat 25.05.2020 18:18

Dedok179, это немного не то, вернее совсем не то. У вас наверное MSYS не установлен. В паблике PrxEncrypter не кастомный, а обычный от PRO-Team, он у них в исходниках лежит. Но он не может сжать до исходного размера, поэтому мы тут немного помучались и модифицировали как надо, получается файл точно такого же размера как исходный оригинальный. Залил исходники сюда во вложение: https://www.pspx.ru/forum/showthread.php?t=103580

Я же говорю, потом ещё долго объяснять как шифровать и как кирк доставать.
Проще бы давно скинули мне свой кастомный EBOOT.BIN с читами и нужен ещё оригинальный не декриптованный. Я бы вам просто давно бы переподписал за 5 минут. А то вы тут на несколько дней застрянете :D

Dedok179 25.05.2020 18:33

Цитата:

Сообщение от ErikPshat (Сообщение 1214656)
Я же говорю, потом ещё долго объяснять как шифровать и как кирк доставать.
Проще бы давно скинули мне свой кастомный EBOOT.BIN с читами и нужен ещё оригинальный не декриптованный. Я бы вам просто давно бы переподписал за 5 минут. А то вы тут на несколько дней застрянете :D

Тут такой момент что инструмент формирующий сжатие должен входить в состав билдера который будет эти трейнеры собирать. И собираться они будут не 100 и менее раз (не учитывая тестовые процедуры). И каждый раз стучать за подписью через каждый промежуток времени думаю будет не очень. Времени на разбор у меня предостаточно, так как этот проект должен быть закончен.

Кстати именно ваш исходник на удивление без проблем собрался, в отличие от предыдущего.

ErikPshat 25.05.2020 18:51

Цитата:

Сообщение от Dedok179 (Сообщение 1214658)
Кстати именно ваш исходник на удивление без проблем собрался, в отличие от предыдущего.

Ну вот и отлично! Ну у меня время есть, тогда придётся вам объяснять долго и нудно...

Вам теперь нужно скачать для PSP вот это: PRXdecrypter_27a_fix_mod.zip
Не знаю, есть ли у вас PSP вообще :) А то думаю в PPSSPP не заработает.
Вам надо будет им декриптовать оригинальный EBOOT.BIN, который вы декриптовали и модифицировали.
Кидаете его в корень карты памяти в папку enc и декриптуете программой.
Потом там будет лежать декриптованный файл и рядом kirk.16 или kirk.144 - он нам и понадобится.

И ещё вам нужно будет вот это: Hex Workshop v6.8.0.5419.

Потом дам следующие указания...

Dedok179 25.05.2020 19:10

Цитата:

Сообщение от ErikPshat (Сообщение 1214660)
Ну вот и отлично! Ну у меня время есть, тогда придётся вам объяснять долго и нудно...

Вам теперь нужно скачать для PSP вот это: PRXdecrypter_27a_fix_mod.zip
Не знаю, есть ли у вас PSP вообще :) А то думаю в PPSSPP не заработает.
Вам надо будет им декриптовать оригинальный EBOOT.BIN, который вы декриптовали и модифицировали.
Кидаете его в корень карты памяти в папку enc и декриптуете программой.
Потом там будет лежать декриптованный файл и рядом kirk16.bin или kirk144.bin - он нам и понадобится.

И ещё вам нужно будет вот это: Hex Workshop v6.8.0.5419.

Потом дам следующие указания...

Да, kirk появился, исполняемый файл принял стандартный вид с elf заголовком.

https://i.imgur.com/XoY7Kn1.png

ErikPshat 25.05.2020 20:09

Ну хорошо, что у вас всё быстро делается без лишних вопросов :D
В Hex Workshop закройте все лишние окна справа, слева, внизу, они пока не нужны.
  1. Короче, откройте в хекс-редакторе kirk.16, он занимает ровно 272 байта (0x110)
  2. Выберите в меню File -> Export -> С Source (*.c, *.cpp).
  3. У вас сохранится файл kirk.c
  4. Теперь откройте его в Notepad++ и так же откройте в исходниках файл main.c - вы должны увидеть сходство кирка с исходным кодом в этом месте:
    Код:

    unsigned char kirkHeader[272] = {
        0x8B, 0x5D, 0xC0, 0x96, 0x38, 0x77, 0x54, 0x6D, 0x2E, 0x40, 0x07, 0x42, 0x8D, 0x5A, 0xAE, 0xEF,
        0x11, 0x34, 0x0F, 0x5D, 0xF8, 0x57, 0x7A, 0x7A, 0x06, 0xDA, 0xE2, 0xB1, 0x4F, 0x5A, 0x3D, 0x84,
        0x99, 0xC4, 0xF4, 0x95, 0x61, 0xDF, 0x88, 0xBA, 0xB3, 0x60, 0x09, 0x90, 0x5A, 0x94, 0xD8, 0x58,
        0xC5, 0x3A, 0x33, 0x3E, 0xD7, 0x30, 0x20, 0xED, 0xCC, 0xA8, 0x7B, 0x90, 0x46, 0x9B, 0x0C, 0xFC,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x48, 0x06, 0x2F, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x7E, 0x50, 0x53, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x4D, 0x6F, 0x64, 0x65, 0x6C, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x48, 0x06, 0x2F, 0x00, 0xA0, 0x07, 0x2F, 0x00,
        0x24, 0x01, 0x00, 0x00, 0x44, 0xDD, 0x1E, 0x00, 0x5C, 0x46, 0x2D, 0x00, 0x40, 0x00, 0x40, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xCA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x4C, 0xCA, 0x20, 0x00, 0x84, 0x2A, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x06, 0x06, 0x09, 0x00, 0x00, 0x00,
    };

  5. Вот эта строка указывает на количество байт: unsigned char kirkHeader[272] - по этому количеству вы должны ориентироваться, чтобы не спутать блоки и там и там.
  6. Из kirk.c выделяете движением мышки слева весь цифровой код сверху вниз, не затрагивая скобки { и };, копируете, затем выделяете в исходнике main.c такой же код и заменяете.
  7. Теперь открываете оригинальный шифрованный не декриптованный EBOOT.BIN (~PSP). Выделяете с самомго начала заголовок, размером 336 байт (0x150).
  8. И делаете всё тоже самое File -> Export -> С Source (*.c, *.cpp).
  9. У вас сохранится файл EBOOT.c
  10. Теперь откройте его в Notepad++ и так же откройте в исходниках файл main.c - вы должны увидеть сходство в EBOOT.c размером 336 байт с исходным кодом в этом месте: unsigned char pspHeader[336]
  11. Точно так же копируете, вставляете, сохраняете main.c и компилируете новый PrxEncrypter.
  12. Ну вот и всё, у вас есть энкриптер именно для этого вашего файла.
  13. Берёте ваш кастомный файл, который надо упаковать как оригинал, кидаете рядом с программой или прямо на программу, либо в консоли натравливаете команду
    Код:

    PrxEncrypter.exe EBOOT.BIN
  14. На выходе вы должны получить файл DATA.ENC - это и есть ваш пожатый и подписанный EBOOT.BIN, переименовываете его потом и пакуете в ISO.
  15. У него будет тот же заголовок как у оригинала, точно такой же размер, как и записано в хедере и он будет работать на любой OFW, как и оригинал.


P.S. Я ухожу сегодня, нужно освобождать комп. Завтра с утра зайду проверить как дела :)


Текущее время: 11:15. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.