import ctypes
import struct

PROCESS_ALL_ACCESS = 0x1F0FFF
kernel32 = ctypes.windll.kernel32
h_proc = kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, 43084)

def rpm(addr, size):
    buf = ctypes.create_string_buffer(size)
    bytes_read = ctypes.c_size_t(0)
    if kernel32.ReadProcessMemory(h_proc, ctypes.c_void_p(addr), buf, size, ctypes.byref(bytes_read)):
        return buf.raw
    return None

mod_base = 0x7FF6AFC20000

# Search in .data and .rdata for 0x7ff6b2da9200 and 0x7ff6b2da9768 and 0x7ff6b2d88e10
targets = [
    0x7ff6b2da9200, # Minimap_Visibility
    0x7ff6b2da9768, # Minimap Walkability
    0x7ff6b2d88e10, # MinimapTilesRender
    0x7ff6b2dad670  # FogOfWar
]

# Read .data: from mod_base + 0x3A04000, size 0xD16000
data_start = mod_base + 0x3A04000
data_size = 0xD16000

print("Reading .data...")
d = rpm(data_start, data_size)
if d:
    for t in targets:
        pat = struct.pack("<Q", t)
        idx = 0
        while True:
            pos = d.find(pat, idx)
            if pos == -1:
                break
            addr = data_start + pos
            print(f"Target {hex(t)} found in .data at {hex(addr)} (RVA: +{hex(addr - mod_base)})")
            # Print 64 bytes around it
            win = rpm(addr - 16, 64)
            print("   Hex:", win.hex() if win else "none")
            idx = pos + 1

# Also check in .rdata: mod_base + 0x2E87000, size 0xB7C000
rdata_start = mod_base + 0x2E87000
rdata_size = 0xB7C000
print("Reading .rdata...")
rd = rpm(rdata_start, rdata_size)
if rd:
    for t in targets:
        pat = struct.pack("<Q", t)
        idx = 0
        while True:
            pos = rd.find(pat, idx)
            if pos == -1:
                break
            addr = rdata_start + pos
            print(f"Target {hex(t)} found in .rdata at {hex(addr)} (RVA: +{hex(addr - mod_base)})")
            win = rpm(addr - 16, 64)
            print("   Hex:", win.hex() if win else "none")
            idx = pos + 1

kernel32.CloseHandle(h_proc)
