A set of functions useful in reverse engineering.


Keywords
ReverseBox, reverse, engineering, RE, CRC, Hash, Encryption, Compression, Checksum, Python, image, decode, decoding, RGB, swizzle, swizzling, morton, twiddle, twiddling, texture, UYVY, YUY2, NV21, NV12, RGBA, RGBA8888, RGBA8, BGR, grayscale, graphics, color, pixel, convert, converting, YUV, RAW, cipher, modding, modding-tools, reverse-engineering, xentax
License
GPL-3.0
Install
pip install ReverseBox==0.9.7

Documentation

Info

ReverseBox is a Python package with a set of functions useful in software reverse engineering.

Why ReverseBox?
It's designed to help with:

  1. Decompressing / compressing data
  2. Decrypting / encrypting data
  3. Tedious reverse engineering tasks e.g. testing different checksum algorithms to find the one that was used in the software or file format
  4. Figuring out file formats
  5. Parsing data structures
  6. Wrapping functions for input/output operations
  7. Searching for raw images

Who should use ReverseBox?
Mostly developers and reverse engineers (e.g. file format researchers or software researchers).

List of functionalities

  • Checksum

    • Adler32 βœ”οΈ
    • Fletcher16 βœ”οΈ
    • Fletcher32 βœ”οΈ
    • Internet Checksum / IPv4 header checksum βœ”οΈ
    • Sum8 βœ”οΈ
    • Sum8 2s Complement βœ”οΈ
    • Unix Sum BSD16 βœ”οΈ
    • Unix Sum SYSV βœ”οΈ
    • Xor8 βœ”οΈ
  • CRC

    • CRC-8 βœ”οΈ
    • CRC-8/CDMA2000 βœ”οΈ
    • CRC-8/DARC βœ”οΈ (wrapper only)
    • CRC-16 (ARC) βœ”οΈ
    • CRC-16 (Modbus) βœ”οΈ
    • CRC-16 (Sick) βœ”οΈ
    • CRC-16 (DNP) βœ”οΈ
    • CRC-16 (EA CRCF) βœ”οΈ
    • CRC-16-CCITT (XModem) βœ”οΈ
    • CRC-16-CCITT (0xFFFF) βœ”οΈ
    • CRC-16-CCITT (0x1D0F) βœ”οΈ
    • CRC-16-CCITT (Kermit) βœ”οΈ
    • CRC-32/CKSUM (Unix cksum) βœ”οΈ
    • CRC-32 (ISO/HDLC) βœ”οΈ
    • CRC-32 (Asobo) βœ”οΈ
    • CRC-64 (Asobo) βœ”οΈ
    • CRC-64/GO-ISO βœ”οΈ (wrapper only)
  • Compression

    • Asobo (TODO) ❌
    • BZE/BZZ (TODO) ❌
    • BZIP2 (TODO) ❌
    • GZIP (TODO) ❌
    • JCALG1 (TODO) ❌
    • LZMA (TODO) ❌
    • LZO / LZO1X βœ”οΈ (wrapper only)
    • LZSS (TODO) ❌
    • MIO0 βœ”οΈ
    • NitroSDK (TODO) ❌
    • Oodle (TODO) ❌
    • Refpack (EA Games) βœ”οΈ (wrapper only)
    • RNC (TODO) ❌
    • ZLIB βœ”οΈ (wrapper only)
  • Encryption

    • AES (TODO) ❌
    • DES (TODO) ❌
    • Lucifer / DTD-1 (TODO) ❌
    • ROT13 βœ”οΈ
    • XOR Cipher (Basic) βœ”οΈ
    • XOR Cipher (Basic) Guesser βœ”οΈ
    • (game-specific) XOR Cipher (Retro64 ECO) βœ”οΈ
    • (game-specific) XOR Cipher (Giana’s Return ZDA) βœ”οΈ
  • Hash

    • DJB2 βœ”οΈ
    • FNV0-32 βœ”οΈ
    • FNV0-64 βœ”οΈ
    • FNV1-32 βœ”οΈ
    • FNV1-64 βœ”οΈ
    • FNV1A-32 βœ”οΈ
    • FNV1A-64 βœ”οΈ
    • SHA-1 βœ”οΈ (wrapper only)
    • SHA-2 (256 bits) βœ”οΈ (wrapper only)
    • MD2 βœ”οΈ (wrapper only)
    • MD5 βœ”οΈ (wrapper only)
    • (game-specific) Hercules (TODO) ❌
    • (game-specific) E-racer (TODO) ❌
  • Image

    • Decode RGB121 βœ”οΈ
    • Decode RGB121_BYTE βœ”οΈ
    • Decode RGBA2222 βœ”οΈ
    • Decode RGBX2222 βœ”οΈ
    • Decode GRAY8 βœ”οΈ
    • Decode RGBX332 (RGB8) βœ”οΈ
    • Decode BGRX332 (BGR8) βœ”οΈ
    • Decode RGB565 βœ”οΈ
    • Decode BGR565 βœ”οΈ
    • Decode RGBX5551 βœ”οΈ
    • Decode RGBA5551 βœ”οΈ
    • Decode RGB888 (RGB24) βœ”οΈ
    • Decode BGR888 (BGR24) βœ”οΈ
    • Decode ARGB4444 βœ”οΈ
    • Decode RGBA4444 βœ”οΈ
    • Decode RGBX4444 βœ”οΈ
    • Decode BGRX4444 βœ”οΈ
    • Decode XRGB1555 βœ”οΈ
    • Decode ARGB1555 βœ”οΈ
    • Decode ABGR1555 βœ”οΈ
    • Decode XBGR1555 βœ”οΈ
    • Decode ARGB8888 βœ”οΈ
    • Decode ABGR8888 βœ”οΈ
    • Decode RGBA8888 βœ”οΈ
    • Decode BGRA8888 βœ”οΈ
    • Decode RGB48 βœ”οΈ
    • Decode BGR48 βœ”οΈ
    • Decode PAL4_RGBX5551 βœ”οΈ
    • Decode PAL4_RGB888 βœ”οΈ
    • Decode PAL4_IA8 βœ”οΈ
    • Decode PAL4_RGB565 βœ”οΈ
    • Decode PAL4_RGB5A3 βœ”οΈ
    • Decode PAL4_RGBA8888 βœ”οΈ
    • Decode PAL4_RGB5A3 βœ”οΈ
    • Decode PAL8_RGBX2222 βœ”οΈ
    • Decode PAL8_RGBX5551 βœ”οΈ
    • Decode PAL8_BGRX5551 βœ”οΈ
    • Decode PAL8_RGB888 βœ”οΈ
    • Decode PAL8_BGR888 βœ”οΈ
    • Decode PAL8_RGBX6666 βœ”οΈ
    • Decode PAL8_IA8 βœ”οΈ
    • Decode PAL8_RGB565 βœ”οΈ
    • Decode PAL8_RGB5A3 βœ”οΈ
    • Decode PAL8_RGBA8888 βœ”οΈ
    • Decode PAL8_BGRA8888 βœ”οΈ
    • Decode PAL16_IA8 βœ”οΈ
    • Decode PAL16_RGB565 βœ”οΈ
    • Decode PAL16_RGB5A3 βœ”οΈ
    • Decode N64_RGB5A3 βœ”οΈ
    • Decode N64_I4 βœ”οΈ
    • Decode N64_I8 βœ”οΈ
    • Decode N64_IA4 βœ”οΈ
    • Decode N64_IA8 βœ”οΈ
    • Decode N64_RGBA32 βœ”οΈ
    • Decode N64_CMPR βœ”οΈ
    • Decode DXT1 βœ”οΈ
    • Decode DXT3 βœ”οΈ
    • Decode DXT5 βœ”οΈ
    • Decode GST121 βœ”οΈ
    • Decode GST221 βœ”οΈ
    • Decode GST421 βœ”οΈ
    • Decode GST821 βœ”οΈ
    • Decode GST122 βœ”οΈ
    • Decode GST222 βœ”οΈ
    • Decode GST422 βœ”οΈ
    • Decode GST822 βœ”οΈ
    • Decode YUY2 βœ”οΈ
    • Decode NV12 βœ”οΈ
    • Decode NV21 βœ”οΈ
    • Decode UYVY βœ”οΈ
    • Decode YUV444P βœ”οΈ
    • Decode YUV410P βœ”οΈ
    • Decode YUV420P βœ”οΈ
    • Decode YUV422P βœ”οΈ
    • Decode YUV411P βœ”οΈ
    • Decode UYYVYY411 βœ”οΈ
    • Decode YUV440P βœ”οΈ
    • Decode YUVA420P βœ”οΈ
    • Decode GRAY8A (LA88) βœ”οΈ
    • Decode GRAY16 βœ”οΈ
    • Decode XRGB8888 βœ”οΈ
    • Decode RGBX8888 βœ”οΈ
    • Decode XBGR8888 βœ”οΈ
    • Decode BGRX8888 βœ”οΈ
    • Decode BUMPMAP_SR βœ”οΈ
    • 3DS Swizzling/Twiddling βœ”οΈ
    • CMPR Swizzling/Twiddling βœ”οΈ
    • PS2 Swizzling/Twiddling βœ”οΈ
    • PSP Swizzling/Twiddling βœ”οΈ
    • GameCube/WII Swizzling/Twiddling βœ”οΈ
    • PSVITA Swizzling/Twiddling βœ”οΈ
    • Switch Swizzling/Twiddling βœ”οΈ
    • XBOX/PS3 Swizzling/Twiddling (Morton Order) βœ”οΈ
    • Dreamcast Swizzling/Twiddling (Morton Order) βœ”οΈ
    • BC Swizzling/Twiddling βœ”οΈ
    • PS2 GS Texture Swizzling/Twiddling βœ”οΈ
    • PS2 GS Texture Compression βœ”οΈ
  • IO

    • File Reader βœ”οΈ
    • File Writer βœ”οΈ
    • Bytes Handler βœ”οΈ
    • Translation Text Handler βœ”οΈ
    • Mod Handler βœ”οΈ
    • File extension checking βœ”οΈ
    • Padding calculation βœ”οΈ
    • File size checking βœ”οΈ

