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.

rustot 13.02.2010 03:58

не хватает BCF00000-BCF00FFF для того чтобы раскриптовать IPL, вытащить из него тот самый main.bin. расковырял соответственно код ipl которые все это декриптует и распаковывает, знаю алгоритм, знаю все ключи, кроме того единственного что остался в BCF00000 от предзагрузчика

только дампер не должен пользоваться системными вызовами для доступа к файлам, потому-что в этот момент системы в памяти еще нет. в iplsdk для этого есть собственная либа с поддержкой fat32. то есть взять iplsdk, собрать кастомный ipl, проверить что он запускается. потом поправить его, вставив куда-нибудь вызов:

ms_save_file('ms0:/ipl/bcf_dump.bin, (const char*)0xBCF00000, 0x1000)

и запустить снова

ErikPshat 13.02.2010 04:12

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

Ну а ты сможешь реализовать это с iplsdk. И где его взять, я что-то у себя не нашёл?

Кстати, можешь пока посмотреть, как выглядет main.bin в проше 2.00: https://www.pspx.ru/forum/attachment....9&d=1263976309
Не знаю, хватит у тебя прав скачать с секретного отдела.

rustot 13.02.2010 04:34

так а я то что с этим всем буду делать? у меня же нет ломаной psp чтобы я мог на ней ipl собственного изготовления стартануть. старый main.bin мне ничем не поможет, тот кто его смог вытащить стопудово сдампил для этого BCF00000 но вот в открытый доступ не выложил

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

iplsdk.7z я не помню где отдельно видел, но он есть например внутри этого архива - http://narod.ru/disk/13354518000/371...ndDump.7z.html (только архив огромный, 300 мег)

rustot добавил 13-02-2010 в 04:29
еще желательно перед дампом вставить код

REG32(0xBC100050) |= 0x7000
REG32(0xBC100078) |= 2
REG32(0xBE24000C) = 1
REG32(0xBE240000) |= 1
REG32(0xBC10007C) |= 1

это код из оригинального ipl, перед тем как он начинает читать из BFC00000, вполне возможно что этот код изменяет карту памяти и без него этот адрес не будет досупен

rustot добавил 13-02-2010 в 04:34
офигеть, только сейчас заметил, там уже есть этот код!

int main(void)
{
Kprintf("ENTER:%s\n",__title__);
...
ms_save_file(BIOS_FILE_NAME,(void *)0xbfc00000,0x1000);
}

то есть достаточно это дело запустить так как в ридмишке написано и на стике появится /psp_bios.bin, который мне и нужен

ErikPshat 13.02.2010 04:39

rustot, не понимаю, как ты что-то там ковыряешь. не имея прошитой PSP :D
Нужно ведь ещё проверять.

А этот архив-же мой и есть ))). Это я дампил все IPL-ы от своей PSP и выложил для тренировок. Ты отсюда наверное его стянул: https://www.pspx.ru/forum/showthread....352#post822352 И что, там есть iplsdk ))). Ща гляну.

А дампил main.bin от 2.00 тоже я. Зачем выкладывать в открытый доступ. У нас есть скрытый раздел для хакеров, так что мы там кое-какие секреты обсуждаем и выкладываем.

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

rustot 13.02.2010 04:43

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

зарегиться я не могу нормально там че то глючит, считает что мне 13 лет независимо от введеной даты

ErikPshat 13.02.2010 04:52

Ну ты мне тогда дай инструкции к действию, а то я уже подзабыл, что-где у меня лежит и о чём разговор ))). И лучше бы ты код, который нужно вставить сразу добавил бы в iplsdk, а я его сам скомпилю. А то мне нужно всё поднять и вникнуть поглубже.

rustot 13.02.2010 05:16

Декриптовка IPL
 
да не нужно ничего вставлять и компилить. в iplsdk есть каталог ML_BIOS_DUMPER и там лежит именно та прога которую нужно запустить, и она создаст файл /psp_boot.bin на флешке, который мне и нужен

