DAT (Ever17): Difference between revisions
No edit summary |
|||
(50 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
[[Category:Archives]] | [[Category:Archives]] | ||
Used in the following game(s): | |||
* Ever17 (PC) | |||
* Ever17 | |||
== Structure == | == Structure == | ||
Line 14: | Line 13: | ||
| 4Bytes|| File Count || | | 4Bytes|| File Count || | ||
|- | |- | ||
| 8Bytes|| | | 8Bytes|| Padding || 0x00 | ||
|- | |- | ||
!colspan="15"|Index | !colspan="15"|Index | ||
Line 22: | Line 21: | ||
| 4Bytes || Offset || Starts from zero. | | 4Bytes || Offset || Starts from zero. | ||
|- | |- | ||
| 4Bytes|| File Size || Stored value is actual size | | 4Bytes|| File Size || Stored value is double the actual size | ||
|- | |- | ||
| 24Bytes|| File name || | | 24Bytes|| File name || Unused space will be padding (0x00). | ||
|} | |} | ||
Notes | == Notes == | ||
The files inside saver.dat, sysvoice.dat, and wallpaper.dat for Ever17 have had a small chunk data obfuscated. From offset 0x1100 to 0x1200 (256 bytes), data has been modified which breaks/corrupts the file. To undo this modification requires generating numbers to subtract from each byte in the affected area. | |||
To generate these numbers, start off by adding each character in the file name of the file in question together, byte-by-byte. For example: 'test' 0x74 0x65 0x73 0x74 = 0x1C0 and then truncate the number down to 1 byte so 0xC0. This would be the first difference number out of the 256. The rest of the numbers are generated by using the previous number in a series of calculations. | |||
* 1.) temp = previousNum + (previousNum * 2) | |||
* 2.) temp = temp + (temp * 8) | |||
* 3.) nextNum = previousNum + (temp * 4) + 1243 | |||
Note: This can probably be optimized to one statement to make it more readable. | |||
y = x + (((x + (x * 2)) + (x + (x * 2) * 8))* 4) + 1243 | |||
y = 81x + 1243 | |||
nextNum = (81 * previousNum) + 1243; | |||
A C++ representation. | |||
<syntaxhighlight lang="cpp"> | |||
unsigned char diff_array[256]; | |||
void diff_gen(std::string &incoming_filename) | |||
{ | |||
char firstValue = 0; | |||
for (int i = 0; i < incoming_filename.size(); i++) //Better be 14 bytes... Though adding 0x00 shouldn't affect output. | |||
{ | |||
firstValue += incoming_filename[i]; | |||
} | |||
diff_array[0] = firstValue; | |||
for (int i = 1; i < 255; i++) | |||
{ | |||
diff_array[i] = diff_array[i - 1] * 81 + 1243; | |||
} | |||
} | |||
</syntaxhighlight> | |||
== Tools == | |||
-n/a- |
Latest revision as of 23:19, 5 October 2016
Used in the following game(s):
- Ever17 (PC)
Structure
Header | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Size | Content | Description | ||||||||||||
4Bytes | Magic/ID | |||||||||||||
4Bytes | File Count | |||||||||||||
8Bytes | Padding | 0x00 | ||||||||||||
Index | ||||||||||||||
Size | Content | Description | ||||||||||||
4Bytes | Offset | Starts from zero. | ||||||||||||
4Bytes | File Size | Stored value is double the actual size | ||||||||||||
24Bytes | File name | Unused space will be padding (0x00). |
Notes
The files inside saver.dat, sysvoice.dat, and wallpaper.dat for Ever17 have had a small chunk data obfuscated. From offset 0x1100 to 0x1200 (256 bytes), data has been modified which breaks/corrupts the file. To undo this modification requires generating numbers to subtract from each byte in the affected area.
To generate these numbers, start off by adding each character in the file name of the file in question together, byte-by-byte. For example: 'test' 0x74 0x65 0x73 0x74 = 0x1C0 and then truncate the number down to 1 byte so 0xC0. This would be the first difference number out of the 256. The rest of the numbers are generated by using the previous number in a series of calculations.
- 1.) temp = previousNum + (previousNum * 2)
- 2.) temp = temp + (temp * 8)
- 3.) nextNum = previousNum + (temp * 4) + 1243
Note: This can probably be optimized to one statement to make it more readable.
y = x + (((x + (x * 2)) + (x + (x * 2) * 8))* 4) + 1243
y = 81x + 1243
nextNum = (81 * previousNum) + 1243;
A C++ representation.
unsigned char diff_array[256];
void diff_gen(std::string &incoming_filename)
{
char firstValue = 0;
for (int i = 0; i < incoming_filename.size(); i++) //Better be 14 bytes... Though adding 0x00 shouldn't affect output.
{
firstValue += incoming_filename[i];
}
diff_array[0] = firstValue;
for (int i = 1; i < 255; i++)
{
diff_array[i] = diff_array[i - 1] * 81 + 1243;
}
}
Tools
-n/a-