PDA

Просмотр полной версии : Декриптовка IPL


ErikPshat
12.01.2010, 10:28
Как выдрать IPL в декриптованном виде? А именно, в этом IPL лежит файлик в GZIP-формате main.bin из которого извлекается payload.bin. Так вот, ключи к ядру прошивки лежат именно в нём.

Говорят, что можно сдампить декриптованный IPL прямо во время загрузки ядра, в тот момент, когда PRE-IPL в кирке декриптует IPL. А как пойдёт загрузка системы, то ипл стирается из памяти моментом.

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

Вот здесь (http://www.maxconsole.net/forums/showthread.php?t=142687&page=6), кстати, ребята уже этот вопрос обсуждали, но я что-то никак не въеду, каким макаром они там что-то ковыряют =)
И здесь что-то непонятное написано: http://forums.ps2dev.org/viewtopic.php?t=3573

Кстати, вот СильверСпринг выложил тут рабочий код, как он говорит, для декриптовки IPL 6.00.

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

http://www.maxconsole.net/forums/showthread.php?p=1178191#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
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-декриптер вместе с исходниками здесь (http://my.malloc.us/silverspring/2007/10/ipl-decrypt-sample-direct-hw-access/).

Здесь (http://forums.ps2dev.org/viewtopic.php?t=12389&start=0&postdays=0&postorder=asc&highlight=) ещё интересная тема. И здесь (http://forums.ps2dev.org/viewtopic.php?t=3573) тоже.

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

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

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

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

rustot
10.02.2010, 23:53
- из первого ключа и пришедшего с 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
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 (http://www.pspx.ru/forum/showthread.php?t=82925) его вытаскивает и декриптует начало. Точно так-же, как и 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-ти, вот и кукуешь. Или просто в личном кабинете нужно что-то настроить.

rustot
12.02.2010, 00:04
rustot, ну так PSARDumper 6.20 (http://www.pspx.ru/forum/showthread.php?t=82925) его вытаскивает и декриптует начало. Точно так-же, как и Simple_IPL_Decript от Сильвера.


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

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

rustot
13.02.2010, 00:13
Ах, сорри. Я забыл, что у тебя даже 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
точнее BFC00000-BFC01000. нужно собрать с iplsdk дампер этого куска памяти в файл. в инете готовый не могу найтиДумаю в исходниках поменять адреса не создаст проблем.
А как вот снять дамп во время запуска PSP?
Например, после запуска, снять дамп памяти легко.
То есть, ты имеешь ввиду, что нужно в IPL подсунуть команду на запуск дампера?

rustot
13.02.2010, 02:47
Думаю в исходниках поменять адреса не создаст проблем.
А как вот снять дамп во время запуска 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: http://www.pspx.ru/forum/attachment.php?attachmentid=579&d=1263976309
Не знаю, хватит у тебя прав скачать с секретного отдела.

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

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

iplsdk.7z я не помню где отдельно видел, но он есть например внутри этого архива - http://narod.ru/disk/13354518000/371-600%20IPL%20%26%20NandDump.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 и выложил для тренировок. Ты отсюда наверное его стянул: http://www.pspx.ru/forum/showthread.php?p=822352#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
да не нужно ничего вставлять и компилить. в 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 сейчас делаются более современными методами.

Чтобы тебе более вникнуть в суть, то нужно посмотреть эту тему: http://www.pspx.ru/forum/showthread.php?t=77904
Там в "Способе №2. Для PSP с официальной прошивкой", залей себе файлы Пандоры на карту памяти. Они извлекаются из программы "PSPGrader".
Просто, для изучения. Это тебе наверняка поможет и натолкнёт на путь истинный. Ты посмотришь и сравнишь IPL на карте памяти с теми, которые я дампил из Nanda.


Фактически это прошивка, которая запускается с карточки памяти.
В папке ms0:/TM/DC8/ увидишь IPL-ы для Фатки и Слимки (ipl_01g.bin и ipl_02g.bin) - это почти такие-же, которые записываются в нанд кастомпрошивки 5.00 М33.
И ещё там есть просто ipl.bin - это какой-то пред-IPL.
Когда батарея запандорена, то идёт обращение к мультизагрузчику, как бы MBR в скрытой области карты памяти, он называется TM-IPL или раньше был Booster-IPL и есть ещё куча разновидностей. Он как раз не использует системные файлы, а работает на процессорном ассемблерном коде. Он реагирует на нажатую кнопку LTRG и при её обнаружении считывает путь из текстовика в файле ms0:/TM/config.txt, в котором записан исполняемый путь: L = "/TM/DC8/ipl.bin";
После запуска ipl.bin, происходит элементарная проверка на модель PSP и в зависимости от модели происходит запуск одного из кастомных IPL - ipl_01g.bin или ipl_02g.bin.
А они запускают файлы ms0:/kd/lfatfs.prx и ms0:TM/DC8/tmctrl500.prx, который запускает файл пандоры ms0:/TM/DC8/KD/resurrection.prx
Из него вытекает всё меню Пандоры с вытекающими.
Когда в меню Пандоры запускаешь пункт "Test M33", то через перезагрузку вызывается ipl_0xg.bin, в котором находится файл pspbtcnf.bin, после которого начинается официальный IPL, который запускает все кастомные файлы прошивки с карты памяти и официальную прошивку.
Вот тут и происходит загрузка прошивки. В этот момент нужно дампить память.

А ещё лучше наверное экспериментировать с TimeMachine (http://www.pspx.ru/forum/showthread.php?t=64491). В ней можно держать на карте несколько прошивок. И там немного по другому всё это работает.

Вот здесь полный набор PSP IPL SDK v0.5 (http://www.pspx.ru/forum/attachment.php?attachmentid=610&d=1266043303).

rustot
13.02.2010, 14:06
Когда батарея запандорена, то идёт обращение к мультизагрузчику, как бы 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
подменить на ней ipl.bin на тот что лежит в iplsdk ML_BIOS_DUMPERДаже лампочка карты не моргнула.

rustot
14.02.2010, 06:16
Даже лампочка карты не моргнула.

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

ErikPshat
14.02.2010, 06:27
rustot, ага.

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

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

Потом всё-таки понял, что все эти причиндалы работали немного по другому в первых версиях Пандор.
В общем я опять вернулся на Пандору 3.80 (http://www.pspx.ru/forum/showthread.php?t=62940). Ведь сам-же писал и подготавливал её ))). Там мультизагрузчик другой и нужны вспомогательные файлы прошивки 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 += bufBFC00000[i]. gen_key(buf, key). вот я и не могу получить key не зная что лежало в BFC00000

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

ErikPshat
14.02.2010, 06:55
Вот пока глянь на Биос от 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.

ErikPshat
16.02.2010, 01:59
rustot, привет! Хорошая работа.
Хотя нет. Ниасилил.
Поставил Strawberry, сохранил исходник как IPLDecrypt.pl.
Запустил батник из этой папки с командой C:/strawberry/perl/bin/cpan Math::Random::MT
Что-то там долго компилилось, но потом непонятно что вышло ))). В папке span образовалась куча файлов, но не имеющих отношения к программе. А как экзешник скомпилить, я так и не въехал.

Залей лучше на www.slil.ru

rustot
16.02.2010, 21:36
бинарник залью вечером, он дома. компилить ничего не нужно, cpan поставил недостающую либу и теперь достаточно выполнить "perl IPLDecrypt.pl part2_nandipl_01g.bin main.bin", при этом psp_bios.bin должен лежать в текущей папке

кстати psp_bios.bin оказывается и есть весь pre-ipl, а не его кусок. там все, и инит оборудования и загрузка ipl с nand или стика и его декриптовка и запуск. а ipl поддерживает две версии pre-ipl, старый который есть у нас и новый, который еще никто не добыл. "if( $sum == ord(substr($ipl,0x28A0)) ) {" как раз патчит ключ в случае если pre-ipl оказался не той версии

rustot добавил 16-02-2010 в 21:23
http://slil.ru/28660285 (http://www.pspx.ru/forum/attachment.php?attachmentid=691&d=1270429951)

2 декриптованных модуля, второй требует дополнительной декриптовки kirk

rustot добавил 16-02-2010 в 21:36
ErikPshat, сможешь декриптовать на psp? это тот же код которым например ipl декриптуется, команда №1, ключи не нужны

ErikPshat
16.02.2010, 21:44
теперь достаточно выполнить "perl IPLDecrypt.pl part2_nandipl_01g.bin main.bin"Спасибо! Разобрался сегодня. Действительно всё верно декриптится. Только странно, что это выдаётся только после предварительной декриптовки PSARDamper-ом в два прохода.

Щас попробую дальше...

А нельзя просто выдернуть декриптованный IPL полностью?
Кстати, что-то в main.bin не нашёл в прямом виде ключей. Слышал ещё про payload.bin, который находится тоже упакованный в main.bin и в котором эти ключи уж точно содержатся.
Просто я исследовл main.bin от 2.00, и там ключи лежали на поверхности.

ErikPshat, сможешь декриптовать на psp? это тот же код которым например ipl декриптуется, команда №1, ключи не нужныМожно поподробнее.
Я-же всё-таки не программист, а просто любитель, поэтому мне не совсем понятны команды №1 и т.п.

Вот во вложении Пёрл-PC-декриптер. Декриптует он part2_nandipl_0Xg.bin, извлечённый и частично декриптованный (1-ая секция) PSARDumper-ом или программой "IPL Decrypt Sample" от SilverSpring-а.

rustot
17.02.2010, 10:14
А нельзя просто выдернуть декриптованный IPL полностью?
Кстати, что-то в main.bin не нашёл в прямом виде ключей. Слышал ещё про payload.bin, который находится тоже упакованный в main.bin и в котором эти ключи уж точно содержатся.
Просто я исследовл main.bin от 2.00, и там ключи лежали на поверхности.

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

как именно - я не очень в курсе, должны быть какие-то готовые тулзы. код должен выглядеть примерно так:


u8 buf[0x80000];
...
ReadFile("ms0:/main2_enc.bin", buf, 0x80000);
PspKirkRegs *const crypt = KIRK_HW_REGISTER_ADDR;
crypt->command = 1;
crypt->src_addr = crypt->dst_addr = MAKE_PHYS_ADDR(&buf);
crypt->proc_phase = 1;
while((crypt->status & 0x11) == 0);
crypt->status_end = crypt->status;
SYNC();
WriteFile("ms0:/dec_ipl.bin", ipl, 0x80000);


это выдрано для примера из другого кода, но наверняка есть готовые тулзы, я просто не знаю

stillllll
17.02.2010, 13:09
В упоминавшемся чуть выше IPLSDK есть функция
int pspKirkProc(void *dst,u32 dsize,void *src,u32 ssize,u32 cmd);
которая делает приблизительно тоже самое. Может быть просто сделать IPL для мультилоадера, который сделает все необходимые действия.

rustot
17.02.2010, 13:14
В упоминавшемся чуть выше IPLSDK есть функция
int pspKirkProc(void *dst,u32 dsize,void *src,u32 ssize,u32 cmd);
которая делает приблизительно тоже самое. Может быть просто сделать IPL для мультилоадера, который сделает все необходимые действия.

если кому не лень встраивать этот декриптовочный код в дампер, то да, это было бы логичнее чем декриптовать несколько раз то на psp то на pc. исходники необходимых sha224 sha256 mt sfmt на сях есть, чуть подправить и вкомпилить

в принципе на psp даже и декриптовать не надо, зная код можно брекпоинты в нужные места вставить и сдампить уже декриптованное из памяти. но только эти нужные места будут от версии к версии меняться

stillllll
17.02.2010, 13:18
в принципе на psp даже и декриптовать не надо, зная код можно брекпоинты в нужные места вставить и сдампить уже декриптованное из памяти. но только эти нужные места будут от версии к версии меняться

Я конечно не уверен на все 100%, но мне кажется что врядли существуют средства, чтобы отлаживать на PSP в такие моменты как загрузка и выполнение IPL.

rustot
17.02.2010, 13:30
Я конечно не уверен на все 100%, но мне кажется что врядли существуют средства, чтобы отлаживать на PSP в такие моменты как загрузка и выполнение IPL.

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

ErikPshat
17.02.2010, 18:10
Такс, что дальше?

stillllll
17.02.2010, 18:28
Такс, что дальше?
Замутить IPL, который возьмет main2_enc.bin с мемористик, скормит KIRK, и результат запишет обратно на карточку, для этого все в IPLSDK есть.
Только я хз как его скармливать KIRK, полностью, кусками по 0x1000 байт, начиная сначала или со смещения 0x90 и т.п.

rustot
17.02.2010, 22:12
Замутить IPL, который возьмет main2_enc.bin с мемористик, скормит KIRK, и результат запишет обратно на карточку, для этого все в IPLSDK есть.
Только я хз как его скармливать KIRK, полностью, кусками по 0x1000 байт, начиная сначала или со смещения 0x90 и т.п.

целиком, одним куском. как я выше пример привел, считать из файла, вход выход указать один и тот же, вызвать kirk и сохранить

rustot добавил 17-02-2010 в 22:12
это из обычного приложения можно делать, как psardumper, не в режиме загрузки ipl

stillllll
17.02.2010, 23:26
Вобщем я стал искать описание структуры PspKirkRegs и нашел у SilverSpring http://my.malloc.us/silverspring/2007/10/ipl-decrypt-sample-direct-hw-access/
Там он декриптит с помощью KIRK блоками по 0x1000.

rustot
18.02.2010, 01:38
Вобщем я стал искать описание структуры PspKirkRegs и нашел у SilverSpring http://my.malloc.us/silverspring/2007/10/ipl-decrypt-sample-direct-hw-access/
Там он декриптит с помощью KIRK блоками по 0x1000.

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

ErikPshat
18.02.2010, 01:47
А это что за KIRK Crypto Engine (http://my.malloc.us/silverspring/kirk-crypto-engine/)

rustot
18.02.2010, 15:38
kirk это и есть главная тайна psp, аппаратная криптовалка. и если часть команд у нее известно что делает и воспроизводима программно, лишь бы знать ключи, то команда №1 тайна за семью печатью, ключей не требует и работает только в одну сторону - на декриптование. а симметриная функция криптования доступна только сони. вот и получается, что декриптовать и посмотреть код от сони мы можем (при наличии ломаной psp для доступа к кирку) а вот собственный код закриптовать так, чтобы его поняла psp - не можем.

то что я выше в качестве примера привел и есть прямой доступ к кирку, KIRK_HW_REGISTER_ADDR там равен 0xBDE00000

ErikPshat
19.02.2010, 07:53
загрузился pre-ipl -> загрузил ipl -> ipl раскриптовл main.bin -> main.bin раскриптовал еще один модуль, который закриптован дважды, первый раз кирком, второй вручную. то что вручную я раскриптовалТак ты расшифровал последний модуль окончательно? Можно взглянуть на него?

Вот ещё инфу надыбал: http://silverspring.lan.st/NPSPTD_01.txt
Это отсюда: http://www.lan.st/showthread.php?p=16132#post16132
Ага, вижу тебя там )

stillllll
19.02.2010, 08:34
Так ты расшифровал последний модуль окончательно?
Мне кажется, что без тебя (твой PSP) это невозможно =)

Вобщем код, для расшифровки я попробовал написать еще позавчера, но он как всегда не работает, а отладить/потестить мне нечем. Псплинк заставить работать у меня не получается. На файле который нужно расшифровать, моя psp просто выключается (не виснет как при косячном коде, а просто выключается, мгновенно)

А править код SilverSpring во второй раз мне чот уже как-то =).

ErikPshat
19.02.2010, 08:59
stillllll, ну моя PSP полностью заряжена и ждёт указаний =)

Кстати, пробовал декриптить nandipl_01g.bin от 6.20 с помощью декриптера от СильверСпринга, то на выходе получается точно такой-же файл, как из PSARDumper-a part2_nandipl_01g.bin.

Но вот nandipl_02g.bin и nandipl_03g.bin дампер Сильвера уже не берёт, выдаёт ошибку.

Хотя PSARDumper выдаёт нормальный part2_nandipl_02g.bin, но вот part2_nandipl_03g.bin уже никто не даёт =)

Пёрл 01g отлично дампит и 02g дампит. Сначала забыл расширение поменять.

И ещё, смотрел я долго в main.bin на этот код, как будто он там зашифрован:

http://s002.radikal.ru/i200/1002/6b/7ad35751c906.pngИ есть ещё точно такого-же размера область пониже в конце, но я сравнил с main.bin от 5.50, а они одинаковые. Она тоже похожа на зашифрованную или просто на специальный код. Короче, я взял эту область отксорил с предыдущей областью и получился очень прикольный код при сравнении между собой, очень похожий, если сравнить part1_nandipl_01g.bin с part2_nandipl_01g.bin

ErikPshat
22.02.2010, 01:32
Ну так что. Результаты уже есть и на этом остановились =)


