Python3でリバースエンジニアリング その4
今回は3.2章。
32bitならraw_input()やprint文を変更するだけで大丈夫です。64bitの場合、スレッドIDは取得できるのですが、レジスタの値が取得できないので変更する必要があります。
それっぽい値は出力できるけど間違っていると思います。参考までに。
my_debugger.py
-
...
-
def get_thread_context(self, thread_id=None, h_thread=None):
-
...
-
if kernel32.GetThreadContext(h_thread, byref(context)):
-
kernel32.CloseHandle(h_thread)
-
kernel32.RtlCaptureContext(byref(context))
-
return context
64bitではRtlCaptureContext関数を使うと簡単にレジスタの値が取得できるらしい。
my_debugger_defines.py
-
...
-
DWORD = c_ulong
-
DWORD64 = c_ulonglong
-
...
-
class CONTEXT(Structure):
-
_fields_ = [
-
-
("ContextFlags", DWORD),
-
("Dr0", DWORD),
-
("Dr1", DWORD),
-
("Dr2", DWORD),
-
("Dr3", DWORD),
-
("Dr6", DWORD),
-
("Dr7", DWORD),
-
("FloatSave", FLOATING_SAVE_AREA),
-
("SegGs", DWORD),
-
("SegFs", DWORD),
-
("SegEs", DWORD),
-
("SegDs", DWORD),
-
("Rdi", DWORD64),
-
("Rsi", DWORD64),
-
("Rbx", DWORD64),
-
("Rcx", DWORD64),
-
("Rax", DWORD64),
-
("Rbp", DWORD64),
-
("Rip", DWORD64),
-
("SegCs", DWORD),
-
("EFlags", DWORD),
-
("SegSs", DWORD),
-
("ExtendedRegisters", BYTE * 512),
-
]
winnt.hを参考にしながらレジスタの型を変更
my_test.py
-
...
-
print("[*] Dumping registers for thread ID: 0x{0:08x}".format(thread))
-
print("[**] RIP: 0x{0:016x}".format(thread_context.Rip))
-
print("[**] RBP: 0x{0:016x}".format(thread_context.Rbp))
-
print("[**] RAX: 0x{0:016x}".format(thread_context.Rax))
-
print("[**] RBX: 0x{0:016x}".format(thread_context.Rbx))
-
print("[**] RCX: 0x{0:016x}".format(thread_context.Rcx))
-
print("[*] END DUMP")
レジスタの名前を変更。
検索してもよくわからなかったのでそのまま次へ進みます。