судя по тому что написано в ридмишке, нужно установить кастомный ipl_ms.bin, так же как его ставят когда ломают, каким то там батником. потом pspboot.bin скопировать в ms0:/ipl/ipl.bin, загрузиться с нажатым LTRG (это я не понял что такое L+R что ли?

rustot добавил 13-02-2010 в 05:08
или как вариант прописать этот pspboot.bin в тот самый pspbtcnf.bin

rustot добавил 13-02-2010 в 05:16
вот мультилоадер с инсталяшкой http://dl.qj.net/download/psp-ms-multiloader-ipl.html. вот после его установки и надо будет подсунуть ipl.bin из iplsdk/ML_BIOS_DUMPER

ErikPshat 13.02.2010 05:22

rustot, я понял, о чём ты мне всё рассказывал. Всё это про изготовление комплекта Пандоры. Чтобы записать загрузчик в скрытую область на карту памяти. Щас я глянул эти sdk про LTRG, про pspboot.bin.
Это немного из другой оперы ))). Всё это я когда-то, года 2 назад, знал и юзал наизусть )

Но мысль вообще в правильном направлении.
А Пандора и TimeMachine сейчас делаются более современными методами.

Чтобы тебе более вникнуть в суть, то нужно посмотреть эту тему: https://www.pspx.ru/forum/showthread.php?t=77904
Там в "Способе №2. Для PSP с официальной прошивкой", залей себе файлы Пандоры на карту памяти. Они извлекаются из программы "PSPGrader".
Просто, для изучения. Это тебе наверняка поможет и натолкнёт на путь истинный. Ты посмотришь и сравнишь IPL на карте памяти с теми, которые я дампил из Nanda.
  1. Фактически это прошивка, которая запускается с карточки памяти.
  2. В папке ms0:/TM/DC8/ увидишь IPL-ы для Фатки и Слимки (ipl_01g.bin и ipl_02g.bin) - это почти такие-же, которые записываются в нанд кастомпрошивки 5.00 М33.
  3. И ещё там есть просто ipl.bin - это какой-то пред-IPL.
  4. Когда батарея запандорена, то идёт обращение к мультизагрузчику, как бы MBR в скрытой области карты памяти, он называется TM-IPL или раньше был Booster-IPL и есть ещё куча разновидностей. Он как раз не использует системные файлы, а работает на процессорном ассемблерном коде. Он реагирует на нажатую кнопку LTRG и при её обнаружении считывает путь из текстовика в файле ms0:/TM/config.txt, в котором записан исполняемый путь: L = "/TM/DC8/ipl.bin";
  5. После запуска ipl.bin, происходит элементарная проверка на модель PSP и в зависимости от модели происходит запуск одного из кастомных IPL - ipl_01g.bin или ipl_02g.bin.
  6. А они запускают файлы ms0:/kd/lfatfs.prx и ms0:TM/DC8/tmctrl500.prx, который запускает файл пандоры ms0:/TM/DC8/KD/resurrection.prx
    Из него вытекает всё меню Пандоры с вытекающими.
  7. Когда в меню Пандоры запускаешь пункт "Test M33", то через перезагрузку вызывается ipl_0xg.bin, в котором находится файл pspbtcnf.bin, после которого начинается официальный IPL, который запускает все кастомные файлы прошивки с карты памяти и официальную прошивку.
  8. Вот тут и происходит загрузка прошивки. В этот момент нужно дампить память.
А ещё лучше наверное экспериментировать с TimeMachine. В ней можно держать на карте несколько прошивок. И там немного по другому всё это работает.

Вот здесь полный набор PSP IPL SDK v0.5.

rustot 13.02.2010 14:06

Цитата:

Сообщение от ErikPshat (Сообщение 866961)
[*]Когда батарея запандорена, то идёт обращение к мультизагрузчику, как бы MBR в скрытой области карты памяти, он называется TM-IPL или раньше был Booster-IPL и есть ещё куча разновидностей. Он как раз не использует системные файлы, а работает на процессорном ассемблерном коде. Он реагирует на нажатую кнопку LTRG и при её обнаружении считывает путь из текстовика в файле ms0:/TM/config.txt, в котором записан исполняемый путь: L = "/TM/DC8/ipl.bin";

вот именно это и надо, поставить батарею, карту с мультизагрузчиком и подменить на ней ipl.bin на тот что лежит в iplsdk ML_BIOS_DUMPER. в той ссылке что ты дал только исходники, если нечем собирать то в той ссылке что я дал (300 меговой) он лежит уже собранный. с этим подмененным ipl мультизагрузчтик с нажатым LTRG сдампит память на карту и зависнет. ничего писать самому не надо, все уже готовое, только запустить

rustot добавил 13-02-2010 в 14:06
[QUOTE=ErikPshat;866961]Вот тут и происходит загрузка прошивки. В этот момент нужно дампить память.[/LIST]
нет, тут уже поздно, вся память перелопачена к этому моменту. надо чтобы сдампил ipl.bin запущенный из мультилоадера

ErikPshat 13.02.2010 23:21

Цитата:

Сообщение от rustot (Сообщение 867005)
подменить на ней ipl.bin на тот что лежит в iplsdk ML_BIOS_DUMPER

Даже лампочка карты не моргнула.

rustot 14.02.2010 06:16

Цитата:

Сообщение от ErikPshat (Сообщение 867090)
Даже лампочка карты не моргнула.

а мультилоадер именно тот, который из этого же комплекта iplsdk, 'by booster'? а то они разные вряд ли между собой совместимы по формату ipl.bin. чтобы биос дампер бустера запустить, видимо и мультилоадер бустера надо ставить

ErikPshat 14.02.2010 06:27

rustot, ага.

Всё разобрался. Пришлось изучать старые редми. Вроде всё восстановил в памяти. Это всё делалось старыми первыми тулзами по изготовлению Пандоры.

Я ведь по-началу всё пытался своей Пандоре DC8 скормить. Потом пытался TimeMachine, но в ответ тишина.

Потом всё-таки понял, что все эти причиндалы работали немного по другому в первых версиях Пандор.
В общем я опять вернулся на Пандору 3.80. Ведь сам-же писал и подготавливал её ))). Там мультизагрузчик другой и нужны вспомогательные файлы прошивки 1.50. В принципе от первой Пандоры, в 3.80 почти ничего не изменилось, только появился мультизагрузчик.

Короче я щас сижу на 5.00 М33 и у меня начинает что-то получаться. Получилось снять дамп BIOS. Но вот там есть ещё дампер main.bin, а он почему-то никак не реагирует.
Позже попробую с 6.20 снять. Но что-то говорилось, что там адресация сменилась?

rustot 14.02.2010 06:41

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

можешь попробовать заменить
patch_point = search_long_jump(0x040f0000,0x040f1000,0x04000000);
на
patch_point = search_long_jump(0x040ec000,0x040ed000,0x04000000);
может получится

но мне нужен только дамп биоса, main я вытащить тогда смогу сам без psp, с любой версии

rustot добавил 14-02-2010 в 06:41
ps. и наверное с заменой адресов тоже не получится. он пытается найти инструкцию J 0x400000, а там сейчас переход по регистру $R25 = 0x4000000, jr $R25

ErikPshat 14.02.2010 06:43

rustot, ну это понятно, что main.bin можно итак вычислить по 1F8B )).

Но вот Биос какой-то странно маленький выходит ровно на 4096 байт.
Хотя в самом конце чётко вижу надпись:
Copyright (C) 2004,2005 Sony Computer Entertainment Inc. All rights reserved

Ну я щас прошьюсь на 6.20 и скину тебе psp_bios.bin

rustot 14.02.2010 06:52