IPL декриптуется с помощью "IPL Decrypt Sample" от SilverSpring и получаем на выходе dec_ipl.bin, аналогичный part2_nandipl_0Xg.bin из PSARDumper.
psp_bios.bin универсальный извлекли с помощью "ML_BIOS_DUMPER" от SilverSpring во время загрузки PSP путём подстановки вместо запуска DDCv5.
MAIN.BIN извлекли из dec_ipl.bin с помощью кода под Perl благодаря rustot
PAYLOAD.BIN извлекается из main.bin, но на этом застряли.

По моему, после включения PSP, всё должно декриптоваться в память сразу-же - IPL->MAIN.BIN->PAYLOD.BIN.
И наверное они должны храниться в памяти друг за другом, а не затирать друг друга.

Кстати, есть ещё такие проги "Kernel Damper Sample" из pspsdk и "DAMPKMEM (http://ps2dev.org/psp/Tools/Kernel_Memory_Dumper)" с исходниками от TiRaNiD. Причём первая работает и на 3.хх kernel и выводит мизер информации, а вторая работает только на 1.5 kernel и выводит кучу всякой инфы на экран.

http://s54.radikal.ru/i145/1002/c2/6033a4b49b1e.png

http://s43.radikal.ru/i101/1002/b1/cc2535fd13a9.pngТак вот, они тоже что-то дампят =)
Например какой-то файл boot.bin (1Mb) и kmem.bin (4Mb).

