Moderator note: this question has moved there at reverseengineering-SE.
I'm trying to reverse the save game of an old game. It use text codes to save the games (anyone remember this?). When decoded the data contains game info like level, checkpoint, objects in inventory, etc.
I ported the code of the decoding function from assembler to Python. I now would like to produce the inverse function in order to have an encoder and to be able to forge saved games.
The problem is I don't understand the math behind the code and I don't know how to create the inverse function. I've read a lot about encoding and biwise operators but I still don't have the skill to do this.
I also would like to learn how this type of encoding is called and where to read about it. Any help would be great. :)
Here is the code:
def load_and_decode_value(text, index, table):
current_char = ord(text[index])
return table[current_char]
def decode(text):
with open("DECODE_TABLE.bin", mode='rb') as file:
DECODE_TABLE = file.read()
decoded = []
char_index = 0
text_len = len(text)
val_0 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_1 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_next_0 = (val_0 * 2048) | (val_1 * 64)
val_1 = (val_next_0 // 256) & 0xFF
decoded.append(val_1)
val_2 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_3 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_next_1 = (((val_2 * 2) | val_next_0) * 16777216) | (val_3 * 1048576)
val_3 = (val_next_1 // 16777216) & 0xFF
decoded.append(val_3)
val_4 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_next_2 = val_next_1 | (val_4 * 32768)
val_4 = (val_next_2 // 65536) & 0xFF
decoded.append(val_4)
val_5 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_6 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_next_2 = val_next_2 | (val_5 * 1024)
val_next_3 = val_next_2 | (val_6 * 32)
val_6 = (val_next_3 // 256) & 0xFF
decoded.append(val_6)
val_7 = load_and_decode_value(text, char_index, DECODE_TABLE)
char_index += 1
val_8 = (val_next_3 | val_7) & 0xFF
decoded.append(val_8)
return decoded
def encoded(binary):
#todo...
return
The content of decode table:
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF 00 01 02 03 04 05 06 07 08 09 FF FF FF FF FF FF FF 0A 0B 0C 0D
0E 0F 10 11 01 12 13 01 14 15 00 16 17 18 19 1A FF 1B 1C 1D 1E 1F FF
FF FF FF FF FF 0A 0B 0C 0D 0E 0F 10 11 01 12 13 01 14 15 00 16 17 18
19 1A 1B FF 1C 1D 1E 1F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF