PDA

Просмотр полной версии : Разбор формата FLASH0.TN из комплекта CEF


lupus
16.01.2014, 12:49
Появилась идея перевести/замодить recovery и vsh menu текущей версии CEF TN-V 7.3.
Вся проблема в том, что оригинальные файлы из прошивки PSP 6.60 лежат открыто, а вот пачка кастомных - упакованы в один архив, который я и пытаюсь разобрать.
Сжатие используется не такое, как в оригинале.
На всякий случай ссылка (https://dl.dropboxusercontent.com/u/57975554/PSV/FLASH0.7z) на файл.
Форматы архива для TN-C, сырцы которого есть в сети и текущей версии TN-V7.3 немного отличаются, но как мне показалось только заголовком.
Разобрал примерно так:
0x00 - 4 байта - количество файлов в архиве (0x0D = 13)
0x04 - 4 байта - magic TNPK
0x08 - 4 байта - размер файла в распакованном виде
0x0C - 4 байта - размер длины строки пити к файлу (0x0F)
0x10 - 15 байт (0x0F) - путь к файлу в архиве
0x1F - 1 байт - размер имени заголовка файла (0x1D)
0x20 - 29 байт (0x1D) - заголовок файла
0x3d - ?? тело упакованного модуля ??
0x0DC1 - снова 4 байта magic TNPK

и далее всё по аналогии...
Может будут подсказки?

PS. Сам TN, к сожалению, ограничился кратким ответом:
The FLASH0.TN file is compressed by an other type. However you can load your own recovery by adding recovery.prx to ms0:/flash/kd/recovery.prx
TN

frostegater
16.01.2014, 15:07
В старых сырцах TN-V есть прога package_maker.exe, но она только запаковывает.

upd/
во FLASH0.TN файлы лежат в чистом виде, даже не запакованы
а метод распаковки есть в самих сырцах TN
пакер/анпакер сделать расплюнуть

lupus
16.01.2014, 17:55
Пакер из тн-с я смотрел, благодаря сравнению данных до и после упаковки получилось кой-чего выудить из того, что написано. Там однозначно какое-то сжатие есть, т.к. после сборки flash0.tn он весит меньше, чем файлы в нём до упаковки + в хексе данные не совпадают, если бы в чистом виде лежали - то можно было бы руками всё выдрать и не париться.
По сути только анпакер нужен. Буду благодарен , если сможешь собрать...

SILENT-Pavel
17.01.2014, 00:54
lupus, а можно что-нибудь изменить не дергая тотал_нуба? Ну например на бум повключать звук в пс1 хоть какой, или ну не знаю сделать фикс для досБокс используя анализ АРК прошивки (там он работает) или вообще что-нибудь в этом роде? например убрать поддержку 64 метров оперативки в 2.12, оно нестабильно.

frostegater
17.01.2014, 01:22
lupus, хорошо, вечером сделаю

lupus
17.01.2014, 08:45
lupus, а можно что-нибудь изменить не дергая тотал_нуба? Ну например на бум повключать звук в пс1 хоть какой, или ну не знаю сделать фикс для досБокс используя анализ АРК прошивки (там он работает) или вообще что-нибудь в этом роде? например убрать поддержку 64 метров оперативки в 2.12, оно нестабильно.
Теоретически, можно всё, но это не ко мне - я не настолько продвинут в вопросе. Если бы были откыты исходники - было бы проще.

lupus, хорошо, вечером сделаю
Спасибо, буду ждать.

frostegater
18.01.2014, 14:38
lupus, вот) https://twitter.com/frostegater/statuses/424490214757646336

lupus
18.01.2014, 15:16
frostegater, что-то я бинарника в архиве не вижу, там только сырцы? Собери, если не сложно.

frostegater
18.01.2014, 17:37
lupus, 9686

lupus
18.01.2014, 21:56
Хм, это просто разбор на части, а что с декомпрессией?
однозначно какое-то сжатие есть, т.к. после сборки flash0.tn он весит меньше, чем файлы в нём до упаковки + в хексе данные не совпадают, если бы в чистом виде лежали - то можно было бы руками всё выдрать и не париться.
В recovery я не вижу ни шрифта ни текста.
Это как-то поможет?
u32 file_count;