pronvit
23.02.2010, 19:44
да, иметь полностью декриптованный ipl было бы хорошо.. его можно вручную загружать в нужной последовательности вместо зашифрованного и так загрузить прошивку. а потом уже патчить расшифрованный ipl легко и прочие файлы.

rustot
24.02.2010, 11:10
PAYLOAD.BIN извлекается из main.bin, но на этом застряли.


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

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

pronvit
24.02.2010, 13:31
rustot, могу сейчас попробовать запрограммить, если пришлешь чего прогнать через kirk.

rustot
25.02.2010, 15:27
rustot, могу сейчас попробовать запрограммить, если пришлешь чего прогнать через kirk.

я ж выше давал

http://slil.ru/28660285 (http://www.pspx.ru/forum/attachment.php?attachmentid=691&d=1270429951)

main2_enc.bin - вот его нужно подсунуть кирку целиком как есть, а не 4к кусками как ipl, это один сплошной криптованный кусок. но код (команды кирку) тот же каким декриптовались 4k куски ipl. на выходе должен получиться gzip, то есть первый байты 1F 8B

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

pronvit
25.02.2010, 15:47
держи...

rustot
25.02.2010, 16:24
отлично, спасибо. вроде ничего больше криптованного не видно

pronvit
25.02.2010, 17:08
Итак, это все части ipl у нас теперь есть? От какой это точно прошивки?
Вечером пройдусь по ним дизассемблером посмотрю какая часть чего инициализирует и по каким адресам грузит следующую. Потом можно будет попробовать записать их в расшифрованном виде вместо зашифрованных частей.
Ключи мне из них не интересны, ну а кто их хотел тоже теперь все есть.

rustot
25.02.2010, 17:29
это 6.20

pre_ipl грузится с BFC00000, пересылает кусок себя в 80010000, оттуда покусочно грузит ipl по тем адресам какие в заголовках 4k блоков указаны. нынче это 40EC000

у загруженного ipl, несмотря на то что его весь декриптовали кирком реально декриптованы только первые 10к, которые и декриптуют все остальное

первым декриптуется и распаковывается по адресу 4000000 то что обозвано у меня main.bin. на него и передается управление. тот сначала декриптует 256-байтный кусок получая из него 32 байта каких то двух ключей (см дамп выше), оставляет декриптованное в BFC00200 для последующего использования. потом декриптует сначала софтом а потом кирком то что названо main2_enc.bin, вот адрес не помню куда складывает, там 8 и 6, типа 8060000 или 8600000 или как то так. там это все в начале main.bin, найти не сложно

rustot добавил 25-02-2010 в 17:29
дальше я не разбирался, решил дизасм свой сварганить сначала, интеллектуальный :)

pronvit
25.02.2010, 17:43
rustot добавил 25-02-2010 в 17:29
дальше я не разбирался, решил дизасм свой сварганить сначала, интеллектуальный :)

а IDA чем плоха?

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

rustot
25.02.2010, 18:02
а IDA чем плоха?

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

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


