pal-gdb.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/usr/bin/env python3
  2. # pylint: disable=invalid-name
  3. import gdb # pylint: disable=import-error
  4. # pylint: enable=invalid-name
  5. # pylint: disable=no-self-use,too-few-public-methods
  6. class LoadCommandBreakpoint(gdb.Breakpoint):
  7. def __init__(self):
  8. gdb.Breakpoint.__init__(self, spec="load_gdb_command", internal=1)
  9. def stop(self):
  10. command = gdb.parse_and_eval("(const char *) $rdi").string()
  11. gdb.execute(command)
  12. return False
  13. def signal_handler(event):
  14. if isinstance(event, gdb.SignalEvent):
  15. if event.stop_signal == 'SIGILL':
  16. # handle CPUINFO and RDTSC
  17. inst = gdb.parse_and_eval("*(const unsigned short *) $rip")
  18. if inst == 0xa20f:
  19. print("CPUID bypassed. Ignore this exception.")
  20. gdb.execute("continue")
  21. return
  22. if inst == 0x310f:
  23. print("RDTSC bypassed. Ignore this exception.")
  24. gdb.execute("continue")
  25. return
  26. if __name__ == "__main__":
  27. gdb.execute("set env IN_GDB = 1")
  28. gdb.execute("set env LD_PRELOAD = ")
  29. gdb.execute("handle SIGCONT pass noprint nostop")
  30. gdb.execute("handle SIGKILL pass print stop")
  31. gdb.execute("set disable-randomization off")
  32. gdb.execute("set detach-on-fork off")
  33. gdb.execute("set schedule-multiple on")
  34. gdb.execute("set follow-exec-mode same")
  35. gdb.execute("set follow-fork-mode child")
  36. # Need to disable displaced stepping
  37. gdb.execute("set displaced-stepping off")
  38. LoadCommandBreakpoint()
  39. gdb.events.stop.connect(signal_handler)