//Repeat this file_count times:
u32 signature; (0x4B504E54)
u32 file_size;
u32 name_length;
u8 name[name_length];
u8 file[file_size];

frostegater
19.01.2014, 02:35
lupus, http://www.pspx.ru/forum/showthread.php?t=76183
Пспшная gzip компрессия.

lupus
19.01.2014, 09:29
Я это в первую очередь попробовал.
The FLASH0.TN file is compressed by an other type. However you can load your own recovery by adding recovery.prx to ms0:/flash/kd/recovery.prx
TN

frostegater
20.01.2014, 05:11
lupus, ага) ок разберемся, мне сказали какое там сжатие

lupus
20.01.2014, 12:16
Ок, жду))

frostegater
21.01.2014, 09:17
Как всегда все оказалось намного сложнее. Сейчас делаем реверс алгоритма шифрации TN.BIN, чтобы вытащить алгоритм декомпрессии)) Может по пути обнародуем kernel эксплоит ТНа.

loc_00000078:

//0x00000078
// div $a2, $t4
LO = (s32)a2 / (s32)t4;
HI = (s32)a2 % (s32)t4;

//0x0000007C
// lbu $v0, 0x0($t0)
v0 = *(u8 *)(t0);

//0x00000080
// lbu $a0, 0x0($a0)
a0 = *(u8 *)(a0);

//0x00000084
// xori $v0, $v0, 0x1A
v0 = v0 ^ 0x1A;

//0x00000088
// xor $v0, $v0, $a0
v0 = v0 ^ a0;

//0x0000008C
// mfhi $v1
v1 = HI;

//0x00000090
// srav $v1, $t2, $v1
v1 = (s32)t2 >> v1;

//0x00000094
// mult $a2, $a3
LO = (s32)a2 * (s32)a3;
HI = ((s32)a2 * (s32)a3) >> 32;

//0x00000098
// addiu $a3, $a3, 0x1
a3 = a3 + 1;

//0x0000009C
// mflo $a0
a0 = LO;

//0x000000A0
// xor $v1, $v1, $a0
v1 = v1 ^ a0;

//0x000000A4
// ext $v1, $v1, 5, 8
v1 = (v1 >> 5) & 0xFF;

//0x000000A8
// divu $t1, $t3
LO = (u32)t1 / (u32)t3;
HI = (u32)t1 % (u32)t3;

//0x000000AC
// xor $v0, $v0, $v1
v0 = v0 ^ v1;

//0x000000B0
// addiu $v0, $v0, -0x20
v0 = v0 - 0x20;

//0x000000B4
// xori $v0, $v0, 0x20
v0 = v0 ^ 0x20;

//0x000000B8
// sb $v0, 0x0($t0)
*(u8 *)(t0) = v0;

//0x000000BC
// addiu $t0, $t0, 0x1
t0 = t0 + 1;

//0x000000C0
// mfhi $a2
a2 = HI;

//0x000000C4
// sltu $v0, $a1, $a3
v0 = (u32)a1 < (u32)a3;

//0x000000C8
// addiu $t1, $a2, 0x1
t1 = a2 + 1;

//0x000000CC
// addu $a0, $a2, $s0
a0 = a2 + s0;

//0x000000D4 delay slot
// sllv $t2, $t5, $a3
t2 = t5 << a3;

//0x000000D0
// beqz $v0, loc_00000078
if(v0) goto loc_00000078;

lupus
21.01.2014, 11:43
Обнародовать может пока и рано. Мне на данном этапе достаточно непожатых recovery и satellite.

frostegater
21.01.2014, 14:18
lupus, ну дак их можно достать и без распаковки. Вопрос как обратно запакуешь?

lupus
21.01.2014, 15:22
Ну так я ж писАл: вынуть и распаковать, чтобы можно было редактировать. А назад запихивать не обязательно, достаточно их в папку kd положить, чтобы cef их подхватила. Об этом TN мне на вололо сказал.

lupus
24.01.2014, 11:36
Ну как, есть сдвиги?

frostegater
24.01.2014, 17:23
lupus, да пока занят. Модули можно сдампить напрямик из RAM, там они в чистом виде лежат.

lupus
24.01.2014, 21:16
Расскажи чем и как это на витке сделать?

