decrypt_data:
int decrypt_data()
{
u64 edata_len;
u64 meta_offset;
u32 meta_len;
u32 meta_n_hdr;
u64 header_len;
u32 i;
u64 offset;
u64 size;
u32 keyid;
u32 ivid;
u8 *tmp;
u8 iv[0x10];
u8 key[0x10];
edata_len = be64(in + 0x88);
meta_offset = be32(self + 0x0c);
header_len = be64(self + 0x10);
meta_len = header_len - meta_offset;
meta_n_hdr = be32(self + meta_offset + 0x60 + 0xc);
for (i = 0; i < 0x01; i = i + 0x10) {
tmp = in + 0x90 + 0x10*i;
memcpy(key, self + meta_offset + 0x20 , 0x10);
memcpy(iv, self + meta_offset + 0x40 , 0x10);
aes128ctr(key,
iv,
in + 0xb0,
0x80,
in + 0xb0);
}
print_hash(key, 0x10);
printf("\n");
print_hash(iv, 0x10);
printf("\n");
printf("\n");
print_hash(in + 0x90, 0x10);
printf("\n");
print_hash(in + 0x90 + 0x10, 0x10);
printf("\n");
print_hash(in + 0x90 + 0x20, 0x10);
printf("\n");
print_hash(in + 0x90 + 0x30, 0x10);
printf("\n");
print_hash(in + 0x90 + 0x40, 0x10);
printf("\n");
print_hash(in + 0x90 + 0x50, 0x10);
printf("\n");
print_hash(in + 0x90 + 0x60, 0x10);
printf("\n");
return 0;
}
decrypt_npdrm
void decrypt_npdrm(u8 *ptr, struct keylist *klist, u8 *klicensee)
{
u32 meta_offset;
u8 d_klic[0x10];
u8 iv[0x10];
meta_offset = 0x70;
aes128(klist->klic, klicensee, d_klic);
print_hash(ptr + meta_offset + 0x20, 0x10);
printf("\n");
print_hash(ptr + meta_offset + 0x30, 0x10);
printf("\n");
print_hash(ptr + meta_offset + 0x40, 0x10);
printf("\n");
print_hash(ptr + meta_offset + 0x50, 0x10);
printf("\n");
// iv is 0
memset(iv, 0, sizeof iv);
aes128cbc(d_klic, iv, ptr + meta_offset + 0x20, 0x40, ptr + meta_offset + 0x20);
memcpy(iv, ptr + meta_offset + 0x40, 0x10);
aes128ctr(ptr + meta_offset + 0x20,
iv,
ptr + meta_offset + 0x60,
0x80,
ptr + meta_offset + 0x60);
print_hash(ptr + meta_offset + 0x20, 0x10);
printf("\n");
print_hash(ptr + meta_offset + 0x30, 0x10);
printf("\n");
print_hash(ptr + meta_offset + 0x40, 0x10);
printf("\n");
print_hash(ptr + meta_offset + 0x50, 0x10);
printf("\n");
}
decrypt_header
int decrypt_header(u8 *ptr, struct keylist *klist)
{
u32 meta_offset;
u32 meta_len;
u32 i, j;
u8 tmp[0x40];
int success = 0;
meta_offset = 0x90;
for (i = 0; i < klist->n; i++) {
aes256cbc(klist->keys[i].key,
klist->keys[i].iv,
ptr + meta_offset + 0x60,
0x40,
tmp);
success = 1;
for (j = 0x10; j < (0x10 + 0x10); j++)
if (tmp[j] != 0)
success = 0;
for (j = 0x30; j < (0x30 + 0x10); j++)
if (tmp[j] != 0)
success = 0;
if (success == 1) {
memcpy(ptr + meta_offset + 0x20, tmp, 0x40);
break;
}
}
if (success != 1)
return -1;
memcpy(tmp, ptr + meta_offset + 0x40, 0x10);
aes128ctr(ptr + meta_offset + 0x20,
tmp,
ptr + meta_offset + 0x60,
0x20,
ptr + meta_offset + 0x60);
meta_len = 0x80;
aes128ctr(ptr + meta_offset + 0x20,
tmp,
ptr + meta_offset + 0x80,
meta_len - 0x80,
ptr + meta_offset + 0x80);
return i;
}
Para ello hacen falta las keys NPDRM, que logicamente, no voy a postear aquí por motivos legales y quien quiera el pastie de todo completo, que abra mp(ojo, gente que sabe lo que hace, no gente curiosa, mas que nada porque no haran nada con ello )