YAGAMI55, короче, ещё раз...
Вот я беру оригинальный файл из PSN -
NTJOBCODE.PPU.SPRX
Step1.png
А это я создаю пустой текстовик и переименовываю его как угодно, например
FILE.DAT.
Теперь шифрую его с тем же ContentID и теми же параметрами, как в исходнике SPRX и получаю вот такой маленький файл:
Step2.png- <format>: 1 - EDAT
- <data>: 1 - Finalized data
- <version>: 1 - EDAT version 1
- <compress>: 0 - Disable compression
- <block>: Block size in KB (16)
- <license>: 3 - Free license (uses klic as key)
- <type>: 00 - Common
- <cID>: Content ID (EP0102-NPEB90473_00-DMCDEMO000000001)
- <klic>: 1 - NPDRM OMAC key 1 (free license key)
Получился формат кодирования: 1 1 1 0 16 3 00 EP0102-NPEB90473_00-DMCDEMO000000001 1
Приступаем к шифрованию пустышки:
make_npdata -e FILE.DAT NTJOBCODE.PPU.SPRX 1 1 1 0 16 3 00 EP0102-NPEB90473_00-DMCDEMO000000001 1
И вот что получаем на скриншоте выше. Я специально поместил скриншоты поближе, чтобы можно было сравнить все байты. Как видно, они все сходятся с оригиналом, за исключением 3-ёх строк хешей.
1-ая строка рандомного хеша отличается, потому что у меня там свой рандомный набор цифр "
GoodLuckFromPSPx". Если туда забить тот же самый набор цифр, как у оригинала, а это можно сделать в исходниках вместо этого моего копирайта и заново скомпилировать make_npdata, тогда эта строка была бы в точности, как у оригинала, т.е. совпала бы точно. Я тебе писал об этой сложности, почему у тебя не получится, но потом удалил, т.к. в принципе это не имеет значения. Этот рандомный набор символов просто соль, которой подсаливается обычно хеш, чтобы он всегда был разный.
2-ая строка, как видно, совпала точно, потому что я использовал то же имя файла с расширением.
3-ья строка уже сгенерировалась другая, в соответствии с предыдущими данными 0x60 байт. И это правильно. Таким образом у нас изменённый ContentID стал валидным. А вот если бы я подогнал бы первый рандомный хеш, как у оригинала, тогда бы у меня и 3-ья контрольная сумма совпала.
Теперь осталось только подсчитать контрольную сумму всего файла:
Step3.png
После этого NPD блока идёт секция метаданных, даже если мы подписывали пустой файл. А далее идёт контрольная сумма блока метаданных и ECDSA, которая, как мы знаем, не проверяется, потому что в EDAT мы туда генерируем так же рандомные значения ECDSA от фонаря фейковые. Я в утилите make_npdata её вообще занулил, чтобы не мозолила глаза.
То есть, на этом примере я тебе показал, что можно сгенерировать даже оригинал с нуля, тупо из ничего, из пустого файла. И это даёт надежду, что можно подменить ContentID без палева.