//80010000: lui R4, 0x8001
//80010004: addiu R4, R4, 0xA80
sub_800106B0(0x80010A80) //80010008: jal sub_800106B0
//8001000C: sll R0, R0, 0
//80010010: lui R8, 0xBC10
//80010014: lw R9, 0x68(R8)
//80010018: srl R9, R9, 16
if(!(M(0xBC100068) >> 16)) goto loc_80010034 //8001001C: beq R9, R0, loc_80010034
//80010020: sll R0, R0, 0
//80010024: lw R9, 0x78(R8)
//80010028: ori R9, R9, 0x800
M(0xBC100078) |= 0x800 //8001002C: beq R0, R0, loc_80010040
goto loc_80010040 //80010030: sw R9, 0x78(R8)

pronvit
25.02.2010, 18:07
а, в этом смысле.. а я чего-то привык уже)) ну pspdecompiler есть, с исходниками..

ErikPshat
26.02.2010, 03:55
держи

http://slil.ru/28703978
Отличная работа! Написал бы, как ты main2 натравил на кирк.
Вот эти теги с ключами меня вообщем-то и интересовали. То есть, теги видны, а ключи остаётся дизасмить.

http://i081.radikal.ru/1002/ed/2a9f7ae917f8.pngПравда их ранее успел извлечь bbtgp. Но суть не в этом.
Дело в том, что до сих пор нету ключей от прошивки 5.50 и 5.55, поэтому системные модули пока не декриптуются. А так-же, нету конечно ключей от 03g и 04g модулей, у которых ключи одинаковые.

