import gdb gr = gdb.execute inf = gdb.selected_inferior() pid = inf.pid base = None for line in open("/proc/%d/maps" % pid): parts = line.split() try: lo, hi = [int(x,16) for x in parts[0].split('-')] except Exception: continue if base is None and "libnvidia-eglcore" in line and int(parts[2],16) == 0: base = lo print("BASE 0x%x" % (base or 0)) class B(gdb.Breakpoint): def __init__(self): super().__init__("*0x%x" % (base + 0xB33D30), internal=False) self.silent = True; self.done = False def stop(self): if self.done: return True self.done = True try: obj = int(gdb.parse_and_eval("$rdi")) n = int(gdb.parse_and_eval("$rsi")) print("RETRYFN obj=0x%x n=0x%x" % (obj, n)) cnt = int(gdb.parse_and_eval("*(unsigned int*)0x%x" % (obj + 0x22efc))) print("CNT %d" % cnt) wrote = 0 for i in range(0, min(cnt, 32)): p = int(gdb.parse_and_eval("*(unsigned long*)0x%x" % (obj + 0x1428 + i*8))) if not p: continue tgt = p + n * 0x10 try: v16 = int(gdb.parse_and_eval("*(unsigned short*)0x%x" % (tgt + 0xe))) v0 = int(gdb.parse_and_eval("*(unsigned int*)0x%x" % tgt)) print("E%d ptr=0x%x tgt=0x%x w0=0x%x w16e=0x%x" % (i, p, tgt, v0, v16)) if v16 == 0xffff: gr("set {unsigned short}0x%x = 0" % (tgt + 0xe)) gr("set {unsigned int}0x%x = 0" % tgt) gr("set {unsigned short}0x%x = 0" % (tgt + 0xc)) wrote += 1 except Exception as e: print("E%d fail %s" % (i, e)) print("CLEARED %d" % wrote) gr("detach") except Exception as e: print("fail %s" % e) return True try: B() print("BP-SET") gr("continue") except Exception as e: print("bpfail %s" % e) print("T92-DONE")