[2주] 03장 - 윈도우 디버거 개발 (1)
프로세스를 디버깅하려면 해당 프로세스를 연결해야하는데, 두가지 방법이 있다.
첫번째는 디버거가 직접 바이너리를 실행시키는 것이다. 이 경우에는 해당 프로세스의 코드가 실행되기 전에 제어 할 수 있다는 장점이 있으므로 악성코드나 기타 다른 형태의 악의적인 코드를 분석할 때 편리하다.
두번째 방법은 디버거를 이미 실행중인 프로세스에 attach(붙이는) 하는 방법이다. 이는 프로세스가 시작되면서 실행되는 코드를 건너뛸 수 있으며 특정 영역의 코드만을 분석할 수 있다.
윈도우에서는 이 두가지 작업을 쉽게 수행할 수 있게 하는 디버깅 api를 제공한다.
* 구동환경은 윈도우7 32bitCreateProcessA함수로 계산기(calc.exe)를 열어보자
#my_debugger_defines.py
#-*- coding: utf-8 -*-
from ctypes import *
# ctypes 형태의 타입을 마이크로소프트의 타입으로 매핑
WORD = c_ushort
DWORD = c_ulong
LPBYTE = POINTER(c_ubyte)
LPTSTR = POINTER(c_char)
HANDLE = c_void_p
#상수
DEBUG_PROCESS = 0x00000001
CREATE_NEW_CONSOLE = 0x00000010
#CreateProcesssA() 함수를 위한 구조체
class STARTUPINFO(Structure):
_fields_= [
("cb", DWORD),
("lpReserved", LPTSTR),
("lpDesktop", LPTSTR),
("lpTitle", LPTSTR),
("dwX", DWORD),
("dwY", DWORD),
("dwXSize", DWORD),
("dwYSize", DWORD),
("dwXCountChars", DWORD),
("dwYCountChars", DWORD),
("dwFillAttribute", DWORD),
("dwFlags", DWORD),
("wShowWindow", WORD),
("cbReserved2", WORD),
("lpReserved2", LPBYTE),
("hStdInput", HANDLE),
("hStdOutput", HANDLE),
("hStdError", HANDLE),
]
class PROCESS_INFORMATION(Structure):
_fields_ = [
("hProcess", HANDLE),
("hThrea", HANDLE),
("dwProcessId", DWORD),
("dwThreadId", DWORD),
]
구조체,유니온,상수를 미리 정의해놓는다.
#my_debugger.py #-*- coding: utf-8 -*- from ctypes import * from my_debugger_defines import * kernel32 = windll.kernel32 class debugger(): def __init__(self): pass def load(self,path_to_exe): #dwCreation 플래그를 이용해 프로세스를 어떻게 생성할 것인지 판단. creation_flags = DEBUG_PROCESS #구조체 인스턴트화 startupinfo = STARTUPINFO() process_information = PROCESS_INFORMATION() #프로세스가 독립적인 창으로 실행되게 해줌 #STARTUPINFO struct구조체의 내용에 따라 디버기프로세스에 어떤영향을 미치는지 보여줌 startupinfo.dwFlags = 0x1 startupinfo.wShowWindow = 0x0 #STARTUPINFO struct 구조체 자신의 크기를 나타내는 cb 변수값을 초기화 startupinfo.cb = sizeof(startupinfo) if kernel32.CreateProcessA(path_to_exe, None, None, None, None, creation_flags, None, None, byref(startupinfo), byref(process_information)): print "[*] We have successfully launched the process!" print "[*] PID : %d" % process_information.dwProcessId else: print "[*] Error : 0x%08x." % kernel32.GetLastError()
#my_test.py
import my_debugger
debugger = my_debugger.debugger()
debugger.load("C:\\Windows\\System32\\calc.exe")
raw_input("")
세 파일을 같은 디렉토리에 두고 my_test.py를 실행하면 'Study > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
| [2주] 03장 - 윈도우 디버거 개발 (3) (0) | 2015.01.19 |
|---|---|
| [2주] 03장 - 윈도우 디버거 개발 (2) (0) | 2015.01.18 |
| api 기초 (0) | 2015.01.12 |
| [1주] 02장-디버거 (0) | 2015.01.12 |
| [1주] 01장 - 개발환경 구축 (0) | 2015.01.12 |