Вот на всякий я закинул, что есть из ipl (5.50, 5.55, 6.хх), во вложение.

pronvit
26.02.2010, 14:03
так там очень просто, собственно как в любом дешифраторе prxов после преобразовани заголовка.


SceUID fd = sceIoOpen("ms0:/enc.bin", PSP_O_RDONLY, 0);
int cbFile = sceIoLseek32(fd, 0, PSP_SEEK_END);
sceIoLseek32(fd, 0, PSP_SEEK_SET);
sceIoRead(fd, data, cbFile);
int retsize = *(u32*)&data[0x70];
int ret = sceUtilsBufferCopyWithRange(data, cbFile, data, cbFile, 0x1);
WriteFile("ms0:/dec.bin", data, retsize);
sceIoClose(fd);

ErikPshat
28.02.2010, 00:40
я ж выше давал

http://slil.ru/28660285

main2_enc.binА можно проделать то-же самое с main.bin от 5.50 и 5.55, которые я в предыдущем посту выложил. То есть, вытащить main2_enc.bin, т.к. я этот процесс тоже не понял, каким образом его можно вытащить.

ANDPSP
12.03.2010, 17:50
Вопрос ко всем и к Rustot в частности (поскольку у него личка не пашет ввиду отсутствия профиля):Если есть криптованный и декриптованный один и тот же файл, возможно даже и ключ, то возможно ли найти алгоритм повторного криптования декриптованного файла так чтобы закриптованный файл стал полность работоспособным ?

pronvit
12.03.2010, 18:53
Вопрос ко всем и к Rustot в частности (поскольку у него личка не пашет ввиду отсутствия профиля):Если есть криптованный и декриптованный один и тот же файл, возможно даже и ключ, то возможно ли найти алгоритм повторного криптования декриптованного файла так чтобы закриптованный файл стал полность работоспособным ?

теоритически возможно. как примерно устроен алгоритм тоже известно (AES и все такое).

а практически как-то вот что-то пока не очень.

правда datel вон умеют закриптовывать свои бинарники...

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

ANDPSP
15.03.2010, 17:43
Кто может посоветовать какой нить софт для криптовки/декриптовки с использованием ключа, работающий на PC. И есть ли какие нить проги анализирующие два файла (криптованный и декриптованный) и дающие какие нить рекомендации что ли по переводу одного в другое... И где можно посмотреть инфу по алгоритмам применяемым в кодировании софта PSP (это точно AES или какой то еще метод применяется)? может где то есть исходники PRX-декрипторов которые работают на PC а не на PSP ?

pronvit
20.03.2010, 13:37
пытаюсь загрузить первую часть ipl вручную с карты - не грузится, но и не виснет, ничего не происходит, а 3 часть виснет.. вторую не могу попробовать пока..

не понятно, почему ipl от оригинальной прошивки из прошивки запускается, а с карточки нет...