PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   PSP хакинг и девелопмент (https://www.pspx.ru/forum/forumdisplay.php?f=195)
-   -   Декриптовка IPL (https://www.pspx.ru/forum/showthread.php?t=86507)

ErikPshat 12.01.2010 10:28

Как выдрать 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.

mc707, может что-нибудь придумаешь:

Код
http://www.maxconsole.net/forums/sho...91#post1178191
Код:

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)      );
}


mc707 12.01.2010 23:19

Цитата:

Сообщение от ErikPshat (Сообщение 859852)
mc707, может что-нибудь придумаешь

Так-то принцип понятен, только сдается мне, что этот код условный, а не рабочий. Т.к. вообще не понятно что за тип данных Sfmt19937Ctx (может это вообще структура), непонятно что за функции sha224Hmac, sfmt19937Init, sfmt19937Uint. Они похоже как раз и условные, так как в сдк их нет, а самому написать их я сомневаюсь что возможно.

ErikPshat 13.01.2010 02:11

mc707, ну он писал, что как раз в 6.00 они изменили способ шифрования.
  • Теперь загрузка IPL происходит по другому адресу 0x040EC000 вместо прежнего на 5.50 - 0x040F0000.
  • Изменили шифрование с SHA256 на SHA224.
  • И standard MT19937 prng to SIMD-oriented fast MT prng
Ну может он принцип условно расписал. Он же всё намёками )). Но вроде говорит, что это рабочий код и типа его нужно подменить вместо прежнего. Кстати, если что, его последний IPL-декриптер вместе с исходниками здесь.

Здесь ещё интересная тема. И здесь тоже.

rustot 05.02.2010 16:34

Цитата:

Сообщение от mc707 (Сообщение 860019)
Так-то принцип понятен, только сдается мне, что этот код условный, а не рабочий. Т.к. вообще не понятно что за тип данных Sfmt19937Ctx (может это вообще структура), непонятно что за функции sha224Hmac, sfmt19937Init, sfmt19937Uint. Они похоже как раз и условные, так как в сдк их нет, а самому написать их я сомневаюсь что возможно.

это как раз понятно, это стандартные процедуры, можно их реализацию найти по названиям, MT19937 - псевдослучайный генератор, SHA224 - 28-байтный хэш. hmac - делает хэш от нескольких источников, как бы один ключ второй данные, но раскриптовать нельзя, одностороннее с потерями

- из первого ключа и пришедшего с preipl сида делаем хэш
- этим хэшем инитим псевдослучайный генератор.
- в цикле:
--- берем с генератора 64 байта
--- из второго ключа и этих 64 байт делаем второй хэш
--- ксорим им 28-байтный кусок данных

алгоритм полностью воспроизводим, но сид видимо можно добыть только расковыряв pre-ipl, про ключи тоже непонятно но вроде они во флеше а не в pre ipl

rustot 10.02.2010 23:53

Цитата:

Сообщение от rustot (Сообщение 865112)
- из первого ключа и пришедшего с preipl сида делаем хэш
- этим хэшем инитим псевдослучайный генератор.
- в цикле:
--- берем с генератора 64 байта
--- из второго ключа и этих 64 байт делаем второй хэш
--- ксорим им 28-байтный кусок данных

алгоритм полностью воспроизводим, но сид видимо можно добыть только расковыряв pre-ipl, про ключи тоже непонятно но вроде они во флеше а не в pre ipl

че то автор то ли намеренно тумана напустил, то ли алгоритм поменялся в 6.00. гсч инитится константой BFC00040 (именно этой константой, а не лежащими по этому адресу данными) а не приходит с preipl. а сам алгоритм похож, sha224 там действительно есть, а вот MT19937 в каком-то модифицированном виде. похоже можно раскриптовать ipl будет без дополнительной инфы, имея только предварительно декриптованный заголовок dec_ipl

ErikPshat 11.02.2010 00:06

rustot, в 6.00 поменялся адрес IPL. По моему он сдвинулся на один байт, ну и алгоритм cha поменялся.

