import struct, sys, os from keystone import Ks, KS_ARCH_X86, KS_MODE_32 ORIG = r"F:\steam\steamapps\common\The I of the Dragon\TheIOfTheDragon.exe" OUT = r"E:\DragonHD\patch\TheIOfTheDragon_cjk.exe" TBL = r"E:\DragonHD\patch\tables" HOOK_DRAW_VA = 0x4EACB0 HOOK_MEAS_VA = 0x4E8026 BACK_DRAW_VA = 0x4EACB8 BACK_MEAS_VA = 0x4E8049 SEC_SIZE = 0x1C0000 OFF_DRAW = 0x0000 OFF_MEAS = 0x0100 OFF_GLYPH = 0x0200 OFF_METRIC = 0x100200 def align(x, a): return (x + a - 1) // a * a def load_tables(): g = open(os.path.join(TBL, "cjk_glyph.bin"), "rb").read() m = open(os.path.join(TBL, "cjk_metric.bin"), "rb").read() assert len(g) == 65536 * 16, len(g) assert len(m) == 65536 * 8, len(m) return g, m def main(): data = bytearray(open(ORIG, "rb").read()) e_lfanew = struct.unpack_from(" secs[0][2]: print("no room for section header", file=sys.stderr) sys.exit(3) # add section header hdr = so + nsec * 40 struct.pack_into("<8sIIII", data, hdr, b".cjk".ljust(8, b"\x00"), SEC_SIZE, new_va, align(SEC_SIZE, file_align), new_raw) struct.pack_into(" 0x%x" % (va, target)) hook(HOOK_DRAW_VA, draw_va) hook(HOOK_MEAS_VA, meas_va) os.makedirs(os.path.dirname(OUT), exist_ok=True) open(OUT, "wb").write(data) print("wrote", OUT, len(data), "bytes") if __name__ == "__main__": main()