frostegater
24.01.2014, 23:57
lupus, я сам попробую, объяснить это сложнее. флеш0 в вите представлен "сгустком" памяти - flashspace, таблица лежит по адресу 0x08B00000 и составляет структуру

struct{
char *modname;
void *buffer;
u32 modsize;
} flashspace;

читать память пока пойнтер buffer не станет нулевым. Особо ничего сложного, только я в трусах на заваленом вещами кресле в 8 утра сползаю под стол :D а вообще я лавно работаю над этим вопросом, только инаким путем. Достанем модули.

lupus
25.01.2014, 00:26
Ясно, этот метод не для меня. Запасаюсь терпением...
*ушёл играть в наёмника*

lupus
29.01.2014, 12:13
Фрости, есть ли сдвиги?

ErikPshat
30.01.2014, 06:41
Разбор формата FLASH0.TN
Где-то в какой-то теме я полностью расписывал структуру файла FLASH0.TN.
И даже подменял кастомные файлы в упаковке. Думаю в 7-ой редакции ничего более хитрого не свершилось.

lupus
30.01.2014, 11:24
Хм, буду с компа, попробую поискать по твоим постам...
Хотя, со времён tn-c формат немного поменялся, но сжатие, надеюсь, осталось старым.

lupus
30.01.2014, 13:48
Эрик, что-то ничего похожего пока не нахожу...

frostegater
30.01.2014, 16:40
ErikPshat, в старой версии компрессии не было. Сейчас там какой-то хитрый алгоритм. Вроде LZSS, но модифицированный. Я в принципе сдампил VSH меню, но в байткоде, то есть это не ELF. Сейчас время появится попробую перехват функций из библиотеки LoadExec.

ErikPshat
30.01.2014, 20:31
Эрик, что-то ничего похожего пока не нахожу...
Либо старую тему по ТН-С потерли, либо мне показалось, что описывал структуру. Во всяком случае, я тот формат полностью разобрал по полочкам и подсовывал там кастомное наше рекавери или вш меню. Кажись даже пользователям скармливал сборку по приколу.

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

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

frostegater
31.01.2014, 06:25
ErikPshat, та сказка про яйцо в курице, в яйце игла, а на кончике иглы смерть TNа уже не катит. Тут конкретно контейнер компрессованых файлов и мейджик у каждого ТНовский, фирменный.

ErikPshat
31.01.2014, 10:24
Тут конкретно контейнер компрессованых файлов и мейджик у каждого ТНовский, фирменный.
Он мог бы сменить только мэйджик в заголовке архивов, а архиватор использовать народный.

Например 1F8B0880 подмняет на что-то свое.

lupus
31.01.2014, 21:14
Мог бы, это наиболее логично, но вот что именно он туда запихнул - хз...

ErikPshat
04.02.2014, 02:10
Наконец-то добрался до ББ, однако инет у меня мобильный МТС EDGE. Ни роутера. Хитрыми извратными способами удалось приконнектить телефон симбиан к ББ и таким образом выходить в инет с Большого Брата :) Теперь хоть разглядеть форум на большом экране можно.

Что-то я не понял. Вроде речь шла о компрессии FLASH0.TN, но я что-то вижу, что каждый файл в отдельности как-то не так упакован. Пойду искать очки...

lupus
04.02.2014, 11:10
Ну так я об этом с самого начала и говорил. Что просто вынуть файлы из контейнера - не проблема, а вот распаковать их - это та ещё задачка.

