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 )