Checksum calculation - example

// CRC32 calculation

from reversebox.crc import crc32_iso_hdlc
from reversebox.common import common

test_data = b'123456789'
crc32_handler = crc32_iso_hdlc.CRC32Handler()
crc32 = crc32_handler.calculate_crc32(test_data)
print("CRC32_INT: ", crc32)
print("CRC32_STR: ", common.convert_int_to_hex_string(crc32))

// CRC32 output

CRC32_INT:  3421780262
CRC32_STR:  0xCBF43926

XOR encryption - example

// XOR Cipher (Basic)

from reversebox.encryption.encryption_xor_basic import xor_cipher_basic


test_data = b'abcd'
test_key = b'\x3D'
xor_result = xor_cipher_basic(test_data, test_key)
print(xor_result)

// XOR Cipher output

b'\\_^Y'

File Handler - example

// File reading

import os
from reversebox.io_files.file_handler import FileHandler


file_path = os.path.join(os.path.dirname(__file__), "file.bin")
file_reader = FileHandler(file_path, "rb")
file_reader.open()
value = file_reader.read_str(4, "utf8")
print(value)

// File Reader Output

ABCD

Hash calculation - example

// SHA-1 calculation

from reversebox.hash.hash_sha1 import SHA1Handler

test_data = b'abcd'
sha1_handler = SHA1Handler()
sha1 = sha1_handler.calculate_sha1_hash(test_data)
print("SHA-1 hash: ", sha1)

// SHA-1 Output

SHA-1 hash:  b'\x81\xfe\x8b\xfe\x87Wl>\xcb"Bo\x8eW\x84s\x82\x91z\xcf'

Image decoding - example

// DXT1 compressed image decoding

from reversebox.image.image_decoder import ImageDecoder
from reversebox.image.image_formats import ImageFormats
from reversebox.image.pillow_wrapper import PillowWrapper


def show_img():
    with open("image_data.bin", "rb") as f:
        image_data = f.read()

    img_width: int = 64
    img_height: int = 64
    decoder = ImageDecoder()
    wrapper = PillowWrapper()
    converted_data: bytes = decoder.decode_compressed_image(image_data, img_width, img_height, ImageFormats.DXT1)
    pil_image = wrapper.get_pillow_image_from_rgba8888_data(converted_data, img_width, img_height)
    pil_image.show()


if __name__ == '__main__':
    show_img()

More Examples

Need more examples?
Check out list of tools written using ReverseBox: