본문 바로가기

스터디/파이썬 해킹 프로그래밍

Immunity 디버거를 이용한 하드 후킹

이 기술은 x86 어셈블리 코드로 작성된 후킹 코드를 사용하기 때문에 후킹 대상 프로세스에 많은 영향을 끼치지 않는다. 소프트 후킹의 경우에는 브레이크 포인트가 호출될 때 마다 프로세스가 많은 작업 (그리고 더 많은 명령들)을 처리해야 하며, 후킹 코드를 실행시킨 다음에는 자기 자신의 코드를 계속해서 실행시켜야 한다.

반면 하드 후킹의 경우 특정한 코드 조각만으로 후킹 코드를 실행시키고 기존의 프로세스 코드 흐름으로 돌아온다.

하드 후킹을 사용할 때의 장점은 소프트 후킹의 경우와는 달리 후킹 대상 프로세스가 에러로 인해 종료되는 일이 없다.


Immunity 디버거에서는 FastLogHook 이라는 객체를 통해 복잡한 하드 후킹 설정 과정을 간단히 처리 할 수 있다. FastLogHook 객체는 원하는 값을 로깅해주는 어셈블리 코드르 만들어 주고 해당 어셈블리 코드로 점프하게 후킹하고자 하는 원래의 명령을 점프 코드로 덮어 써준다. FastLogHook 객체를 이용하려면 먼저 후킹할 대상을 정의해야 하고, 그 다음에는 로깅하려는 값을 이용하려면 먼저 후킹할 대상을 정의해야 하고, 그 다음에는 로깅하려는 값을 정의해야 한다. 즉, 다음과 같은 골격으로 후킹을 설정해주면 된다.


imm = immlib.Debugger()

fast = immlib.FastLogHook(imm)


fast.logFunction(address,num_arguments)

fast.logRegister(register)

fast.logDirectMemory(address)

fast.logBaseDisplacement(register,offset)


 후킹 코드를 실행시키려면 후킹 코드로 점프하게 만들어야 한다. 그러기 위해서는 원래의 명령을 점프코드로 덮어 써야 하는데, 그 작업을 수행해주는 것이 logFunction() 함수다. logFunction() 함수에는 후킹을 수행할 주소와 관찰하려는 대상 함수의 파라미터 갯수를 파라미터로 입력한다.

함수의 시작 부분을 후킹하고 해당 함수의 파라미터를 관찰하고 싶다면 num_arguments에 해당 함수의 파라미터 갯수를 입력하고, 함수의 종료 부분을 후킹하고자 한다면 num_arguments 에 0을 입력한다. 로깅 작업을 실제로 수행하는 것은 logRegister(), logBaseDisplacement(), logDirectMemory() 함수다.

이 세 함수의 프로토 타입은 다음과 같다.

logRegister(register)

logBaseDisplacement(register,offset)

logDirectMemory(address)


 logRegister() 함수를 이용하면 후킹 함수가 호출 되었을 때 특정 레지스터의 값을 살펴볼 수 있다. 예를 들면 호출된 이후의 EAX 레지스터 값을 살펴보고자 할 때 유용하게 사용할 수 있다.

logBaseDisplacement() 함수에서는 register 와 offset 두 개의 파라미터가 사용된다. 이 함수는 스택의 파라미터 값을 참조하거나 레지스터로부터 특정 오프셋 만큼 떨어진 곳의 데이터를 살펴볼 때 사용된다. 마지막으로 logDirectMemory() 함수는 특정 메모리 주소의 데이터를 살펴볼 때 사용된다. 후킹 함수가 호출돼 로깅 함수들이 호출되면 로깅 함수는 FastLogHook 객체가 만든 메모리 영역에 로깅한 정보를 저장한다. 저장된 로깅 정보를 보려면 getAlloLog() 래퍼 함수를 이용한다. getAlloLog() 함수는 메모리의 내용을 파싱해 다음과 같은 형태의 파이썬 리스트를 반환한다.

[(hook_address,(arg1,arg2,argN)),...]


 따라서 후킹 함수가 호출될 때마다 그것의 주소가 첫 번째 엔트리인 hook_address 에 저장되고, 로깅하려는 나머지 정보들이 두 번째 엔트리에 저장된다.

 마지막으로 주목해야 할 사항으로는 FastLogHook 외에도 STDCALLFastLogHook 이 있다는 점이다. cdecl 호출 규약을 사용할 때는 FastLogHook을 사용하고, STDCALL 호출 규약을 사용할 때는 STDCALLFastLogHook을 사용하면 된다. 그리고 두 객체의 사용 방법은 동일하다.



'스터디 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글

DLL 인젝션  (0) 2015.02.16
DLL과 코드 인젝션  (0) 2015.02.16
PyDbg 를 이용한 소프트 후킹  (0) 2015.02.15
질문 정리 (2015-01-26)  (0) 2015.01.26
질문 기록  (0) 2015.01.25