Immunity 디버거는 FastLogHook 이라는 객체를 통해 복잡한 하드 후킹 설정 과정을 간단히 처리할 수 있다.
FastLogHook 객체는 원하는 값을 로깅 해주는 어셈블리 코드를 만들어 주고 해당 어셈블리 코드로 점프하게 후킹하고자 하는 원래의 명령을 점프 코드로 덮어써준다.
후킹 코드를 실행시키려면 후킹 코드로 점프하게 만들어야 한다.
그러기 위해 원래의 명령을 점프 코드로 덮어야 하는데,
그 작업을 logFunction() 함수가 수행해준다.
함수의 시작부분을 후킹하고 해당 함수의 파라미터를 관찰하고 싶다면 num_arguments에 해당 함수의 파라미터 개수를 입력하고,
함수의 종료 부분을 후킹하고자 한다면
logRegister(), logBaseDisplacement(), logDirectMemory() 함수다.
세 함수의 프로토 타입
logRegister() 함수를 이용하면 후킹 함수가 호출됐을 때 특정 레지스터의 값을 살펴 볼 수 있다.
logBaseDispalcement() 함수는 register와 offset 두 개의 파라미터가 사용된다.
logDirectMemory() 함수는 특정 메모리 주소의 데이터를 살펴볼 때 사용된다.
후킹 함수가 호출돼 로깅 함수들이 호출되면 로깅 함수는 FastLogHook 객체가 만든 메모리 영역에 로깅한 정보를 저장한다.
저장된 로깅 정보를 보려면 getAlloLog() 래퍼 함수를 이용한다.
getAlloLog() 함수는 메모리 내용을 파싱해 다음과 같은 형태의 파이썬 리스트를 반환한다.
마지막으로 주목해야 할 점은 FastLogHook 외에도 STDCALLFastLogHook 이 있다는 점이ㅏㄷ.
cdecl 호출 규약을 사용할 때는 FastLogHook 을 사용하고 STDCALL 호출 규약을 사용할 때는 STDCALLFastLogHook 을 사용하면 된다.
사용 방법은 동일하다.
하드 후킹의 예로는 hipple이 있다.
RtlAllocateHeap 함수와 RtlFreeHeap 함수의 프로토 타입을 보자.
hipple_easy.py 파일을 작성하자
------------------------------------------------------------------
import immlib
import immutils
def getRet(imm, allocaddr, max_opcodes=300):
addr = allocaddr
for a in rage(0, max_opcodes):
op = imm.disasmForward(addr)
if op.isRet():
if op.getImmConst() == 0xc:
op = imm.disasmBackward(addr, 3)
return op.getAddress()
addr = op.getAddress()
return 0x0
def showresult(imm, a, rtlallocate):
if a[0] == rtlallocate:
imm.Log("RtlAllocateHeap(0x%08x,0x%08x,0x%08x)<- 0x%08x %s" %(a[1][0],
a[1][1],
a[1][2],
a[1][3],
extra),
address = a[1][3])
return "done"
else :
imm.Log("RtlFreeHeap(0x%08x,0x%08x,0x%08x)" % (a[1][0],
a[1][1],
a[1][2]))
def main(args):
imm = immlib.Debugger()
Name = "hipple"
fast = imm.getKnowledge(Name)
if fast :
hook_list = fast.getAllLog()
rtlallocate, rtlfree = imm.getKnowledge("FuncNames")
for a in hook_list:
ret = showresult(imm, a, rtlallocate)
return "Logged : %d hook hits" % len(hook_list)
imm.Pause()
rtlfree = imm.getAddress("ntdll.RtlFreeHeap")
rtlallocate = imm.getAddress("ntdll.RtlallocateHeap")
module = imm.getModule("ntdll.dll")
if not module.isAnalysed():
imm.analyseCode(module.getCodebase())
rtlallocate = getRet(imm, rtlallocate, 1000)
imm.log("RtlallocaeHeap hook : 0x%08x" % rtlallocate)
imm.addKnowledge("FuncNames", (rtlallocate, rtlfree))
fast = immlib.STDCALLFastLogHook(imm)
imm.Log("logging on alloc 0x%08x" % rtlallocate)
fast.logFunction(rtlallocate)
fast.logBaseDisplacement("EBP", 8)
fast.logBaseDisplacement("EBP", 0xC)
fast.logBaseDisplacement("EBP", 0x10)
fast.logRegister("EAX")
imm.Log("logging n RtlFreeHeap 0x%08x" % rtlfree)
fast.logFunction(rtlfree,3)
fast.Hook()
imm.addKnowledge(Name, fast, force_add = 1)
return "hooks set, press F9 to continue the process"
------------------------------------------------------------------
'파이썬 스터디 과제 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
7장-DLL과 코드 인젝션-1 (원격 스레드 생성) (0) | 2015.01.29 |
---|---|
7장-DLL과 코드 인젝션 (0) | 2015.01.29 |
6장-후킹-1(PyDbg를 이용한 소프트 후킹) (0) | 2015.01.26 |
6장-후킹 (0) | 2015.01.26 |
5장-4 악성 코드의 안티 디버깅 루틴 무력화-2(반복적인 프로세스 탐지 기법 우회) (0) | 2015.01.26 |
댓글