ReverseBox 0.23.2__tar.gz → 0.23.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. {reversebox-0.23.2 → reversebox-0.23.4}/PKG-INFO +2 -1
  2. {reversebox-0.23.2 → reversebox-0.23.4}/README.md +1 -0
  3. {reversebox-0.23.2 → reversebox-0.23.4}/ReverseBox.egg-info/PKG-INFO +2 -1
  4. {reversebox-0.23.2 → reversebox-0.23.4}/ReverseBox.egg-info/SOURCES.txt +1 -0
  5. reversebox-0.23.4/reversebox/encryption/encryption_hatch_engine.py +69 -0
  6. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/io_files/file_handler.py +28 -0
  7. {reversebox-0.23.2 → reversebox-0.23.4}/setup.py +1 -1
  8. {reversebox-0.23.2 → reversebox-0.23.4}/LICENSE +0 -0
  9. {reversebox-0.23.2 → reversebox-0.23.4}/ReverseBox.egg-info/dependency_links.txt +0 -0
  10. {reversebox-0.23.2 → reversebox-0.23.4}/ReverseBox.egg-info/requires.txt +0 -0
  11. {reversebox-0.23.2 → reversebox-0.23.4}/ReverseBox.egg-info/top_level.txt +0 -0
  12. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/__init__.py +0 -0
  13. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/__init__.py +0 -0
  14. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_adler32.py +0 -0
  15. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_fletcher16.py +0 -0
  16. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_fletcher32.py +0 -0
  17. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_internet_ipv4_header.py +0 -0
  18. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_sum8.py +0 -0
  19. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_sum8_2s_complement.py +0 -0
  20. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_unix_sum_bsd16.py +0 -0
  21. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_unix_sum_sysv.py +0 -0
  22. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/checksum/checksum_xor8.py +0 -0
  23. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/common/__init__.py +0 -0
  24. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/common/common.py +0 -0
  25. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/common/logger.py +0 -0
  26. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/compression/__init__.py +0 -0
  27. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/compression/compression_jcalg1.py +0 -0
  28. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/compression/compression_lzo.py +0 -0
  29. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/compression/compression_mio0.py +0 -0
  30. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/compression/compression_refpack.py +0 -0
  31. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/compression/compression_zlib.py +0 -0
  32. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/__init__.py +0 -0
  33. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc16_arc.py +0 -0
  34. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc16_ccitt.py +0 -0
  35. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc16_dnp.py +0 -0
  36. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc16_ea_crcf.py +0 -0
  37. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc16_kermit.py +0 -0
  38. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc16_modbus.py +0 -0
  39. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc16_sick.py +0 -0
  40. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc32_asobo.py +0 -0
  41. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc32_iso_hdlc.py +0 -0
  42. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc64_asobo.py +0 -0
  43. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc64_go_iso.py +0 -0
  44. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc8.py +0 -0
  45. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/crc/crc_unix_cksum.py +0 -0
  46. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/encryption/__init__.py +0 -0
  47. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/encryption/encryption_rot13.py +0 -0
  48. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/encryption/encryption_xor_basic.py +0 -0
  49. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/encryption/encryption_xor_basic_key_guesser.py +0 -0
  50. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/encryption/encryption_xor_gianas_return_zda.py +0 -0
  51. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/encryption/encryption_xor_retro64_eco.py +0 -0
  52. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/__init__.py +0 -0
  53. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_ap.py +0 -0
  54. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_djb2.py +0 -0
  55. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_fnv.py +0 -0
  56. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_md2.py +0 -0
  57. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_md5.py +0 -0
  58. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_sdbm.py +0 -0
  59. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_sha1.py +0 -0
  60. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/hash/hash_sha2.py +0 -0
  61. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/__init__.py +0 -0
  62. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/common.py +0 -0
  63. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/compression/__init__.py +0 -0
  64. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/compression/compression_gst.py +0 -0
  65. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/compression/compression_lzw.py +0 -0
  66. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/compression/compression_packbits.py +0 -0
  67. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/compression/compression_rle_tga.py +0 -0
  68. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/compression/compression_zlib.py +0 -0
  69. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/decoders/__init__.py +0 -0
  70. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/decoders/bumpmap_decoder.py +0 -0
  71. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/decoders/compressed_decoder.py +0 -0
  72. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/decoders/gst_decoder.py +0 -0
  73. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/decoders/n64_decoder.py +0 -0
  74. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/decoders/yuv_decoder.py +0 -0
  75. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/encoders/__init__.py +0 -0
  76. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/encoders/gst_encoder.py +0 -0
  77. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/file_formats/__init__.py +0 -0
  78. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/file_formats/image_dds.py +0 -0
  79. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/image_decoder.py +0 -0
  80. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/image_encoder.py +0 -0
  81. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/image_formats.py +0 -0
  82. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/palettes/__init__.py +0 -0
  83. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/palettes/palette_random.py +0 -0
  84. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/pillow_wrapper.py +0 -0
  85. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/__init__.py +0 -0
  86. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_3ds.py +0 -0
  87. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_bc.py +0 -0
  88. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_cmpr.py +0 -0
  89. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_gamecube.py +0 -0
  90. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_gst.py +0 -0
  91. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_morton.py +0 -0
  92. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_morton_ps4.py +0 -0
  93. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_ps2.py +0 -0
  94. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_psp.py +0 -0
  95. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_psvita_dreamcast.py +0 -0
  96. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_switch.py +0 -0
  97. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/image/swizzling/swizzle_x360.py +0 -0
  98. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/io_files/__init__.py +0 -0
  99. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/io_files/bytes_handler.py +0 -0
  100. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/io_files/bytes_helper_functions.py +0 -0
  101. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/io_files/check_file.py +0 -0
  102. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/io_files/mod_handler.py +0 -0
  103. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/io_files/translation_text_handler.py +0 -0
  104. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/libs/DirectXTex.dll +0 -0
  105. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/libs/__init__.py +0 -0
  106. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/libs/ea_swizzle.dll +0 -0
  107. {reversebox-0.23.2 → reversebox-0.23.4}/reversebox/libs/refpack.dll +0 -0
  108. {reversebox-0.23.2 → reversebox-0.23.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ReverseBox
3
- Version: 0.23.2
3
+ Version: 0.23.4
4
4
  Summary: A set of functions useful in reverse engineering.
5
5
  Home-page: https://github.com/bartlomiejduda/ReverseBox
6
6
  Author: Bartlomiej Duda
@@ -109,6 +109,7 @@ or software researchers).
109
109
  - ROT13 ✔️
