Line 22: |
Line 22: |
| $0000 - $003F: padding (00) | | $0000 - $003F: padding (00) |
| $0040 - $013F: rsa encrypted sha-1 signature of rest of the file | | $0040 - $013F: rsa encrypted sha-1 signature of rest of the file |
− | $0140 - $....: compressed data | + | $0140 - $0143: header |
| + | $0144 - .....: compressed data |
| </pre> | | </pre> |
| | | |
− | Data compression method is still unknown. If you calculate entropy of the data, you will notice that it is definitely not encrypted. Probably it uses a modified version of propieritary Nintendo compression method described here: http://everything2.com/index.pl?node_id=1469892
| + | The compression is very simple: |
| + | # Read one byte |
| + | # For each bit of the byte, msb-to-lsb, |
| + | #* if 0, copy one byte to the output |
| + | #* if 1, read 16 bits msb first in v, copy n bytes at offset m from the end of the output, n=3+(v>>12), m=v & fff |
| + | |
| + | Quick and very dirty C code: |
| + | i = 0x144; |
| + | j = 0; |
| + | while(i < size) { |
| + | int k; |
| + | int v = data[i++]; |
| + | for(k=0; k<8; k++) |
| + | if(!(v & (1 << (7-k)))) { |
| + | result_data[j++] = data[i++]; |
| + | } else { |
| + | int vv = (data[i] << 8) | data[i+1]; |
| + | int nb = 3+(vv >> 12); |
| + | int off = (vv & 0xfff); |
| + | int l; |
| + | i+=2; |
| + | for(l=0; l<nb; l++) { |
| + | result_data[j] = result_data[j-off-1]; |
| + | j++; |
| + | } |
| + | } |
| + | } |
| | | |
| [[Category:Software]][[Category:Wii channel]] | | [[Category:Software]][[Category:Wii channel]] |