ErikPshat
04.02.2014, 17:06
Балин, недолго длилась радость с ББ. Установил на комп Logitech SetPoint для поддержки клавиатуры и мышки. После этого комп вывалился с синий экран смерти. Теперь даже в "Безопасный режим" не входит. И диска реаниматора нет с собой :(

Так что я пока в ауте.

Кстати, не успел разглядеть хедеры, не мог он подисать модули официальными ключами, например через prxEncrypter?

vash
04.02.2014, 19:11
ErikPshat, Так что я пока в ауте.
Что-ж тебе так с "железом"-то не везёт?

lupus
04.02.2014, 20:17
Эрик, вот скрин из хекса:
https://dl.dropboxusercontent.com/u/57975554/PSV/f0.png

ErikPshat
04.02.2014, 21:37
Эрик, вот скрин из хекса:
https://dl.dropboxusercontent.com/u/57975554/PSV/f0.png
Посмотри внимательнее в позицию Е8.

lupus
04.02.2014, 21:49
Хм, а что там? Не томи... Я с телефона тоже.

ErikPshat
04.02.2014, 22:02
Хм, а что там?

Например 1F8B0880

lupus
04.02.2014, 23:11
7z 9.20, к сожалению, не справился с распаковкой :/ Архив открывает, говорит, что он гзип, а на распаковке сыпется.

ErikPshat
05.02.2014, 00:35
lupus, и так со всеми кастомными файлами ~PSP?
Расширение при сохранении менял на *.gz ?
Ну в любом случае уже механизм сжатия известен. Вполне вероятно, что он мог перемешать файл кусками. Но тогда и указатели должны быть в хедере на эти куски.
Кстати, ты заметил, что у первого файла тег: F0 DA DA DA :xDD: ?

ErikPshat
08.02.2014, 04:27
Если посмотреть на внутренние файлы, то видно, что они вполне читабельные, как и обычные. Получается они не упакованы еще раз.

Но, так же видно, что идет сдвиг смещений уже с самооо заголовка, т.к. например Тег F0DADADA должен находиться по адресу 0xD0, а начало архива 1F8B0880 по адресу 0x150.

Выложи плиз файлы нехитрые pspbtXnf.bin, например от предыдущих сборок. Они изначально некомпрессионные и все пути видны наяву.
Но в этой сборке наглядно видно, что съедено часть букв в путях.

ПС. Я так полагаю, что здесь происходит подмена символов по словарю и каждому набору соответствует короткий код: E0, E1, E2, E3 и т.д.

lupus
08.02.2014, 15:56
Держи (https://dl.dropboxusercontent.com/u/57975554/PSV/SOURCE%20CODE.7z), в архиве должно быть всё, что тебе надо.

lupus
09.02.2014, 17:19
Если посмотреть на внутренние файлы, то видно, что они вполне читабельные, как и обычные. Получается они не упакованы еще раз.
Простые эксперименты со сборщиком flash0.tn из архива с исходниками tn-c мне говорят об обратном:
1. Размер flash0.tn меньше, чем суммарный размер файлов внутри него
2. Я так и не смог разглядеть внутри матрицу debug шрифта, которым выводится текст recovery и vsh меню.
Если с размером, ещё можно допустить, что часть длинных путей подменяется на короткае константы, то со шрифтом - совсем не ясно. Плюс ко всему, я попробовал поискать строки из recovery - тщетно.
Надеюсь, ты что-то накопаешь.

ErikPshat
14.02.2014, 23:53
Простые эксперименты со сборщиком flash0.tn из архива с исходниками tn-c мне говорят об обратном:Сорри, снова оказался на неделю без компа и инета, так что не было возможности проверить и измерить.

Я говорил о том, что файлы внутри нового FLASH0.TN лежат в непожатом виде, т.к. код файлов частично читаем и узнаваем.
НО! идёт подмена байтов. То есть, например 10 байтов подменяются на 2 байта. Отсюда и меньше размер(каждого внутрилежащего файла).
Какие-то 10 байтов подменяются по словарю на 2 байта(или 4) - E0 00, далее Е0 01, Е0 02...Е1 00, Е1 01, Е1 02 и т.д.

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

ErikPshat
15.02.2014, 00:34
Первое, что точно совпадает в файлах pspbtXnf.prx:

E000 => .prx
E001 => ?.prx
E002 = ??.prx
E003 = ???.prx (обычно man.prx)
E004 = ????.prx (напр. _01g.prx)

Примечание: ? - любой символ.

И то же самое с Е1, не пойму разницы с Е0.

E100 => .prx
E101 => ?.prx
E102 = ??.prx
E103 = ???.prx (обычно man.prx)
E104 = ????.prx (напр. _01g.prx)
E105 = ?????.prx (напр. d_01g.prx в слове "mesg_led_01g.prx")

lupus
18.02.2014, 09:30
Я в Киеве, дальше - в Рим, с собой только телефон, за комп вернусь только в понедельник.