110
110
  - XOR Cipher (Basic) ✔️
111
111
  - XOR Cipher (Basic) Guesser ✔️
112
+ - Hatch Engine Encryption ✔️
112
113
  - (game-specific) XOR Cipher (Retro64 ECO) ✔️
113
114
  - (game-specific) XOR Cipher (Giana’s Return ZDA) ✔️
114
115
 
@@ -74,6 +74,7 @@ or software researchers).
74
74
  - ROT13 ✔️
75
75
  - XOR Cipher (Basic) ✔️
76
76
  - XOR Cipher (Basic) Guesser ✔️
77
+ - Hatch Engine Encryption ✔️
77
78
  - (game-specific) XOR Cipher (Retro64 ECO) ✔️
78
79
  - (game-specific) XOR Cipher (Giana’s Return ZDA) ✔️
79
80
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ReverseBox
3
- Version: 0.23.2
3
+ Version: 0.23.4
4
4
  Summary: A set of functions useful in reverse engineering.
5
5
  Home-page: https://github.com/bartlomiejduda/ReverseBox
6
6
  Author: Bartlomiej Duda
@@ -109,6 +109,7 @@ or software researchers).
109
109
  - ROT13 ✔️
110
110
  - XOR Cipher (Basic) ✔️
111
111
  - XOR Cipher (Basic) Guesser ✔️
112
+ - Hatch Engine Encryption ✔️
112
113
  - (game-specific) XOR Cipher (Retro64 ECO) ✔️
113
114
  - (game-specific) XOR Cipher (Giana’s Return ZDA) ✔️
114
115
 
@@ -41,6 +41,7 @@ reversebox/crc/crc64_go_iso.py
41
41
  reversebox/crc/crc8.py
42
42
  reversebox/crc/crc_unix_cksum.py
43
43
  reversebox/encryption/__init__.py
44
+ reversebox/encryption/encryption_hatch_engine.py
44
45
  reversebox/encryption/encryption_rot13.py
45
46
  reversebox/encryption/encryption_xor_basic.py
46
47
  reversebox/encryption/encryption_xor_basic_key_guesser.py
