Editing LIC.DAT
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
=Description= | |||
Location: /dev_bdvd/PS3_GAME/LICDIR/LIC.DAT (soon LIC.EDAT) | |||
Checked within Level 2 Kernel and possible via lv2syscall476<br> | |||
Final File size is: 0x10000 Bytes | |||
{ | |||
See also {{talk}} page | |||
= example = | |||
00000000 50 53 33 4C 49 43 44 41 00 00 00 01 80 00 00 00 PS3LICDA........ | |||
00000010 00 00 09 00 00 00 08 00 00 00 01 00 00 00 00 01 ................ | |||
00000020 8C D3 A9 D8 00 00 00 00 00 00 00 00 00 00 00 00 ................ | |||
... | |||
00000800 01 42 4C 45 53 30 31 36 32 33 00 00 00 00 00 00 .BLES01623...... | |||
... | |||
The structure is | = structure = | ||
The structure is dependant of how the file is created and processed by the PS3. The file is generated in 2 steps, in the first step is generated the header (with a crc32 filled with zeroes as a placeholder) and the licenses table, in second step the crc32 is calculated, added in the header, and filled with zeroes at the end up to 0x10000 | |||
PS3 first reads the file LIC.DAT (header + licenses table, not included the padding at end)... then it makes a copy of it (because is needed to edit it)... then it reads the crc32 area from the header and stores it separatedlly... then it fills the crc32 area with zeroes... and finally... it calculates the crc32 of the edited file | |||
== header == | |||
{|class="wikitable" | {|class="wikitable" | ||
|- | |||
! Offset !! Length !! Example !! Name !! Description | ! Offset !! Length !! Example !! Name !! Description | ||
|- | |- | ||
| 0x0 || 0x8 || 'PS3LICDA' || | | 0x0 || 0x8 || 'PS3LICDA' || Magic || | ||
|- | |- | ||
| 0x8 || 0x4 || | | 0x8 || 0x4 || 0x1 || Version || DAT version or license version ? | ||
|- | |- | ||
| 0xC || 0x4 || 0x80000000 || | | 0xC || 0x4 || 0x80000000 || License type ? || 0x00000000 = debug<br>0x80000000 = retail | ||
|- | |- | ||
| 0x10 || 0x4 || 0x00000900 | | 0x10 || 0x4 || 0x00000900 || License table, absolute end offset || chunks end (can be calculated with the formula: ''chunks start + chunk amounts * chunk size'') | ||
|- | |- | ||
| 0x14 || 0x4 || 0x00000800 | | 0x14 || 0x4 || 0x00000800 || License table, absolute start offset || chunks start (static) | ||
|- | |- | ||
| 0x18 || 0x4 || 0x00000100 || | | 0x18 || 0x4 || 0x00000100 || License size || chunk size (static) | ||
|- | |- | ||
| 0x1C || 0x4 || 0x00000001 || | | 0x1C || 0x4 || 0x00000001 || License amount || chunk amounts | ||
|- | |- | ||
| 0x20 || 0x4 || | | 0x20 || 0x4 || 0xD8A9D38C|| crc32 || CRC32 from the first byte till the end of last chunk (without CRC32 value) | ||
|} | |} | ||
==License table== | |||
=== chunk === | |||
{|class="wikitable" | {|class="wikitable" | ||
|- | |- | ||
! | ! Offset !! Length !! Value !! Description | ||
|- | |- | ||
| | | 0x800+i*0x100 || 0x1 || 0x1 || kind of ID | ||
|- | |- | ||
| | | 0x801+i*0x100 || ID depending || 'BLES01623' || Title ID / Contend ID | ||
|} | |} | ||
The first byte indicates type and size of following text: | The first byte indicates type and size of following text: | ||
* 0x01 means 0xA bytes, a regular TitleID (ex. BLES01623) with \0 terminating | * 0x01 means 0xA bytes, a regular TitleID (ex. BLES01623) with \0 terminating | ||
Line 90: | Line 63: | ||
* 0x03 means 0x25 bytes, a regular npdrm ContentID (ex. UP0002-BLES01623_00-0000111122223333) with \0 terminating | * 0x03 means 0x25 bytes, a regular npdrm ContentID (ex. UP0002-BLES01623_00-0000111122223333) with \0 terminating | ||
==Padding== | |||
{{File Formats}} | {{File Formats}} | ||
<noinclude>[[Category:Main]]</noinclude> | <noinclude>[[Category:Main]]</noinclude> |