NPA: Difference between revisions

From Game Research Wiki
Jump to navigation Jump to search
No edit summary
Line 37: Line 37:
|}
|}


== Research ==
== Addition Notes ==
The index data is protected. The way the program reads and processes this space is by first loading 4 bytes at the start of the file that is the size of the protected index. It then loads the whole index into memory. It then puts some data into the XMM0 register, which looks like the key. So far, it looks like it's static but I'll have to check if that's true for other files. It then enters the main decoding loop and loads 16 bytes into the next register, XMM1. It then XOR XMM1 by XMM0. It then puts the decoded part back into memory. By using SIMD related stuff, the program can decode 16 bytes at once with just a few instructions compared to exponentiation more steps to decode 1 byte at a time with a different key, constantly moving data in and out of the general registers. Just need to figure out if I can find a C/C++ implementation that can let me do the same. (128bit number xor? o.O wut...)
This format obsurse the data it stores. Both the index and data are protected in the same way. The first data read is 4 bytes at the start of the file. This is the size of the index and it's value is not obsured. Next the full index is read into memory and decoded by XOR'ing it by the key. Once the index is processed, data can be loaded but the data is protected the same way the index is. It's XOR'ed by a key. The program makes use of the XMM registers (SSE) and the assembly code ends up being a small, tight loop with just a few assembly instructions such as MOVDQA and PXOR.


Some notes about structure. File names appear to be 2 byte char strings (wstrings?).
{| class="wikitable"
|-
! Key !! Game(s)
|-
| BD AA BC B4 AB B6 BC B4 || Steins;Gate (JAST USA)


Key = BD AA BC B4 AB B6 BC B4 Unsure if this applies to other games but it works for Steins;Gate.
|}
 
Also, file data is protected in the same way the index data is.
 
File names are not in an easy encoding to deal with. As soon as you get into character encoding/code pages, things start to become complex fast.


== Tools ==
== Tools ==
Coming soon...
Coming soon...

Revision as of 20:16, 14 December 2015

Used in the following game(s):

  • Demonbane
  • Steins;Gate

Structure

Overall
Size Content Description
4 Bytes Index Size
? Bytes Index Data (protected)
? Bytes File Data (protected)
Index Header
Size Content Description
4 Bytes File count Number of index entries
Index Entry
4 Bytes Filename Length
? Bytes Filename Each character is 2 bytes
4 Bytes File Size
4 Bytes Offset
4 Bytes Unknown Always 0x00000000

Addition Notes

This format obsurse the data it stores. Both the index and data are protected in the same way. The first data read is 4 bytes at the start of the file. This is the size of the index and it's value is not obsured. Next the full index is read into memory and decoded by XOR'ing it by the key. Once the index is processed, data can be loaded but the data is protected the same way the index is. It's XOR'ed by a key. The program makes use of the XMM registers (SSE) and the assembly code ends up being a small, tight loop with just a few assembly instructions such as MOVDQA and PXOR.

Key Game(s)
BD AA BC B4 AB B6 BC B4 Steins;Gate (JAST USA)

Tools

Coming soon...