@@ -0,0 +1,69 @@
1
+ """
2
+ Copyright © 2025 Bartłomiej Duda
3
+ License: GPL-3.0 License
4
+ """
5
+
6
+ from reversebox.crc.crc32_iso_hdlc import CRC32Handler
7
+ from reversebox.io_files.bytes_helper_functions import set_uint32, set_uint64
8
+
9
+ # Encryption algorithm used in Hatch Engine games
10
+ # e.g. Data.hatch archive from "Sonic Galactic" (Demo 2) game
11
+
12
+
13
+ def decrypt_hatch_data(f_data: bytes, filename: str, f_size: int) -> bytes:
14
+ crc_handler = CRC32Handler()
15
+ keyA: bytearray = bytearray(16)
16
+ keyB: bytearray = bytearray(16)
17
+ decrypted_data: bytearray = bytearray(f_data)
18
+
19
+ filename_hash: int = crc_handler.calculate_crc32(filename.encode("ascii"))
20
+ encoded_filename_hash: bytes = set_uint32(filename_hash, "<")
21
+ encoded_size_value: bytes = set_uint64(f_size, "<")
22
+ size_hash: int = crc_handler.calculate_crc32(encoded_size_value)
23
+ encoded_size_hash: bytes = set_uint32(size_hash, "<")
24
+
25
+ for i in range(4):
26
+ keyA[i * 4 : (i + 1) * 4] = encoded_filename_hash
27
+
28
+ for i in range(4):
29
+ keyB[i * 4 : (i + 1) * 4] = encoded_size_hash
30
+
31
+ swap_nibbles: int = 0
32
+ index_keyA: int = 0
33
+ index_keyB: int = 8
34
+
35
+ xor_value = (f_size >> 2) & 0x7F
36
+
37
+ for x in range(f_size):
38
+ temp = decrypted_data[x]
39
+
40
+ temp ^= xor_value ^ keyB[index_keyB]
41
+ index_keyB += 1
42
+
43
+ if swap_nibbles:
44
+ temp = ((temp & 0x0F) << 4) | ((temp & 0xF0) >> 4)
45
+
46
+ temp ^= keyA[index_keyA]
47
+ index_keyA += 1
48
+
49
+ decrypted_data[x] = temp
50
+
51
+ if index_keyA <= 15:
52
+ if index_keyB > 12:
53
+ index_keyB = 0
54
+ swap_nibbles ^= 1
55
+ elif index_keyB <= 8:
56
+ index_keyA = 0
57
+ swap_nibbles ^= 1
58
+ else:
59
+ xor_value = (xor_value + 2) & 0x7F
60
+ if swap_nibbles:
61
+ swap_nibbles = 0
62
+ index_keyA = xor_value % 7
63
+ index_keyB = (xor_value % 12) + 2
64
+ else:
65
+ swap_nibbles = 1
66
+ index_keyA = (xor_value % 12) + 3
67
+ index_keyB = xor_value % 7
68
+
69
+ return decrypted_data
@@ -16,18 +16,22 @@ from reversebox.io_files.bytes_helper_functions import (
16
16
  get_int16,
17
17
  get_int24,
18
18
  get_int32,
19
+ get_int64,
19
20
  get_uint8,
20
21
  get_uint16,
21
22
  get_uint24,
22
23
  get_uint32,
24
+ get_uint64,
23
25
  set_int8,
24
26
  set_int16,
25
27
  set_int24,
26
28
  set_int32,
29
+ set_int64,
27
30
  set_uint8,
28
31
  set_uint16,
29
32
  set_uint24,
30
33
  set_uint32,
34
+ set_uint64,
31
35
  )
32
36
 
33
37
  logger = get_logger(__name__)
@@ -218,6 +222,18 @@ class FileHandler:
218
222
  data = self.file.read(4)
219
223
  return get_uint32(data, self.endianess)
220
224
 
225
+ def read_int64(self) -> int:
226
+ self._check_file()
227
+ self._check_read_mode()
228
+ data = self.file.read(8)
229
+ return get_int64(data, self.endianess)
230
+
231
+ def read_uint64(self) -> int:
232
+ self._check_file()
233
+ self._check_read_mode()
234
+ data = self.file.read(8)
235
+ return get_uint64(data, self.endianess)
236
+
221
237
  ###
222
238
  ###
223
239
  ###
@@ -288,3 +304,15 @@ class FileHandler:
288
304
  self._check_write_mode()
289
305
  self.file.write(set_uint32(value, self.endianess))
290
306
  return True
307
+
308
+ def write_int64(self, value: int) -> bool:
309
+ self._check_file()
310
+ self._check_write_mode()
311
+ self.file.write(set_int64(value, self.endianess))
312
+ return True
313
+
314
+ def write_uint64(self, value: int) -> bool:
315
+ self._check_file()
316
+ self._check_write_mode()
317
+ self.file.write(set_uint64(value, self.endianess))
318
+ return True
@@ -8,7 +8,7 @@ from typing import Final
8
8
 
9
9
  import setuptools
10
10
 
11
- VERSION_NUM: Final[str] = "0.23.2"
11
+ VERSION_NUM: Final[str] = "0.23.4"
12
12
 
13
13
 
14
14
  def get_long_description() -> str:
File without changes
File without changes