Там-же, на максконсоли СильверСпринг об этом подтвердил. Что он выложил туфту, я не верю, потому как это очень профессиональный кодер. Он полный SDK по Нидам раскопал до 5.00 прошивки и ещё много чего на PSPDEV.

Так что, я думаю, что код он выложил правильный, т.к. фейки пускать не в его правилах. Просто может он написал псевдокод, в котором нужно подставить нужные значения. Наверное он как-бы даёт намёки, для тех, кто в этом понимает. Его декриптер IPL есть в сети, причём с исходниками, так что можно его подправить и потестить.

rustot 11.02.2010 01:06

Цитата:

Сообщение от ErikPshat (Сообщение 866555)
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 складываем в первый элемент

ErikPshat 11.02.2010 01:09

rustot, эмм, ну сам понимаешь, что инструкции декриптовки в PRE-IPL заложены в ядро процессора ещё на заводе. Так что поменять механизм декриптовки уже никак не получится Sony. Только выпустив новый процессор. Хотя они могли сделать задел на будущее и заранее заложить несколько разновидностей инструкций декриптовки.

Поэтому я не представляю, что там можно поменять в шифровании. Вероятно действительно решили воспользоваться следующей второй зарезервированной инструкцией. А может заложили это программным методом в IPL. В принципе, даже если они сдвинули IPL, то и старый дешифратор его всё равно найдёт. А уже по скрамблер-коду, заложенному в IPL, определит метод шифрования. И PRE-IPL получит инструкции из самого IPL.

Вот я тоже думаю, что данные Ксорятся. Но для XOR нужен ключ - или однобайтовый или состоящий из точно такого-же количества байт, как и область дешифровки.

rustot 11.02.2010 01:25

не, я же играюсь уже с первоначально декриптованным ipl. тот что известен как dec_ipl.bin. preipl его уже считал с флэшки, раскриптовал и положил в память. кто-то когда-тоя научился этот процесс воспроизводить и я пользуюсь результатом

но этот ipl декриптован лишь слегка, первые 8к нормального кода, а остальное опять криптовано и раскриптовывают его уже эти 8к кода, без участия pre_ipl. вот это я и пытаюсь раскриптовать. вот с этой криптовкой сони вольны играть произвольно от версии к версии, совместимость с preipl от этого не меняется

ErikPshat 11.02.2010 01:35

rustot, ну в принципе у меня есть тоже самое. IPL от 6.20, в котором декриптуется только начало, а всё остальное фигвам.

Вообщем задача состоит в том, что нам нужен файл main.bin, который лежит в IPL, и причём лежит он там в GZIP-архиве, почти в начале.

Вот в этом файле лежит главный 16-байтный ключ декриптовки системных файлов прошивки. Для каждой модели FAT, SLIM, BRITE он свой отдельный. Получается, для каждой прошивки требуется 3 ключа, чтобы декриптовать все системные файлы EBOOT.PBP прошивки.

А в системных файлах лежат уже сотня ключей декриптовки игр, несистемных файлов, и всего прочего.

Говорят, что этот main.bin выползает наружу и вынимает из кармана свой ключ во время включения PSP, чтобы расшифровать системные файлы и запустить прошивку. После этого он стирается из памяти.

Вот у меня и болит голова, каким-же образом снять дамп памяти во время загрузки???

rustot 11.02.2010 02:13

а можно мне dec_ipl от 6.20 заполучить? а то че я 6.0 ковыряю, я думал 6.20 еще не вытащили

ErikPshat 11.02.2010 02:27

rustot, ну так PSARDumper 6.20 его вытаскивает и декриптует начало. Точно так-же, как и Simple_IPL_Decript от Сильвера.

Они складываются в папку "PSARDUMPER".
Недекриптованный IPL вытаскивается вполне корректно в файлы:
  1. nandipl_01g.bin
  2. nandipl_02g.ipl
  3. nandipl_03g.ipl
А декриптованные делятся на три части и сохраняются как:
  1. part1_nandipl_01g.bin
  2. part2_nandipl_01g.bin
  3. part3_nandipl_01g.bin
  1. part1_nandipl_02g.ipl
  2. part2_nandipl_02g.ipl
  3. part3_nandipl_02g.ipl
