Python3でリバースエンジニアリング その4

今回は3.2章。

32bitならraw_input()やprint文を変更するだけで大丈夫です。64bitの場合、スレッドIDは取得できるのですが、レジスタの値が取得できないので変更する必要があります。

 

それっぽい値は出力できるけど間違っていると思います。参考までに。

my_debugger.py

  1. ...
  2.     def get_thread_context(self, thread_id=None, h_thread=None):
  3.         ...
  4.         if kernel32.GetThreadContext(h_thread, byref(context)):
  5.             kernel32.CloseHandle(h_thread)
  6.             kernel32.RtlCaptureContext(byref(context))
  7.             return context

 64bitではRtlCaptureContext関数を使うと簡単にレジスタの値が取得できるらしい。

 

 

my_debugger_defines.py

  1. ...
  2. DWORD     = c_ulong
  3. DWORD64   = c_ulonglong
  4. ...
  5. class CONTEXT(Structure):
  6.     _fields_ = [
  7.  
  8.         ("ContextFlags", DWORD),
  9.         ("Dr0", DWORD),
  10.         ("Dr1", DWORD),
  11.         ("Dr2", DWORD),
  12.         ("Dr3", DWORD),
  13.         ("Dr6", DWORD),
  14.         ("Dr7", DWORD),
  15.         ("FloatSave", FLOATING_SAVE_AREA),
  16.         ("SegGs", DWORD),
  17.         ("SegFs", DWORD),
  18.         ("SegEs", DWORD),
  19.         ("SegDs", DWORD),
  20.         ("Rdi", DWORD64),
  21.         ("Rsi", DWORD64),
  22.         ("Rbx", DWORD64),
  23.         ("Rdx", DWORD64),
  24.         ("Rcx", DWORD64),
  25.         ("Rax", DWORD64),
  26.         ("Rbp", DWORD64),
  27.         ("Rip", DWORD64),
  28.         ("SegCs", DWORD),
  29.         ("EFlags", DWORD),
  30.         ("Rsp", DWORD64),
  31.         ("SegSs", DWORD),
  32.         ("ExtendedRegisters", BYTE * 512),
  33. ]

winnt.hを参考にしながらレジスタの型を変更

 

 

my_test.py

  1. ...
  2.     print("[*] Dumping registers for thread ID: 0x{0:08x}".format(thread))
  3.     print("[**] RIP: 0x{0:016x}".format(thread_context.Rip))
  4.     print("[**] RSP: 0x{0:016x}".format(thread_context.Rsp))
  5.     print("[**] RBP: 0x{0:016x}".format(thread_context.Rbp))
  6.     print("[**] RAX: 0x{0:016x}".format(thread_context.Rax))
  7.     print("[**] RBX: 0x{0:016x}".format(thread_context.Rbx))
  8.     print("[**] RCX: 0x{0:016x}".format(thread_context.Rcx))
  9.     print("[**] RDX: 0x{0:016x}".format(thread_context.Rdx))
  10.     print("[*] END DUMP")

 レジスタの名前を変更。

 

 

検索してもよくわからなかったのでそのまま次へ進みます。