это не биос на самом деле. просто так назвали :) это просто служебные данные какие-то, оставленные в памяти pre_ipl. они используются только для вычисления ключа. gen_random(buf, 0x1000), for(i in 0..1023) buf[i] += bufBFC00000[i]. gen_key(buf, key). вот я и не могу получить key не зная что лежало в BFC00000

rustot добавил 14-02-2010 в 06:52
ps. и я думаю они будут одинаковы и для 1.0 и для 6.20, иначе бы прошивки не подходили к разным версиям материнок, а sony вынуждена совместимость держать

ErikPshat 14.02.2010 06:55

Вложений: 1
Вот пока глянь на Биос от 5.00. Правильно ли всё получилось?

rustot 14.02.2010 06:59

вроде все правильно, теперь пишу декриптовщик, как напишу выложу. с 6.20 стоит ковыряться только чтоб окончательно убедиться что под ней psp_bios.bin будет абсолютно тот же

ErikPshat 14.02.2010 07:14

rustot, ты был прав.

Снял биос от 6.20 и сравнил с 5.00 - они абсолютно идентичны!

rustot 14.02.2010 07:40

замечательно, значит распаковщик будет универсальным :) пока в лоб не получилось, стал смотреть внимательно - в алгоритме hmac_sha224 они похоже поменяли константы. извращенцы. придется пересматривать код внимательнее, я то просто увидел константы от sha224 и дальше в этот код не смотрел, думал стандарт

rustot 15.02.2010 14:53

аттачить мне не дает, так что исходник только, сможешь main.bin вытащить сам

Универсально пока не получилось, вот это для 6.20 подходит. там их почему-то 2 разных ipl с 2 разными main.bin - part2_nandipl_01g.bin и part2_nandipl_02g.ipl. может это для разных версий материнок разные грузятся

если перла нет, то ставишь http://strawberryperl.com/ и потом cpan Math::Random::MT

Код:

#!/usr/bin/perl -w
use strict;
use Math::Random::MT;
use Digest::SHA qw/sha224/;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;

print("Use: $0 infile outfile\n"), exit unless @ARGV == 2;

my $ipl = load($ARGV[0]);

# this consts changed from version to version. todo - extracting from code

my @data = unpack 'I*', substr($ipl,0x2980,0x8180);
my $key1 = substr($ipl,0x2800,0x40);
my $key2 = substr($ipl,0x2840,0x40);

# get pre_ipl dependent key

my @psp_bios = unpack 'I*', load('psp_bios.bin');
my $gen = new Math::Random::MT(0xBFC00040);
my @buf = map {uint($psp_bios[$_] + $gen->rand(4294967296))} (0..1023);
my $key = hmac_sha224_modified(substr($ipl,0x2580,0x280), pack('I*',@buf))."\x00\x00\x00\x00";
my $sum = 0;
my @key = unpack 'C*', $key;
$sum = ($sum+$_) & 255 for @key;
if( $sum == ord(substr($ipl,0x28A0)) ) {
  my @key2 = unpack 'C*', substr($ipl, 0x2880, 32);
  $key[$_] ^= $key2[$_] for 0..31;
  $key = pack 'C*', @key;
}
$key = hmac_sha224_modified($key1, $key);

# decrypt

$gen = sfmt_init(unpack('I*',$key));
for( my $i = 0; $i < @data; $i += 7 ) {
  my @rnd = map {sfmt_gen($gen)} (1..16);
  my @xor = unpack 'I*', hmac_sha224_modified($key2, pack('I*',@rnd));
  for( my $j = 0; $j < 7 && $i+$j < @data; ++$j ) {
    $data[$i+$j] ^= $xor[$j];
  }
}

# decompress

gunzip \pack('I*', @data) => \my $unpacked or die "gunzip failed: $GunzipError\n";
open FO, ">$ARGV[1]";
binmode FO;
print FO $unpacked;
close FO;
print length($unpacked), "\n";

# hmac_sha224 with non-standard xor constants

