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;
Небольшое обновление: - Добавлен вывод Meta Info Original. - Исправлено, когда в дисковых играх (категория APP) не добавлялась версия прошивки при подписи. В приватной версии открывается пункт вставки индивидуального Seed (--self-indiv-seed 256 bytes). Добавлена библиотека libz-1.dll.
here's the source code for visual c++/windows with some a few small updates
includes:
1. prints original meta info keys. the meta info keys are used to encrypt/decrypt the self metadata. official scetool displays the meta info keys after they have been incremented. The original keys are only useful for someone who wants to use the same keys as the original self. Use of the incremented keys would not give the same result.
1
in sce.cpp add 2 global variables for the key and iv after the includes and after:
aes_crypt_cbc(&aes_ctxt, AES_DECRYPT, sizeof(metadata_info_t), iv, (u8 *)ctxt->metai, (u8 *)ctxt->metai);
/*! scetool version. */#ifdef CONFIG_PRIVATE_BUILD#ifdef BUILD_FOR#define SCETOOL_VERSION SCETOOL_VERSION_BASE " <PRIVATE BUILD:" BUILD_FOR ">"#else#error Specify a name in BUILD_FOR.
to something like:
/*! scetool version. */#ifdef CONFIG_PRIVATE_BUILD#ifdef BUILD_FOR#define SCETOOL_VERSION SCETOOL_VERSION_BASE " <PRIVATE BUILD:" BUILD_FOR ">"#else//#error Specify a name in BUILD_FOR.#define SCETOOL_VERSION SCETOOL_VERSION_BASE " <Public Private Build>"
4. custom versions should display a separate version number in addition to the official version build number that they are based on (2.9). main.cpp line 147:
4
staticvoidprint_version(){
printf("scetool " SCETOOL_VERSION " (C) 2011-2013 by naehrwert\n");
printf("NP local license handling (C) 2012 by flatz\n");
//printf("[Build Date/Time: %s/%s]\n", __DATE__, __TIME__);
}
to something like:
staticvoidprint_version(){
printf("\nFUNCTION: print_version\n");
printf("scetool " SCETOOL_VERSION " (C) 2011-2013 by naehrwert\n");
printf("NP local license handling (C) 2012 by flatz\n");
printf("minor update 0.0.1 <Public Build> 2014 by someone\n");
//printf("[Build Date/Time: %s/%s]\n", __DATE__, __TIME__);
}
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 24.11.2016 в 08:50.
rupor, не факт, что прямо так и заведётся. Для каждой игры нужно подбирать правильные параметры, там Ревизию ключа под версию прошивки, саму версию. Вернее, там практически менять него, там правильно уже выставлена Ревизия ключа и версия прошивки. Единственное, нужно правильно подобрать вот этот параметр:
Каким образом выдёргивать и откуда вообще брать эти флаги, пока не имею понятия. А этот флаг я взял от SELF Resigner, там подпись идёт под 4.10, на что намекают цифры в коде. Думаю там несколько флагов по 8 байт:
Находим официальный EBOOT.BIN от игры, который имеет MinVer для официальной прошивки, например 3.30/3.40/3.55 и т.д.. Это нужно, чтобы подписываемая игра работала на низших прошивках и имела меньшие ограничения.
С помощью того же GUI к scetool выписываем нужные параметры.
Декриптуем EBOOT.BIN в EBOOT.ELF
Подбираем параметры от этого же EBOOT.BIN и обратно шифруем EBOOT.ELF. Имейте в виду, что если оригинальный EBOOT.BIN в той же папке, то при шифровке он перезапишется.
Сравниваем оригинал и подписанный файл. Если они разные, например по MD5, значит подпись не удалась. Короче, нужно правильно подобрать все параметры так, чтобы обратно файл подписывался в точности так же, как оригинал.
Если параметры подобраны так, как надо и файл подписался точно так же, значит мы воспроизвели точную подпись Sony!
Теперь берём EBOOT.BIN от Мультимена и подписываем его под эту игру этими же параметрами.
Так же подписываем все сопутствующие модули Мультимена в SDAT, как это мы делаем с играми.
Создаём под него LIC.EDAT
Инжектируем в бэкап и отправляем на плойку. Должно запуститься, т.к. сэмулирована официальная подпись Сони.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 24.11.2016 в 14:03.
Сравниваем оригинал и подписанный файл. Если они разные, например по MD5, значит подпись не удалась. Короче, нужно правильно подобрать все параметры так, чтобы обратно файл подписывался в точности так же, как оригинал.
Вот с этим пунктом и выходит косяк.
vk.com/playstation_f_a_n
Последний раз редактировалось rhish777; 24.11.2016 в 14:02.
Причина: добавил, подумав
Потому что параметры левые. А нужно их вытащить у оригинала.
Сообщение от Vanik
ErikPshat, eboot должен быть от патча или может быть от самой игры?
От патча, потому что мы EBOOT.BIN берём от патча и заменяем в папке с дисковой игрой.
Отсюда вывод, что его нужно подписывать, как NPDRM, потому что патч PSN-овский.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
rhish777, нет, я просто по ошибке взял другие параметры в батнике.
Я думаю ковырять игры, которые не имеют лик.дат в папке. Это, например, Call Of Juarez или CoD World at War. У них версии 2.4, но я почему-то не могу выбрать в качестве ревизии --key-revision=03, программа просто заканчивает работу и не меняет eboot. =\
Последний раз редактировалось ErikPshat; 04.12.2022 в 03:42.
rhish777, так ты добился 100% совпадения подписки EBOOT.BIN с оригиналом? Думаю нет.
Из обновления нужно в точности брать оригиналы PARAM.SFO с иконками от патча, потому что они проверяются. Не на кастомной прошивке же запускать собираемся.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
rhish777, так ты добился 100% совпадения подписки EBOOT.BIN с оригиналом? Думаю нет.
Из обновления нужно в точности брать оригиналы PARAM.SFO с иконками от патча, потому что они проверяются. Не на кастомной прошивке же запускать собираемся.
А я и думаю откуда у меня такие значения??? Даже больше чем в оригинале
Сегодня наткнулся на целую кладезь утилит ps3tools.
Вы то тут все старые волки и наверняка всё давно знаете, а я только что заинтересовался PS3, поэтому всё начинаю с нуля и для меня это новое открытие.
В общем решил скомпилить это странное чудо, немного почесав репу, дотумкался как это дело реализовать...
В файле INSTALL как-то не для меня была написана инструкция, поэтому я пошёл другим путём и удачно получилось таким методом.
Так как там нет файла Makefile, а есть configure.ac, то пришлось сделать переконфигурацию командой autoreconf -i, таким образом получился файл configure, затем произвёл конфигурацию командой ./configure, после чего появился Makefile, теперь можно компилировать командой make.
Это я не от нефиг делать пишу, а для вас, детки. Учитесь, пока ваш Кэп живой.
Вот так прошла компиляция:
ErikP@ErikPshat~/ps3tools/trunk$autoreconf-iconfigure.ac:8:installing`./install-sh'configure.ac:8:installing`./missing'Makefile.am:installing`./depcomp'ErikP@ErikPshat~/ps3tools/trunk$./configurecheckingforaBSD-compatibleinstall.../mingw/bin/install-ccheckingwhetherbuildenvironmentissane...yescheckingforathread-safemkdir-p.../c/PSDK3v3/mingw/msys/1.0/bin/mkdir-pcheckingforgawk...gawkcheckingwhethermakesets$(MAKE)...yescheckingforgcc...gcccheckingwhethertheCcompilerworks...yescheckingforCcompilerdefaultoutputfilename...a.execheckingforsuffixofexecutables....execheckingwhetherwearecrosscompiling...nocheckingforsuffixofobjectfiles...ocheckingwhetherweareusingtheGNUCcompiler...yescheckingwhethergccaccepts-g...yescheckingforgccoptiontoacceptISOC89...noneneededcheckingforstyleofincludeusedbymake...GNUcheckingdependencystyleofgcc...gcc3checkingfor__gmpz_initin-lgmp...yescheckingforinflatein-lz...yescheckinghowtoruntheCpreprocessor...gcc-Echeckingforgrepthathandleslonglinesand-e.../c/PSDK3v3/mingw/msys/1.0/bin/grepcheckingforegrep.../c/PSDK3v3/mingw/msys/1.0/bin/grep-EcheckingforANSICheaderfiles...yescheckingforsys/types.h...yescheckingforsys/stat.h...yescheckingforstdlib.h...yescheckingforstring.h...yescheckingformemory.h...yescheckingforstrings.h...yescheckingforinttypes.h...yescheckingforstdint.h...yescheckingforunistd.h...yescheckingarpa/inet.husability...nocheckingarpa/inet.hpresence...nocheckingforarpa/inet.h...nocheckingfcntl.husability...yescheckingfcntl.hpresence...yescheckingforfcntl.h...yescheckingforinttypes.h...(cached)yescheckinglimits.husability...yescheckinglimits.hpresence...yescheckingforlimits.h...yescheckingforstdint.h...(cached)yescheckingforstdlib.h...(cached)yescheckingforstring.h...(cached)yescheckingforunistd.h...(cached)yescheckingforinline...inlinecheckingforoff_t...yescheckingforsize_t...yescheckingforuint16_t...yescheckingforuint32_t...yescheckingforuint64_t...yescheckingforuint8_t...yescheckingforstdlib.h...(cached)yescheckingforGNUlibccompatiblemalloc...yescheckingforstdlib.h...(cached)yescheckingforunistd.h...(cached)yescheckingforsys/param.h...yescheckingforgetpagesize...yescheckingforworkingmmap...nocheckingforstdlib.h...(cached)yescheckingforGNUlibccompatiblerealloc...yescheckingforgetpagesize...(cached)yescheckingformemset...yescheckingforstrrchr...yescheckingforstrstr...yescheckingforstrtoul...yescheckingforstrtoull...yesconfigure:creating./config.statusconfig.status:creatingMakefileconfig.status:creatingconfig.hconfig.status:executingdepfilescommandsErikP@ErikPshat~/ps3tools/trunk$makemakeall-ammake[1]:Enteringdirectory`/home/ErikP/ps3tools/trunk'CCtools.oIn file included from tools.c:29:0:common.h:44:0:предупреждение:"ERROR"redefinedc:\psdk3v3\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/wingdi.h:313:0:замечание:thisisthelocationofthepreviousdefinitionCCaes.oCCsha1.oCCec.oCCbn.oCCmingw_mmap.omingw_mmap.c:Вфункции'mingw_mmap':mingw_mmap.c:38:31:предупреждение:приведениевызовафункциитипа'long int'кнесоответствующемутипу'void *'CCsceverify.oCCLDsceverify.exeCCreadself.oCCLDreadself.exeCCreadself2.oCCLDreadself2.exeCCunself.oCCLDunself.exeCCself.oself.c:Вфункции'self_load_sections':self.c:319:14:предупреждение:'size'maybeuseduninitializedinthisfunctionCCunself2.oCCLDunself2.exeCCmakeself.oCCLDmakeself.exeCCself_rebuilder.oCCLDself_rebuilder.exeCCungpkg.oCCLDungpkg.exeCCnorunpack.oCCLDnorunpack.exeCCpupunpack.oCCLDpupunpack.exeCCpuppack.oCCLDpuppack.exeCCunpkg.oCCLDunpkg.exeCCpkg.oCCLDpkg.exeCCcosunpkg.oCCLDcosunpkg.exeCCcospkg.oCCLDcospkg.exeCCcosunpack.oCCLDcosunpack.exeCCundat.oCCLDundat.exeCCdat.oCCLDdat.exeCCunspp.oCCLDunspp.exeCCeidsplitr.oeidsplitr.c:6:1:предупреждение:nopreviousprototypefor'DumpEidData'eidsplitr.c:Вфункции'main':eidsplitr.c:62:6:предупреждение:'pPrefix'maybeuseduninitializedinthisfunctionCCLDeidsplitr.exeCCspp.oCCLDspp.exeCCscekrit.oCCLDscekrit.exemake[1]:Leavingdirectory`/home/ErikP/ps3tools/trunk'ErikP@ErikPshat~/ps3tools/trunk
Накомпилировалась целая куча утилит, думаю полезных, залил в шапку. Вот список:
ps3tools
cospkg.exe
cosunpack.exe
cosunpkg.exe
dat.exe
eidsplitr.exe
makeself.exe
norunpack.exe
pkg.exe
puppack.exe
pupunpack.exe
readself.exe
readself2.exe
scekrit.exe
sceverify.exe
self_rebuilder.exe
spp.exe
undat.exe
ungpkg.exe
unpkg.exe
unself.exe
unself2.exe
unspp.exe
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Каким образом выдёргивать и откуда вообще брать эти флаги, пока не имею понятия. А этот флаг я взял от SELF Resigner, там подпись идёт под 4.10, на что намекают цифры в коде. Думаю там несколько флагов по 8 байт:
PS: Я понял так, если все патчи для игр привязаны к LIC.DAT значит они все же имеют лицензию. Значит нужно пытаться переподписать приложение или игру которая не имеет никакой привязки. Тогда нам должна улыбнуться удача.