반응형

 

참조 : http://riguo.hateblo.jp/entry/2012/04/22/113400

 

python 디버기를 만드는 과정에서 발생하는 32bit와 64bit의 차이를 알지 못하면

엄청 짜증이 난다.

책이 나올때는 32bit 환경에서 만들어졌기 때문에 64bit의 환경에서의 내용이 나오지 않는다.

따라서, 관련 내용을 정리하여 올린다.

 

32bit Context Defines 

64bit Context Defines

DWORD     = c_ulong

 

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),

# 32bit Register
        ("Edi", DWORD),
        ("Esi", DWORD),
        ("Ebx", DWORD),
        ("Edx", DWORD),
        ("Ecx", DWORD),
        ("Eax", DWORD),
        ("Ebp", DWORD),
        ("Eip", DWORD),
        ("Esp", DWORD),
       
        ("SegCs", DWORD),
        ("EFlags", DWORD),
        ("SegSs", DWORD),
        ("ExtendedRegisters", BYTE * 512),
]

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),

# 64bit Register
        ("Rdi", DWORD64),
        ("Rsi", DWORD64),
        ("Rbx", DWORD64),
        ("Rdx", DWORD64),
        ("Rcx", DWORD64),
        ("Rax", DWORD64),
        ("Rbp", DWORD64),
        ("Rip", DWORD64),
        ("Rsp", DWORD64),
       
        ("SegCs", DWORD),
        ("EFlags", DWORD),
        ("SegSs", DWORD),
        ("ExtendedRegisters", BYTE * 512),
]

 

참고해서 쓰기 바란다.

 

ps : 출력 형태는 다음과 같다.

 

32bit print format 

64bit print format

 

    print ("[*] Dumping registers for Thread ID: 0x%08x" % thread)
    print ("[*] RIP : 0x{0:016x}" .format(thread_context.Rip))
    print ("[*] RSP : 0x{0:016x}" .format(thread_context.Rsp))
    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 ("[*] RDX : 0x{0:016x}" .format(thread_context.Rdx))
    print ("[*] End DUMP")

 

    print ("[*] Dumping registers for Thread ID: 0x%08x" % thread)
    print ("[*] RIP : 0x{0:016x}" .format(thread_context.Rip))
    print ("[*] RSP : 0x{0:016x}" .format(thread_context.Rsp))
    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 ("[*] RDX : 0x{0:016x}" .format(thread_context.Rdx))
    print ("[*] End DUMP")

 

반응형
반응형

 

파이썬 해킹 프로그래밍으로 현재 디버기를 만들고 있는 상황인데

Context 값을 얻어오지 못하는 현상이 발생했다.

과연 무엇 때문에 그럴까????

 

>>>>> 현재 내 환경은 Windows7 64bit 이다.

 

Enter The PID of the process to attach to : 3692
[*] Select PID 3692
[*] OpenProcess Handle : 124
[*] self.h_process : 124
[*] Enumerate Thread inside
[*] Dumping registers for Thread ID: 0x00001928
[*] EIP : 0x00000000
[*] ESP : 0x00000000
[*] EBP : 0x00000000
[*] EAX : 0x00000000
[*] EBX : 0x00000000
[*] ECX : 0x00000000
[*] EDX : 0x00000000
[*] End DUMP

이유는 64bit에서는 32bit 레지스터를 사용하지 않는다.

따라서, RIP, RSP, RBP 등등 확장된 레지스터를 사용하기 때문에 담는 그릇도 틀리다.

32bit에서 실행할 경우 아래와 같이 출력이 가능하다.

 

 

32bit 

 64bit

Enter The PID of the process to attach to : 3364
[*] Select PID 3364
[*] OpenProcess Handle : 1900
[*] self.h_process : 1900
[*] Enumerate Thread inside
[*] Dumping registers for Thread ID: 0x00000d1c
[*] EIP : 0x7c93e514
[*] ESP : 0x0007fde0
[*] EBP : 0x0007fdfc
[*] EAX : 0x00b50088
[*] EBX : 0x00000000
[*] ECX : 0x00001f40
[*] EDX : 0x000adea8
[*] End DUMP
[*] Dumping registers for Thread ID: 0x000001d0
[*] EIP : 0x7c9820ec
[*] ESP : 0x00acfff8
[*] EBP : 0x00000000
[*] EAX : 0x00000000
[*] EBX : 0x00000001
[*] ECX : 0x00000002
[*] EDX : 0x00000003
[*] End DUMP
[*] finished debugging. Exiting...

[*] self.h_process : 124
[*] Enumerate Thread inside
[*] Get Thread Context inside
[##] Thread Handle : 0xac
[*] Dumping registers for Thread ID: 0x00001dc0
[*] RIP : 0x0000000002535318
[*] RSP : 0x000000000021f690
[*] RBP : 0x000000000021f470
[*] RAX : 0x000000000021f6a0
[*] RBX : 0x0000000000001100
[*] RCX : 0x000000000258c0b8
[*] RDX : 0x000000000021f470
[*] End DUMP
[*] Get Thread Context inside
[##] Thread Handle : 0xac
[*] Dumping registers for Thread ID: 0x000003c0
[*] RIP : 0x0000000002535318
[*] RSP : 0x000000000021f690
[*] RBP : 0x000000000021f470
[*] RAX : 0x000000000021f6a0
[*] RBX : 0x0000000000001100
[*] RCX : 0x00000000738e692d
[*] RDX : 0x000000000021f470
[*] End DUMP

 

이런 어처구니 없는 삽질을 할 줄이야...ㅡ.ㅡ;;;

다른 사람은 이런 일이 없길....

 

반응형

'프로그래밍 > Python' 카테고리의 다른 글

Windows 7에서 GetModuleHandle 사용하기  (0) 2013.07.12
64bit debugger 만들기  (0) 2013.07.02
python thread context 보기(win7 64bit)  (2) 2013.07.02
Context 32bit / 64bit 선언  (0) 2013.06.29
GetLastError() - 0x00000032  (0) 2013.06.27

+ Recent posts