sub hmac_sha224_modified
{
  my($key, $data) = @_;

  $key = sha224($key) if length($key) > 64;
  $key .= "\x00" x (64-length($key)) if length($key) < 64;
  $key = join '', map {chr($_ ^ 0x36)} unpack 'C*', $key;
  my $key2 = sha224($key.$data);
  $key = join '', map {chr($_ ^ 0x6A)} unpack 'C*', $key;
  return sha224($key.$key2);
}

# standard sfmt random generator. i've not found perl implementation

sub sfmt_init
{
  my(@seed) = @_;

  my @buf = map {0x8b8b8b8b} (1..0x270);
  my $count = @seed + 1 > 0x270 ? @seed + 1 : 0x270;
  unshift @seed, scalar(@seed);

  for(my $i = 0; $i < $count; ++$i) {
    my $r = $buf[$i % 0x270] ^ $buf[($i+306) % 0x270] ^ $buf[($i+0x26F) % 0x270];
    $r ^= ($r >> 27);
    {use integer; $r *= 1664525}
    $buf[($i+306)%0x270] = uint($buf[($i+306)%0x270] + $r);
    $r = uint($r + $i + ($seed[$i]||0));
    $buf[($i+317)%0x270] = uint($buf[($i+317)%0x270] + $r);
    $buf[$i % 0x270] = $r;
  }   

  my $i = $count % 0x270;
  for my $j (0..0x26F) {
    my $r = uint($buf[$i] + $buf[($i+306)%0x270] + $buf[($i+0x26F)%0x270]);
    $r ^= ($r >> 27);
    {use integer; $r *= 1566083941}
    $buf[($i+306)%0x270] ^= $r;
    $r = uint($r - $i);
    $buf[($i+317)%0x270] ^= $r;
    $buf[$i] = $r;
    $i = ($i + 1) % 0x270;
  }
  my @parity = (1,0,0,0x13c9e684);
  my $inner = 0;
  $inner ^= ($buf[$_] & $parity[$_]) for 0..3;
  $inner ^= $inner >> (1 << (4-$_)) for 0..4;
  $buf[0] ^= 1 unless $inner & 1;
  return [0x270,@buf];
}

sub sfmt_gen
{
  my($ctx) = @_;

  return $ctx->[++$ctx->[0]] if $ctx->[0] < 0x270;
  for(my $i = 0; $i < 0x270; $i += 4) {
    my $r1 = ($i + 0x268) % 0x270;
    my $r2 = ($i + 0x26C) % 0x270;
    my $pos1 = ($i + 488) % 0x270;
    my @x = unpack 'I*', "\x00".pack 'I*', @$ctx[($i+1)..($i+4)];
    my @y = unpack 'I*', substr(pack('I*', @$ctx[$r1+1..$r1+4]), 1)."\x00";
    $ctx->[$i+1] = $ctx->[$i+1] ^ $x[0] ^ (($ctx->[$pos1+1] >> 11) & 0xdfffffef) ^ $y[0] ^ ($ctx->[$r2+1] << 18);
    $ctx->[$i+2] = $ctx->[$i+2] ^ $x[1] ^ (($ctx->[$pos1+2] >> 11) & 0xddfecb7f) ^ $y[1] ^ ($ctx->[$r2+2] << 18);
    $ctx->[$i+3] = $ctx->[$i+3] ^ $x[2] ^ (($ctx->[$pos1+3] >> 11) & 0xbffaffff) ^ $y[2] ^ ($ctx->[$r2+3] << 18);
    $ctx->[$i+4] = $ctx->[$i+4] ^ $x[3] ^ (($ctx->[$pos1+4] >> 11) & 0xbffffff6) ^ $y[3] ^ ($ctx->[$r2+4] << 18);
  }
  return $ctx->[$ctx->[0] = 1];
}

sub uint
{
  my($v) = @_;

  $v += 4294967296 while $v < 0;
  $v -= 4294967296 while $v > 4294967296;
  return $v;
}

