유저 모드 후킹 – 코드패치, 인젝션 개념

디버깅: 우리가 진행하는 디버깅 과정도 프로세스 입장에서는 후킹이라 할 수 있다. 이는 커널 디버깅이냐 유저 모드 디버깅이냐에 따라 후킹 범위가 달라지며, 유저 모드 후킹은 디버거를 통해 프로세스를 Attach하는 행위도 후킹이라 할 수 있다. 이때 사용되는 API인 DebugActiveProcess 로써 구조체는 다음과 같다.

 

BOOL WINAPI DebugActiveProcess(

    DWORD dwProcessId

);

 

MSDN의 http://msdn.microsoft.com/en-us/library/ms679295(VS.85).aspx 에서 위 API에 대해 보다 자세한 내용을 확인할 수 있다. 여기서는 Ollydbg와 같은 유저모드 디버깅을 이미 다수 진행하였기 때문에, DebugActiveProcess를 이용한 디버깅 방법은 여기서 다시 진행하지 않는다.

 

인젝션: 가장 일반적이면서 많이 사용되는 방식으로, 후킹과 인젝션이 같은 용어로 혼용할 정도로 기능상 큰 차이가 없다. 인젝션 방식으로 Dll 인젝션과 코드 인젝션이 있으며, Dll 인젝션이 많이 사용된다. 코드 인젝션은 특별한 경우를 제외하고는 사용되지 않는다.

그럼 인젝션 방법은 어떤 것들이 있는지 알아보자.

 

Registry(AppInit_Dlls): 이 방법은 앞서 1부에서 진행하였다. 지정된 레지스트리 경로에 추가하면, 모든 프로세스를 후킹한다.

SetWindowsHookEx: 메시지 이벤트를 가로채는 방법으로 Dll을 이용하여 후킹이 가능하다

CreateRemoteThread:
해당 프로세스에 스레드를 통해 Dll을 실행하는 방법으로 코드 인젝션과 Dll 인젝션 둘 다 사용된다.

 

코드패치: 이는 말 그대로 실행 파일의 코드를 직접 생성해서 후킹하는 방식으로 많이 사용하는 방법은 아니다. 어셈블리 언어를 이용해 직접 파일에 작성하는 방식으로 정교한 코드 작업이 필요하다(코드 패치는 유저모드 후킹 끝에 다룬다).

 

유저 모드에서 후킹을 할 수 있는 대표적인 영역은 API와 이벤트 메시지(Event message)라 할 수 있을 만큼 SetWindowsHookEx와 CreateRemoteThread는 많이 사용되는 후킹 방식 중 하나이다.

Message는 키보드, 마우스와 같은 입력 이벤트, 프로그램 종료와 같은 상황에 대한 이벤트에 후킹을 걸 수 있다. 예를 들면, 키보드 키가 눌려졌을 때 처리하는 데 후킹을 삽입했다면 키가 눌려졌다는 메시지에 후킹이 걸려 해당 메시지를 가로 챌 수 있다.

또 하나 API 후킹은 이미 PE 파일 구조와 운영체제 구조 이해를 통해 진행하였으므로 3부를 확인하기 바라며 여기서는 생략한다.

우리가 제일 많이 볼 수 있는 후킹은 어떤 것들이 있을까? 아마 API 후킹일 것이다.

윈도우에서 API는 운영체제에게 서비스를 요청하는 연결 통로로, 이 통로를 후킹하는 것이 가장 이해하기 쉬우면서 제일 많이 사용되는 방식이다.

그리고 우리는 몇몇의 후킹 방법을 이전에 진행하였다(AppInit_Dlls, 디버깅 역시 후킹의 일종이다).

 

 

 

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.