후킹 Hooking

후킹에 대해 어느 정도 진행해야 할까 고민이 많이 되었다. 후킹은 영어로 “걸다”라는 의미로, 우리가 익히 알고 있듯이 “가로 채기”와 같다. 즉 중간에 끼어들어 정보를 훔쳐보거나, 가로 채는 MITM(Man in the Middle) 방식으로 원제공자와 처리자 사이에서 지나가는 정보를 보고 이를 조작하는 공격과 유사하다고 할 수 있다.

후킹은 무엇인가를 노리는 낚시와 같이 가장 대표적인 방식으로 특정 프로그램과 운영체제의 호출 함수/메시지 사이에 끼어서 호출을 할 때 이를 엿보는 것이다. 우리는 3부의 프로그램 역분석에서 프로그램이 동작할 때 사전에 정의된 API 혹은 프로그램 내부의 함수를 이용해 프로그램을 호출(Call)한다는 것을 알고 있다. 후킹은 이러한 API 혹은 내부 함수를 낚시하듯이 걸어 놓고 그 걸어 놓은 함수 및 API를 이용하는 인자들을 조작하는 것이라 할 수 있다. 그림으로 표현하면 아래 그림과 같다.

후킹 Hooking

[그림] 정상적인 호출을 중간에서 대신 받아 처리한다

위 그림과 HkOpenFile라는 후킹 함수를 만들어 NtOpenFile을 호출할 때 2번의 처리 요청을 다르게 하거나 4번 전달 시 다른 결과값을 보여준다거나 처리 결과를 호출자가 아닌 제삼자에게도 전달할 수 있다. 이것은 후킹의 한 예로 이렇게 대신 받은 호출을 통해 해당 호출을 무시할 수도 있고, 운영체제에 다른 값으로 처리를 변경할 수도 있으며 처리 결과를 다르게 변경할 수도 있다. 그럼 윈도우에서는 어디에서 후킹이 이루어질 수 있는지 확인해 보자.


[그림] 운영체제에서 후킹이 가능한 지점

위 그림은 윈도우 운영체제에서 후킹을 진행할 수 있는 각 지점들에 대해 나타낸 것이다. 그렇다면 이 지점들의 후킹 방법에 대해 알아보자. 먼저 유저 모드의 후킹 기술로는 디버깅과 인젝션, 그리고 코드 패치 방법이 있는데 그 중 디버깅과 인젝션에 대해 얘기하도록 하겠다. 참고로 디버깅은 모든 영역에서 사용 가능한 방법이다.

Facebook Comments

Leave A Reply

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