Как выдрать IPL в декриптованном виде? А именно, в этом IPL лежит файлик в GZIP-формате main.bin из которого извлекается payload.bin. Так вот, ключи к ядру прошивки лежат именно в нём.
Говорят, что можно сдампить декриптованный IPL прямо во время загрузки ядра, в тот момент, когда PRE-IPL в кирке декриптует IPL. А как пойдёт загрузка системы, то ипл стирается из памяти моментом.
У меня уже есть полная коллекция всех ключей включая 5.50. Но вот фактически по одному ключу к каждой модели к системным файлам, даже для 5.50 ни у кого нет до сих пор.
Вот здесь, кстати, ребята уже этот вопрос обсуждали, но я что-то никак не въеду, каким макаром они там что-то ковыряют =)
И здесь что-то непонятное написано: http://forums.ps2dev.org/viewtopic.php?t=3573
Кстати, вот СильверСпринг выложил тут рабочий код, как он говорит, для декриптовки IPL 6.00.
void decryptBuffer(void *seed, int seedSize, u8 *secretKey1, u8 *secretKey2, void *buf, int bufSize)
{
Sfmt19937Ctx ctx;
u8 hmac[28];
u8 xorKey[28];
u8 randomNum[64];
int i, j;
// generate hmac of the seed to be used for initial prng state
sha224Hmac(secretKey1, 64, seed, seedSize, &hmac);
// setup seed state of the pseudo random number generator
u32 *seedArray = (u32*)hmac;
int seedArrayLen = sizeof(hmac)/sizeof(hmac[0]);
sfmt19937Init(&ctx, seedArray, seedArrayLen);
// clear hmac after use
memset(&hmac, 0, sizeof(hmac));
// for each 28-bytes of ciphertext
for (i=0; i<bufSize; i+=28)
{
// generate 64-bytes random number
u32 *r = (u32*)randomNum;
for (j=0; j<16; j++)
r[j] = sfmt19937Uint(&ctx);
// generate 28-byte xor key from the random number
sha224Hmac(secretKey2, 64, randomNum, sizeof(randomNum), &xorKey);
// if ciphertext less than 28-bytes left
if ((bufSize > i) && (bufSize < i+28))
{
// xor remaining bytes to get final plaintext
for (j=0; i+j<bufSize; j++)
*(u8*)(buf+i+j) ^= *(u8*)(xorKey+j);
}
else
{
// xor 28-byte block to get final plaintext
for (j=0; j<28; j+=4)
*(u32*)(buf+i+j) ^= *(u32*)(xorKey+j);
}
}
// clear all buffers
memset(&randomNum, 0, sizeof(randomNum));
memset(&xorKey, 0, sizeof(xorKey) );
memset(&ctx, 0, sizeof(ctx) );
}
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 21.02.2010 в 23:46.
Так-то принцип понятен, только сдается мне, что этот код условный, а не рабочий. Т.к. вообще не понятно что за тип данных Sfmt19937Ctx (может это вообще структура), непонятно что за функции sha224Hmac, sfmt19937Init, sfmt19937Uint. Они похоже как раз и условные, так как в сдк их нет, а самому написать их я сомневаюсь что возможно.
mc707, ну он писал, что как раз в 6.00 они изменили способ шифрования.
Теперь загрузка IPL происходит по другому адресу 0x040EC000 вместо прежнего на 5.50 - 0x040F0000.
Изменили шифрование с SHA256 на SHA224.
И standard MT19937 prng to SIMD-oriented fast MT prng
Ну может он принцип условно расписал. Он же всё намёками )). Но вроде говорит, что это рабочий код и типа его нужно подменить вместо прежнего. Кстати, если что, его последний IPL-декриптер вместе с исходниками здесь.
Так-то принцип понятен, только сдается мне, что этот код условный, а не рабочий. Т.к. вообще не понятно что за тип данных Sfmt19937Ctx (может это вообще структура), непонятно что за функции sha224Hmac, sfmt19937Init, sfmt19937Uint. Они похоже как раз и условные, так как в сдк их нет, а самому написать их я сомневаюсь что возможно.
это как раз понятно, это стандартные процедуры, можно их реализацию найти по названиям, MT19937 - псевдослучайный генератор, SHA224 - 28-байтный хэш. hmac - делает хэш от нескольких источников, как бы один ключ второй данные, но раскриптовать нельзя, одностороннее с потерями
- из первого ключа и пришедшего с preipl сида делаем хэш
- этим хэшем инитим псевдослучайный генератор.
- в цикле:
--- берем с генератора 64 байта
--- из второго ключа и этих 64 байт делаем второй хэш
--- ксорим им 28-байтный кусок данных
алгоритм полностью воспроизводим, но сид видимо можно добыть только расковыряв pre-ipl, про ключи тоже непонятно но вроде они во флеше а не в pre ipl
- из первого ключа и пришедшего с preipl сида делаем хэш
- этим хэшем инитим псевдослучайный генератор.
- в цикле:
--- берем с генератора 64 байта
--- из второго ключа и этих 64 байт делаем второй хэш
--- ксорим им 28-байтный кусок данных
алгоритм полностью воспроизводим, но сид видимо можно добыть только расковыряв pre-ipl, про ключи тоже непонятно но вроде они во флеше а не в pre ipl
че то автор то ли намеренно тумана напустил, то ли алгоритм поменялся в 6.00. гсч инитится константой BFC00040 (именно этой константой, а не лежащими по этому адресу данными) а не приходит с preipl. а сам алгоритм похож, sha224 там действительно есть, а вот MT19937 в каком-то модифицированном виде. похоже можно раскриптовать ipl будет без дополнительной инфы, имея только предварительно декриптованный заголовок dec_ipl
rustot, в 6.00 поменялся адрес IPL. По моему он сдвинулся на один байт, ну и алгоритм cha поменялся.
Там-же, на максконсоли СильверСпринг об этом подтвердил. Что он выложил туфту, я не верю, потому как это очень профессиональный кодер. Он полный SDK по Нидам раскопал до 5.00 прошивки и ещё много чего на PSPDEV.
Так что, я думаю, что код он выложил правильный, т.к. фейки пускать не в его правилах. Просто может он написал псевдокод, в котором нужно подставить нужные значения. Наверное он как-бы даёт намёки, для тех, кто в этом понимает. Его декриптер IPL есть в сети, причём с исходниками, так что можно его подправить и потестить.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
rustot, в 6.00 поменялся адрес IPL. По моему он сдвинулся на один байт, ну и алгоритм cha поменялся.
не, он сдвинулся на 16к, с 40F0000 на 40EC000, а раскриптовываные данные складываются как раз по старому адресу 40F0000. видимо действительно алгоритм поменялся, но странно что в сторону упрощения. то что он описывал как 'mt19937 seed comes from pre-ipl context' делало задачу декриптования почти неразрешимой
а вот то что раскриптовывает данные именно на старый адрес навевает мрачные подозрения, что это просто еще один уровень криптования добавили. и после декриптовки в 40F0000 окажется опять старый и по старому криптованный ipl
rustot добавил 11-02-2010 в 01:06
вот трэйс как mt инитится
0x040EC050: $a0 = 0xBFC00040
0x040F007C: jal sub_040ED15C -- главная процедура декриптования
0x040ED170: move $a1, $a0
0x040ED1D8: jal sub_040EE494 -- инит mt19937
0x040F24A0: sw $a1, 4($a0) -- вот seed складываем в первый элемент
Последний раз редактировалось rustot; 11.02.2010 в 01:06.
Причина: добавил, подумав
rustot, эмм, ну сам понимаешь, что инструкции декриптовки в PRE-IPL заложены в ядро процессора ещё на заводе. Так что поменять механизм декриптовки уже никак не получится Sony. Только выпустив новый процессор. Хотя они могли сделать задел на будущее и заранее заложить несколько разновидностей инструкций декриптовки.
Поэтому я не представляю, что там можно поменять в шифровании. Вероятно действительно решили воспользоваться следующей второй зарезервированной инструкцией. А может заложили это программным методом в IPL. В принципе, даже если они сдвинули IPL, то и старый дешифратор его всё равно найдёт. А уже по скрамблер-коду, заложенному в IPL, определит метод шифрования. И PRE-IPL получит инструкции из самого IPL.
Вот я тоже думаю, что данные Ксорятся. Но для XOR нужен ключ - или однобайтовый или состоящий из точно такого-же количества байт, как и область дешифровки.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
не, я же играюсь уже с первоначально декриптованным ipl. тот что известен как dec_ipl.bin. preipl его уже считал с флэшки, раскриптовал и положил в память. кто-то когда-тоя научился этот процесс воспроизводить и я пользуюсь результатом
но этот ipl декриптован лишь слегка, первые 8к нормального кода, а остальное опять криптовано и раскриптовывают его уже эти 8к кода, без участия pre_ipl. вот это я и пытаюсь раскриптовать. вот с этой криптовкой сони вольны играть произвольно от версии к версии, совместимость с preipl от этого не меняется
rustot, ну в принципе у меня есть тоже самое. IPL от 6.20, в котором декриптуется только начало, а всё остальное фигвам.
Вообщем задача состоит в том, что нам нужен файл main.bin, который лежит в IPL, и причём лежит он там в GZIP-архиве, почти в начале.
Вот в этом файле лежит главный 16-байтный ключ декриптовки системных файлов прошивки. Для каждой модели FAT, SLIM, BRITE он свой отдельный. Получается, для каждой прошивки требуется 3 ключа, чтобы декриптовать все системные файлы EBOOT.PBP прошивки.
А в системных файлах лежат уже сотня ключей декриптовки игр, несистемных файлов, и всего прочего.
Говорят, что этот main.bin выползает наружу и вынимает из кармана свой ключ во время включения PSP, чтобы расшифровать системные файлы и запустить прошивку. После этого он стирается из памяти.
Вот у меня и болит голова, каким-же образом снять дамп памяти во время загрузки???
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
rustot, ну так PSARDumper 6.20 его вытаскивает и декриптует начало. Точно так-же, как и Simple_IPL_Decript от Сильвера.
Они складываются в папку "PSARDUMPER".
Недекриптованный IPL вытаскивается вполне корректно в файлы:
nandipl_01g.bin
nandipl_02g.ipl
nandipl_03g.ipl
А декриптованные делятся на три части и сохраняются как:
part1_nandipl_01g.bin
part2_nandipl_01g.bin
part3_nandipl_01g.bin
part1_nandipl_02g.ipl
part2_nandipl_02g.ipl
part3_nandipl_02g.ipl
Хотя, как я понял, это не делёж на три части, а:
Преддекриптовка
Декриптовка
Последекриптовка
То есть, производится попытка декриптовать IPL 3-мя проходами, ну или разными способами.
rustot, ты хоть зарегистрируйся что-ли нормально или активируй свой аккаунт. А то сидишь, как "Гость".
Наверное при регистрации указал, что тебе меньше 13-ти, вот и кукуешь. Или просто в личном кабинете нужно что-то настроить.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 11.02.2010 в 02:32.
так это ж для psp а не для pc дампер, а ломаной psp у меня нет
Ах, сорри. Я забыл, что у тебя даже PSP с виртуалкой нет.
Тогда вот. Полностью разложенные и декриптованные PSARDumper-om файлы 6.20: http://slil.ru/28635506
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Ах, сорри. Я забыл, что у тебя даже PSP с виртуалкой нет.
Тогда вот. Полностью разложенные и декриптованные PSARDumper-om файлы 6.20: http://slil.ru/28635506
ага, спасибо, значит можно не париться пока и продолжать ковырять 6.0. потому-что декриптованная часть кода отличается от 6.2 всего восемью байтиками. потом просто сравню и проверю про что они.
rustot добавил 12-02-2010 в 23:57
блин, чтоб раскриптовать нужен дамп памяти BFC00000-BFC04000 на момент запуска ipl, то есть это может сделать только самопальный ipl. кто-нибудь занимался этим?
rustot добавил 13-02-2010 в 00:13
точнее BFC00000-BFC01000. нужно собрать с iplsdk дампер этого куска памяти в файл. в инете готовый не могу найти
Последний раз редактировалось rustot; 13.02.2010 в 00:13.
Причина: добавил, подумав
точнее BFC00000-BFC01000. нужно собрать с iplsdk дампер этого куска памяти в файл. в инете готовый не могу найти
Думаю в исходниках поменять адреса не создаст проблем.
А как вот снять дамп во время запуска PSP?
Например, после запуска, снять дамп памяти легко.
То есть, ты имеешь ввиду, что нужно в IPL подсунуть команду на запуск дампера?
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Думаю в исходниках поменять адреса не создаст проблем.
А как вот снять дамп во время запуска PSP?
Например, после запуска, снять дамп памяти легко.
То есть, ты имеешь ввиду, что нужно в IPL подсунуть команду на запуск дампера?
надо собственный ipl сделать, который сделает дамп. родной ipl эту область после работы затирает, так что позже дампить уже бесполезно.
или из под готового ipl - PSP MS MultiLoader из sdk запустить програмку которая сдампит, я надеюсь этот хакерский ipl память не трет. или его модифицировать чтоб сам сдампил
int main(void)
{
pspDebugScreenInit();
SetupCallbacks();
printf("Kernel mem dumper. TyRaNiD 2k5.\n");
printf("Props to nem, mrbrown, adresd et al\n\n");
dump_cop0_regs();
printf("Dumping Boot Mem 0xBFC00000 -> 0xBFD00000\n");
dump_memregion("ms0:/boot.bin", (void*) 0xBFC00000, 0x100000);
printf("Dumping Kernel Mem 0x88000000 -> 0x883FFFFF\n");
dump_memregion("ms0:/kmem.bin", (void*) 0x88000000, 0x400000);
printf("Done\n");
/* Exit the thread, this will allow the exit callback to work */
sceKernelExitDeleteThread(0);
return 0;
}
Нужно поменять на это?:
int main(void)
{
pspDebugScreenInit();
SetupCallbacks();
printf("Kernel mem dumper. TyRaNiD 2k5.\n");
printf("Props to nem, mrbrown, adresd et al\n\n");
dump_cop0_regs();
printf("Dumping Boot Mem 0xBFC00000 -> 0xBFC01000\n");
dump_memregion("ms0:/boot.bin", (void*) 0xBFC00000, 0x1000);
printf("Dumping Kernel Mem 0x88000000 -> 0x883FFFFF\n");
dump_memregion("ms0:/kmem.bin", (void*) 0x88000000, 0x400000);
printf("Done\n");
/* Exit the thread, this will allow the exit callback to work */
sceKernelExitDeleteThread(0);
return 0;
}
У меня появилась идея, как запустить дампер из IPL.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
это единственное чего мне сейчас не хватает, код я весь расковырял и распаковать знаю как. а что это за процедурка, кто-то уже дампил что ли? подойдет от любой версии psp, эти данные не могут меняться, иначе бы прошивки были несовместимы с разными моделями
rustot, не совсем понял тебя, чего не хватает, какой код расковырял и как распаковал )))
Про процедурку - это исходник KDumper из PSPSDK. В принципе изначально он видать всю память дампит с запасом, аж на 100'000 единиц.
А запустить я думаю вот как. Например взять кастомный IPL от 5.50GEN.
Он начинается с области пред-IPL, которая как раз и есть кастомная - это просто-напросто файл pspbtcnf.bin, в котором записаны пути к системным файлам прошивки и метки режимов, какой файл в каком режиме имеет право запускаться.
После этого файлика pspbtcnf.bin идёт начало официального IPL, т.е. оффIPL в кастомпрошивке получается сдвинутым далее, по сравнению с IPL без кастомобласти, т.е. официальной прошивки.
То есть, можно добавить в него (pspbtcnf.bin) строчку с путём к дамперу. И при запуске IPL, тут-же сработает дампер, снимет память и сохранит на карточку или во Flash0.
Прошу любить и жаловать, Ваш Добро пожаловать в наш Чат в Telegram
Последний раз редактировалось ErikPshat; 13.02.2010 в 03:45.