Хотя, как я понял, это не делёж на три части, а:
  1. Преддекриптовка
  2. Декриптовка
  3. Последекриптовка
То есть, производится попытка декриптовать IPL 3-мя проходами, ну или разными способами.

rustot, ты хоть зарегистрируйся что-ли нормально или активируй свой аккаунт. А то сидишь, как "Гость".
Наверное при регистрации указал, что тебе меньше 13-ти, вот и кукуешь. Или просто в личном кабинете нужно что-то настроить.

rustot 12.02.2010 00:04

Цитата:

Сообщение от ErikPshat (Сообщение 866576)
rustot, ну так PSARDumper 6.20 его вытаскивает и декриптует начало. Точно так-же, как и Simple_IPL_Decript от Сильвера.

так это ж для psp а не для pc дампер, а ломаной psp у меня нет

ErikPshat 12.02.2010 09:21

Цитата:

Сообщение от rustot (Сообщение 866729)
так это ж для psp а не для pc дампер, а ломаной psp у меня нет

Ах, сорри. Я забыл, что у тебя даже PSP с виртуалкой нет.
Тогда вот. Полностью разложенные и декриптованные PSARDumper-om файлы 6.20: http://slil.ru/28635506

rustot 13.02.2010 00:13

Цитата:

Сообщение от ErikPshat (Сообщение 866773)
Ах, сорри. Я забыл, что у тебя даже 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 дампер этого куска памяти в файл. в инете готовый не могу найти

ErikPshat 13.02.2010 02:00

Цитата:

Сообщение от rustot (Сообщение 866777)
точнее BFC00000-BFC01000. нужно собрать с iplsdk дампер этого куска памяти в файл. в инете готовый не могу найти

Думаю в исходниках поменять адреса не создаст проблем.
А как вот снять дамп во время запуска PSP?
Например, после запуска, снять дамп памяти легко.
То есть, ты имеешь ввиду, что нужно в IPL подсунуть команду на запуск дампера?

rustot 13.02.2010 02:47

Цитата:

Сообщение от ErikPshat (Сообщение 866939)
Думаю в исходниках поменять адреса не создаст проблем.
А как вот снять дамп во время запуска PSP?
Например, после запуска, снять дамп памяти легко.
То есть, ты имеешь ввиду, что нужно в IPL подсунуть команду на запуск дампера?

надо собственный ipl сделать, который сделает дамп. родной ipl эту область после работы затирает, так что позже дампить уже бесполезно.

или из под готового ipl - PSP MS MultiLoader из sdk запустить програмку которая сдампит, я надеюсь этот хакерский ipl память не трет. или его модифицировать чтоб сам сдампил

ErikPshat 13.02.2010 03:19

rustot, вот здесь:

Код:

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.

rustot 13.02.2010 03:30

это единственное чего мне сейчас не хватает, код я весь расковырял и распаковать знаю как. а что это за процедурка, кто-то уже дампил что ли? подойдет от любой версии psp, эти данные не могут меняться, иначе бы прошивки были несовместимы с разными моделями

ErikPshat 13.02.2010 03:43

rustot, не совсем понял тебя, чего не хватает, какой код расковырял и как распаковал )))

Про процедурку - это исходник KDumper из PSPSDK. В принципе изначально он видать всю память дампит с запасом, аж на 100'000 единиц.

А запустить я думаю вот как. Например взять кастомный IPL от 5.50GEN.

Он начинается с области пред-IPL, которая как раз и есть кастомная - это просто-напросто файл pspbtcnf.bin, в котором записаны пути к системным файлам прошивки и метки режимов, какой файл в каком режиме имеет право запускаться.

После этого файлика pspbtcnf.bin идёт начало официального IPL, т.е. оффIPL в кастомпрошивке получается сдвинутым далее, по сравнению с IPL без кастомобласти, т.е. официальной прошивки.

То есть, можно добавить в него (pspbtcnf.bin) строчку с путём к дамперу. И при запуске IPL, тут-же сработает дампер, снимет память и сохранит на карточку или во Flash0.


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

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