본문 바로가기

스터디

(58)
Hardware Breakpoint 까지 이론, 함수 정리 하드웨어 브레이크 포인트는 CPU 디버그 레지스터의 특정 비트 값을 이용한다.하드웨어 브레이크 포인트를 구현 할 때 가장 중요한 점은네 개의 디버그 레지스터 중에서 어느 레지스터가 사용중이고 어느 레지스터가 사용 가능한 상태인지 항상 알고 있어야 한다는 것이다.--> 항상 사용 가능한 디버그 레지스터를 이용해 하드웨어 브레이크 포인트를 설정하는지 확인 해야 함--> 사용 중인 레지스터를 사용할 경우 디버거가 엉킬 수 있음 1. 프로세스 내의 모든 쓰레드 리스트를 구한다.2. 각 쓰레드의 CPU 컨텍스트 레코드를 구한다.3. 구한 쓰레드의 모든 context 레코드의 디버그 레지스터 중 하나 (DR0 ~ DR3 중 사용 가능한 디버그 레지스터) 에 원하는 브레이크 포인트 주소 설정4. DR7 레지스터의 비..
Soft Breakpoint 까지의 이론 정리 소프트 브레이크 포인트를 설정하려면 프로세스의 메모리를 읽고 쓸 수 있어야 하는데, 이를 위해 ReadProcessMemory() 함수와 WriteProcessMemory() 함수를 이용한다.아래는 두 함수의 프로토 타입이다. BOOL WINAPI ReadProcessMemory( HANDLE hProcess , LPCVOID lpBaseAddress, LPVOID lpBuffer‘, SIZE_T nSize, SIZE_T* lpNumber‘OfBytesRead ); BOOL WINAPI riteProcessMemory( HANDLE hProcess , LPCVOID lpBaseAddress , LPCVOID lpBuffer, SIZE_T nSize, SIZE_T* lpNumber OfBytes itten..
Memory Breakpoint 까지의 소스 파이썬 해킹 프로그래밍 3장 최종 소스.참 여러 삽질 끝에 도달했다. my_debugger.py # -*- coding: cp949 -*- from ctypes import * from my_debugger_defines import * kernel32 = windll.kernel32 class debugger(): def __init__(self): self.h_process = None self.pid = None self.debugger_active = False self.h_thread = None self.context = None self.exception = None self.exception_address = None self.breakpoints = {} self.first_breakpo..
Hardware Breakpoint 까지 소스 이 이외의 소스는 변경되지 않았기에, 업로드 하지 않았다. (my_debugger_defines.py , printf_loop 등) my_debugger.py # -*- coding: cp949 -*- from ctypes import * from my_debugger_defines import * kernel32 = windll.kernel32 class debugger(): def __init__(self): self.h_process = None self.pid = None self.debugger_active = False self.h_thread = None self.context = None self.exception = None self.exception_address = None self...
Soft Breakpoint 까지의 소스들 my_debugger.py # -*- coding: cp949 -*- from ctypes import * from my_debugger_defines import * kernel32 = windll.kernel32 class debugger(): def __init__(self): self.h_process = None self.pid = None self.debugger_active = False self.h_thread = None self.context = None self.exception = None self.exception_address = None self.breakpoints = {} self.first_breakpoint = True # Here let's determine and s..
파이썬 해킹 프로그래밍 서적 오류 수정 다음은 Fandu 형이 정리하신"파이썬 해킹 프로그래밍" 서적에 대한 오류 정리 글을 퍼온 것이다.출처 : http://fandu.tistory.com/entry/Gray-Hat-Python%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%95%B4%ED%82%B9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%B1%85%EC%97%90-%EC%9E%88%EB%8A%94-%EC%98%A4%EB%A5%98-%EB%B0%8F-%ED%95%B4%EA%B2%B0%EB%B2%95%EB%B2%95-%EC%A0%95%EB%A6%AC 절대 내가 쓴것이 아님을 다시 한번 밝힌다. 출처출처출처출처출처출처출처출처출처출처출처출처 Grat Hat Python을 공부해 보신 분이..
디버거 이벤트 헨들러 구현 출처! 저번에는 디버거에 PID를 이용해 프로세스를 attach 까지 했다. 이번에는 디버거 핸들러 구현을 할것이다.이벤트가 발생했을 때 디버거가 그 이벤트에 반응하려면, 각 디버깅 이벤트에 대한 핸들러가 있어야 한다.--> WaitForDebugEvent() 함수를 이용하는데, 이 함수는 이벤트가 발생할 때마다 DEBUG_EVENT 구조체를 반환한다. DEBUG_EVENT 구조체의 구조는 typedef struct _DEBUG_EVENT { DWORD dwDebugEventCode; DWORD dwProcessId; DWORD dwThreadId; union { EXCEPTION_DEBUG_INFO Exception; CREATE_THREAD_DEBUG_INFO CreateThread; CREATE_P..
디버거와 프로세스를 연결하는 방법, CPU 레지스터 값을 출력하는 방법 지식출처: http://scytalezz.tistory.com/21 BOOL CreateProcess { } 프로세스를 디버깅 하려면 일단 디버거와 프로세스를 연결해야 한다.그래서 디버거에서 직접 프로세스를 실행시키거나, 이미 실행한 프로세스의 PID를 이용해 붙여야 한다. 프로세스를 실행시키는 경우, 프로세스의 코드가 실행되기 전 디버거가 제어를 할 수 있다는 장점이 있다.윈도우에서 프로세스를 실행시킬 때 CreateProcess() 함수를 호출한다. BOOL CreateProcess( LPCWSTR pszImageName, // 실행시킬 실행 바이너리 경로 LPCWSTR pszCmdLine, // 커맨드라인 인자 전달 LPSECURITY_ATTRIBUTES psaProcess, LPSECURITY_A..