scetool(C)2011-2013bynaehrwertNPlocallicensehandling(C)2012byflatz==>Setup<==-/data/keys:Keyfile.-/data/ldr_curves:Loadercurves(7744bytes).-/data/vsh_curves:VSHcurves(360bytes).-/data/idps:IDPSasbinaryfile-/data/act.dat:act.dat-/rifs/*:*.riffiles-/raps/*:*.rapfiles==>KeyfileFormat<==[keyname]type={SELF,RVK,PKG,SPP,OTHER}revision={00,...,18,8000}version={...,0001000000000000,...}self_type={LV0,LV1,LV2,APP,ISO,LDR,UNK_7,NPDRM}key=...erk=...riv=...pub=...priv=...ctype=...==>KeysetExample<==[metldr]type=SELFrevision=00self_type=LDRerk=0000000000000000000000000000000000000000000000000000000000000000riv=00000000000000000000000000000000pub=00000000000000000000000000000000000000000000000000000000000000000000000000000000priv=000000000000000000000000000000000000000000ctype=00==>NPDRMKey(set)Names<==-[NP_tid]:TitleIDOMAC1key.-[NP_ci]:ControlinfoOMAC1key.-[NP_klic_free]:Freeklicensee.-[NP_klic_key]:klicenseekey.-[NP_idps_const]:IDPSconstant.-[NP_rif_key]:rifkey.-[NP_sig]:FootersignatureECDSAkeyset.==>OverrideKeyset<==It should be a single hex-string consisting of:32bytes(Key)16bytes(IV)40bytes(Pub)21bytes(Priv)1byte(CType).==>History<==Version0.2.9.2-ExtendedInfoforELFHeaderandothertypes.-Addedkeysets19,1A,1B1C1Dfor3.74-4.81FW.Version0.2.9.1-Minorupdate0.0.1--self-fw-versionforAPPbysomeonehttp://www.maxconsole.com/threads/uniofficial-minor-update-to-scetool.31333/Version0.2.9-Plaintextsectionswillnowtakelessspaceinmetadataheaderkeysarray.-AddedoptiontospecifiyatemplateSELFtotakeconfigurationvaluesfrom.-Addedoptiontooverridethekeysetusedforen-/decryption.-FixedNPapplicationtypes.-[FirmwareVersion]willnowbewrittentocontrolinfoonly.-[ApplicationVersion]willnowbewrittentoapplicationinfoonly.Version0.2.8(intermediaterelease):-Fixedminorbugswherescetoolwouldcrash.-AddedSPPparsing.-DecryptingRVK/SPPwillnowwriteheader+datatofile.Version 0.2.7:-AddedlocalNPlicensehandling.-Addedoptiontooverrideklicensee.-Addedoptiontodisablesectionskipping(inSELFgeneration).Version 0.2.5:-Addedoptiontouseprovidedmetadatainfofordecryption.-"PS3"pathenvironmentvariablewillnowbesearchedforkeys/ldr_curves/vsh_curvestoo.Version 0.2.4:-Addedoptiontodisplayrawvalues.-MovedfactoryAuth-IDsto<publicbuild>(astheyareonps3devwikinow).Version 0.2.2:-Addedoptionstooverridecontrol/capabilityflags(32byteseach).-Fixedwhereafalsekeysetwouldcrashscetoolwhendecryptingafile.-Somesourcelevelchangesandoptimizations.Version 0.2.1:-zlibisrequiredtousescetool.-'sdk_type'waschangedto'revision'indata/keys.==>Greetingsto<==-ps3dev.net-youknowwhoyouare!==>Trivia<==http://bit.ly/QUji89
Расшифровка параметров:
Знак = (равно) указывать не обязательно, а в сокращённых командах запрещено, только через пробел или вообще без пробела.
--sce-type=SELF // указываем тип SCE, могут быть SELF/RVK/PKG/SPP
--compress-data=TRUE// указываем сжимать или нет, выставляем одно из двух - TRUE/FALSE(default)
--skip-sections=TRUE// указываем пропускать секции или нет, одно из двух - TRUE(default)/FALSE
--key-revision=0A // указываем Ревизию ключа в зависимости от прошивки - 00, 01, ..., 1D.
--self-auth-id=1010000001000003// указываем ID Аутентификации, для ретэйл-игр и обновлений - всегда такой.
--self-vendor-id=01000002// указываем ID Производителя, для CoreOs/dev_flash files/Games - всегда такой.
--self-type=APP // указываем тип приложения, для дисковых игр - APP, для PSN игр - NPDRM.
--self-app-version=0001000000000000// указываем версию приложения, тут просто v1.0
--self-fw-version=0003005500000000// указываем версию прошивки, под ревизию ключа 0A идёт прошивка 3.55
--self-cap-flags=00000000000000000000000000000000000000000000003B0000000100040000 // 32 байта capability флаги
--encrypt EBOOT.ELF EBOOT.BIN // указываем, что производим шифрование ELF в BIN
Введение
Это формат, используемый исполняемыми файлами на PS3. В нем есть определенный заголовок, который называется SCE-заголовком, где он хранит все параметры для этого процесса
SCE Header - Заголовок SCE
Он состоит из информации о структуре и смещениях self. Первая часть находится в открытом виде до Metadata Info.
Metadata Info - Информация о метаданных
Информация о метаданных сама по себе находится под AES 256 CBC. Эта часть содержит KEY + IV для дальнейшей расшифровки заголовка с использованием AES 128 CTR.
Metadata - Метаданные
Заголовок метаданных, Заголовки секций метаданных, Хеш секции, Возможности и Подпись находятся под AES 128 CTR слоем и дешифруются с помощью ключа выше.
Metadata Header - Заголовок метаданных
Заголовок метаданных содержит информацию, необходимую для аутентификации заголовка и структуры метаданных. Подпись представляет собой ECDSA хеша SHA1 собственного файла, начинающегося с 0x0 и заканчивающегося на 0x0 + signatureInputLength.
Data Sections - Секции данных
Секции данных могут быть зашифрованы с использованием AES 128 CTR и/или сжаты. HMAC-SHA1 используется для аутентификации, они не должны быть изменены.
Примечание: в этот формат могут быть подписаны не только файлы ELF/PRX, другие известные файлы с заголовком SCE:
revoke (e.g. RL_FOR_PACKAGE.img/RL_FOR_PROGRAM.img and pkg.srvk/prog.srvk)
spp (e.g. default.spp)
package (e.g. .pkg/.spkg_hdr.X)
edat
Криптография
Это небольшое резюме о том, как работает криптография в self. В основном здесь находятся шаги, выполняемые загрузчиками:
Все загрузчики имеют статический ключ и iv, называемый соответственно erk и riv, это ключи для первого этапа дешифрования, которые используются для дешифрования первых первых 0x40 байтов метаданных self, используя AES256CBC.
Затем результат используется как ключ и iv для дешифровки остальной части метаданных с использованием AESCTR, наконец, дешифрованные метаданные содержат ключи и iv для каждого раздела данных, которые все еще дешифруются через AES128CTR. Эта модель безопасности основана на том факте, что первые 0x40 байт метаданных self, однажды дешифрованные статическим ключом AES256CBC в загрузчике, никогда не должны быть одинаковыми от одного бинарника к другому. То же самое относится к любому другому значению, используемому в качестве ключа AES128CTR или iv.
Загрузчики также участвуют в распаковке бинарных файлов с использованием zlib.
SELF аутентичность основана на других независимых шагах, HMAC-SHA1 от секции данных и ECDSA для актуальной сигнатуры в заголовке.
SCE Header - Заголовок SCE
Для начала, перед разбором кода структуры заголовка, давайте разберёмся, что означают эти странные значения и столбцы.
Слева - мы видим смещение в файле, а через пробел - его название, столбиком по порядку, смещение за смещением.
Справа - мы видим комментарии к этому смещению, заключённые между символами /* ... */ (такой вид комментария может использоваться в многострочном режиме, тогда как такой вид // только в однострочном)
Что означают uint8_t, uint16_t, uint32_t, uint64_t?
typedefstruct {uint64_t header_type; /* 3 - SELF */uint64_t appinfo_offset; /* app info offset */uint64_t elf_offset; /* ELF #1 offset */uint64_t phdr_offset; /* program header offset */uint64_t shdr_offset; /* section header offset */uint64_t section_info_offset; /* section info offset */uint64_t sceversion_offset; /* version offset */uint64_t controlinfo_offset; /* control info offset */uint64_t controlinfo_length; /* control length */uint64_t padding; /* padding */
} __attribute__((packed)) SELF_HDR;
Комментарий: Реальные данные ELF расположены после заголовка SCE (см. размер заголовка). Он зашифрован, если флаг не равен 0x8000. unfself работает, вырезав заголовок SCE из (фейкового) SELF.
typedef struct {
uint16 unknown_1;
uint16 unknown_2; //0x0001uint32 unknown_3;
uint32 unknown_4; //Number of sections?uint32 unknown_5;
////uint64 offset; //Data offset.uint64 size; //Data size.//// <- these are supposed to be sections
} SCE_VERSION_DATA_30;
Control Information
typedefstruct {uint32_t type; // 1==control flags; 2==file digest; 3==npdrmuint32_t size;
uint64_t next; // 1 if another Control Info structure follows 0 if not
// type 2 0x40 bytesstruct {uint8_t digest1[20]; //hash digest, same for every fileuint8_t digest2[20]; //sha1 hash digest calculated of .elf file...uint64_t padding;
} file_digest40;
Заголовок метаданных расположен после информации метаданных в файле SELF.
Он расшифровывается с использованием AES128CTR с помощью записей ключа и ivec из информации метаданных.
Длина входной сигнатуры - это количество байтов, которые используются для генерации SHA-1, который используется для генерации сигнатуры ECDSA. Длина должна быть от начала до самой подписи. Используется расшифрованная версия входных данных.
Это присутствует только в том случае, если присутствует метаданные.
Ключи метаданных (хеш раздела) расположены после заголовков раздела метаданных в файле SELF.
Количество ключей указывается в элементе keyCount в заголовке метаданных.
Они дешифруются с использованием AES128CTR с помощью записей ключа и ivec из информации метаданных.
Если sha1Index указывает на ключ, тогда ключ [sha1Index] и ключ [sha1Index + 1] образуют 160-битный хеш. Key [sha1Index + 2] на клавишу [key [sha1Index + 6] образуют 512-битный ключ для HMAC-SHA1. HMAC-SHA1 рассчитывается по дешифрованным данным и перед декомпрессией.
Capabilities Info
typedefstruct {uint32_t Type; // 1,2uint32_t capabilities_size; // capabilities Type 1 0x30, Type 2 0x100uint32_t next; // 1 if there is another cap flag structure after this, 0 if notuint32_t unknown2;
uint64_t unknown3;
uint64_t unknown4;
uint64_t flags;
uint32_t unknown6;
uint32_t unknown7;
} __attribute__((packed)) CAPABILITIES_INFO;
rhish777, отлично, молодец, что копаешь. У меня пока не было времени этим заняться.
Постоянно отвлекают занятия по форуму, да ещё в личку, почему-то ко мне, каждый день пишут вопросы юзеры со всего мира по типу "How to install emulator gPspKai" или "Как вкрутить лампочку, чтобы не порезать руки". Уже начинает напрягать.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
rhish777, отлично, молодец, что копаешь. У меня пока не было времени этим заняться.
Постоянно отвлекают занятия по форуму, да ещё в личку, почему-то ко мне, каждый день пишут вопросы юзеры со всего мира по типу "How to install emulator gPspKai" или "Как вкрутить лампочку, чтобы не порезать руки". Уже начинает напрягать.
Я взял бесплатное приложение из стора NPUP31353 MLBTV PREMIUM и пытаюсь подпись на основе его сделать.
Так как для подписи нужно именно такое приложение без всяких привязок к EDAT, LIC.DAT, RIF, RIV и т. д...
Меня первое что смущает - это то, что первый Metadata Offset 0x00000480 такой всегда выходит.
А у подписанных EBOOT.BIN самой сони он такой Metadata Offset 0x000004A0
Меня первое что смущает - это то, что первый Metadata Offset 0x00000480 такой всегда выходит.
А у подписанных EBOOT.BIN самой сони он такой Metadata Offset 0x000004A0
И никак не получается его изменить? Никакими параметрами?
Значит в исходниках так наглухо закреплено, если это так.
Это получается, что EBOOT создаётся на 0x20 байтов меньше. Это же адресация блока, где начинаются метаданные.
И никак не получается его изменить? Никакими параметрами?
Значит в исходниках так наглухо закреплено, если это так.
Оно и понятно. Никто не пытался по сей день подписать файлы для официальной прошивки.
И тот огромный ключ [*] SCE File Keys: который я вставлял постом выше, тоже не понятно как генерируется.
Не могу подобрать как не извращаюсь с параметрами. Всегда выходит либо больше оригинала, либо меньше.
А размер получаемого файла и вовсе всегда меньше оригинала. Это говорит о том что каких то еще параметров в утилите все еще нет.
rhish777, погоди, я пока пытаюсь выяснить, откуда берутся такие цифры. Имеешь в виду keyset?
Ну пока код рабочий и подписывается. Что интересно, вот эти Digest 1 и 2 меня 2-ой генерится откуда-то, а первый правильный.
rhish777, кстати, я этот свой код снова решил проверить в консоли и постоянно он выдаёт ошибки. Пол дня чесал репу, думал чо за фигня, ведь точно знаю, что обратный слеш делает перенос строки и вот же тестировал этот код и он отлично отрабатывал. Потом обнаружил, что запустил стандартную консоль Windows. А такой код оказывается в ней не работает И вспомнил, что я же запускал код из-под консоли MinGW через msys.bat.
А у тебя этот код хоть отрабатывал?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
rhish777, кстати, я этот свой код снова решил проверить в консоли и постоянно он выдаёт ошибки. Пол дня чесал репу, думал чо за фигня, ведь точно знаю, что обратный слеш делает перенос строки и вот же тестировал этот код и он отлично отрабатывал. Потом обнаружил, что запустил стандартную консоль Windows. А такой код оказывается в ней не работает И вспомнил, что я же запускал код из-под консоли MinGW через msys.bat.
А у тебя этот код хоть отрабатывал?
Обрабатывал если убрать слеши. Ну я проверял нечего не запускается стандартная ошибка с 17 на конце.
А если подписать через IDPS то получается сообщение что нужно купить игру.
Все же какого то параметра не хватает что бы запустить на официальной. Всегда ошибка с 17 на конце.
Но тогда мне не ясно почему от дисковой версии подпись давно найдена... Может NPDRM способ подписи старый в SCETOOL? Или просто сони нельзя забанить ключи от дисковой версии так как их миллион раскупили?
Одни догадки.
vk.com/playstation_f_a_n
Последний раз редактировалось rhish777; 27.11.2016 в 20:53.
why when i resign the original eboot of angry birds to npdrm eboot , the " Random Pad 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " is 00....???
i can put the Metadata Offset 0x000004A0, but have this problem of the random pad...
its because the klic key is not correct whe i decrypt and encrypt the eboot?
Because there is not yet a full signature.
Я уже писал что какого то параметра все еще не хватает в scetool потому проверочный ключ не совпадает с таким как в спойлере
Любой хоть дисковый, хоть NPDRM должен ровняется именно этому ключу в 33 секции по 16 байт. Причем если смотреть через хекс редактор, этого ключа не увидеть. Его друзья мои именно нужно подобрать. Тогда любые приложение какие хочешь можно будет запустить на OFW
vk.com/playstation_f_a_n
Последний раз редактировалось ErikPshat; 30.11.2016 в 01:27.
Причина: Not need full quote