sub load
{
  open F, "<$_[0]" or die "Can't open $_[0]";
  binmode F;
  my $res = join '', <F>;
  close F;
  return $res;
}

rustot добавил 14-02-2010 в 20:46
вот на эти данные желательно напустить kirk, очень вероятно что на выходе будут искомые ключи

Код:

0xAA, 0x76, 0x91, 0xDC, 0xB1, 0x25, 0x49, 0x0D,
0x2B, 0x2F, 0x4B, 0x35, 0x13, 0xC7, 0x1B, 0x85,
0x28, 0x40, 0x4B, 0x2E, 0x87, 0xD9, 0xB2, 0xA5,
0xEB, 0x9F, 0x74, 0xF8, 0xBC, 0xDD, 0x51, 0x65,
0xB8, 0x93, 0x14, 0xFF, 0xA7, 0x82, 0xD0, 0xBB,
0xFC, 0x3F, 0x59, 0xD0, 0xA4, 0x70, 0xC6, 0xE4,
0xB7, 0xCA, 0x4E, 0x5D, 0x4A, 0x96, 0x7C, 0x48,
0x41, 0x55, 0xFE, 0xD8, 0xE8, 0x36, 0x77, 0xAE,
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,
0x20, 0x00, 0x00, 0x00, 0x10, 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,
0xB1, 0xAD, 0x73, 0xC3, 0x34, 0xED, 0x51, 0x6B,
0x5F, 0x64, 0x8D, 0xC3, 0x76, 0x13, 0xEE, 0x2F,
0xFC, 0xE2, 0xE9, 0x85, 0xC9, 0x56, 0x0F, 0xE8,
0xCA, 0x61, 0x0F, 0xAF, 0x8E, 0x38, 0xDD, 0x43,
0x2A, 0x22, 0x03, 0x82, 0xE8, 0x2C, 0x1D, 0x73,
0xD2, 0x7C, 0x79, 0xB4, 0xDD, 0xC5, 0x70, 0x48,
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,
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

rustot добавил 15-02-2010 в 03:05
вот так выглядит стартовый код main.bin. в 0xBFC00000 лежат 256 байт положенные туда из ipl, после decrypt() они выглядят так как выше заквочено, а дальше идет kirk, это только на psp можно сделать (если никто еще не сломал его, ведь откуда-то знают что он AES делает, но как именно не говорят)

Код:

  decrypt(0, 0, 0x400D580, 0x400D5C0, 0xBFC00000, 0x100)
  memset(0x400D580, 0, 0x40);
  memset(0x400D5C0, 0, 0x40);
  M(0xBC10004C) |= 0x400;
  M(0xBC100050) |= 0x80;
  M(0xBC100050) &= ~0x80;
  M(0xBC10004C) &= ~0x400;
  M(0xBC100050) |= 0x80;
  if( kirk_decrypt(0xBFC00000, 0xBFC00000) ) {
    memset(0xBFC00000, 0, 0x1000)
    fill_dcache();
    clear_important_mem();
    l04006824();
    l04008250(0);
    while(1);
  }
  memcpy(buf, 0xBFC00000, 0x20);
  memset(0xBFC00000, 0, 0x1000);
  memcpy(0xBFC00200, buf, 0x20);

rustot добавил 15-02-2010 в 14:53
мне уже раскриптовали. не те это ключи, это известные
Цитата:

0xEA, 0x95, 0xD0, 0x1B, 0x6C, 0x91, 0x4C, 0xED,
0xA2, 0x1C, 0x72, 0x45, 0xEE, 0x08, 0x21, 0xB0,
0xB7, 0x0D, 0x55, 0x62, 0x73, 0x5F, 0xB0, 0x99,
0xB8, 0x2D, 0x41, 0xF8, 0xBE, 0x7E, 0x67, 0x1F

its the kernel key seed for slim and phat. 0x00-0x10 is phat, 0x10-0x20 is slim. The slims seed goes through further processing.


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

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