donIV-cli/donIV/shellcode/bin2cppheader.py
2025-01-31 18:28:43 +00:00

72 lines
1.9 KiB
Python

# bin2cppheader.py
# Convert a binary file to its static std::array representation as an
# includable header file in your C++ project.
# Author: Adam Macdonald [https://github.com/twokilohertz]
usage = "Usage: python bin2cppheader.py in_file [out_file]"
import sys
import mmap
from pathlib import Path
# Helper function for printing to stderr
def eprint(*args, **kwargs):
return print(*args, file=sys.stderr, **kwargs)
def read_bin(bin_path):
ret_buf = []
with open(bin_path, "rb") as f:
with mmap.mmap(f.fileno(), length=0, prot=mmap.PROT_READ) as mm:
ret_buf = mm.read()
return ret_buf
return ret_buf
def bin_to_header(data, symbol_name, namespace = "bin"):
ret_str = "#pragma once\n#include <array>\n#include <cstdint>\nnamespace " + namespace + " { constexpr const std::array<std::uint8_t, "+ str(len(data)) + "> " + symbol_name + " {"
for b in data:
ret_str += "{:#04x}".format(b) + ", "
ret_str = ret_str[:-2]
ret_str += "};}"
return ret_str
if __name__ == "__main__":
if len(sys.argv) < 2:
eprint(usage)
exit(1)
# Some validation on the input path
in_path = Path(sys.argv[1])
if not in_path.exists():
eprint("input path does not exist")
exit(1)
if not in_path.is_file():
eprint("input path is not a file")
exit(1)
# Read data & convert to a string of valid C++
data = read_bin(in_path)
header_str = bin_to_header(data, in_path.stem)
out_path = Path()
if len(sys.argv) == 3:
out_path = Path(sys.argv[2])
if not out_path.exists():
eprint("output path does not exist")
exit(1)
if not out_path.is_dir():
eprint("output path is not a directory")
exit(1)
else:
out_path = in_path.parents[0] / f"{in_path.stem}.hpp"
with open(out_path, "w") as f:
f.write(header_str)
exit(0)