유저 레벨에서 API Hook (windows,2000, 2003, Vista)
이 문서에는 유저 레벨 즉, Ring 3권한에서 API Hook를 하는 방법에 대해서 설명합니다.
( Ring 0권한에서 API Hook를 하는 방법에 대해서는 다음 문서에서 설명하겠습니다.
혹시나 CPU에서 제공하는 Ring에 대해서 모르신다면 관련 문서를 먼저 읽어보기를 권합니다. )
API Hook과 관련하여 인터넷에서 자료들이 많이 있는 것이 사실이지만 설명이 너무 어렵거나
관련 소스가 있어도 너무 불안정하게 돌아가는 경우가 많습니다. 따라서 간단한 API Hook를 구현해보고
실제로 사용할 수 있는 Hook 코드에 대해서 설명하려고 합니다.
API Hook이란, Win32 애플리케이션에서 사용하는 API를 내가 만든 프로그램에서 가로챈 후
가로챈 데이터의 내용을 보거나 또는 그 API를 호출하지 못 하도록 하는 것을 말합니다.
API Hook을 하는 방법에는 다음과 크게 다음과 같이 두 가지 방법이 있습니다.
1. IAT( 임포트 어드레스 테이블 )
애플리케이션에서 Win32 API를 호출하기 위해서는 API가 실제로 어느 위치에 해당하는지 알아야 합니다.
이러한 API주소들은 IAT라는 곳에 저장되게 되고 이 테이블의 값을 통해서 애플리케이션에서는 API를 호출 할 수 있게 됩니다.
이 때 이 테이블의 값을 수정해서 내가 원하는 주소로 점프하도록 하여 API함수를 가로챌 수 있습니다.
이 방법은 API Hook중에서 가장 쉬운 방법이나 IAT를 참조하지 않고 API를 호출하는 애플리케이션이 있기 때문에
실제로 사용하는건 불가능합니다. 대표적으로 델파이로 만들어진 프로그램은 IAT를 사용하지 않고 자체적으로
테이블을 갖고 있고 그러한 테이블을 사용하기 때문에 델파이로 만들어진 애플리케이션은 훅이 불가능하게 됩니다.
2. Trampoline Hook ( 트램폴라인 훅 )
Trampoline Hook은 API 코드 자체를 변경하는 것을 의미합니다.
코드 자체를 변경한다고 해서 많은 변경이 일어나는 것은 아니고 이전 문서에서 크랙미를 크랙했던 것과 비슷하게
함수에 시작 코드앞에 5byte Jmp기계어 코드를 삽입하여 내가 만든 함수로 점프하도록 하는 것 입니다.
이 방식은 매우 강력하며 하이퍼 스냅이나 스네그잇 같은 경우에는 TextOut계열의 API를 Hook하여 텍스트 캡쳐
기능을 개발 할 수 있고, BitBlt를 Hook하여 화면 캡쳐 방지 모듈을 개발 할 수도 있습니다.
즉, 상용 애플리케이션도 간혹 쓰이며 우리가 사용할 방법은 이 방식을 이용해 API Hook를 하게 될 것 입니다.
본론으로 들어가기전에 Trampoline Hook이 어떠한 방식인지 이해하기 위해
Trampoline Hook를 이용하는 애플리케이션이 어떠한 방식으로 API를 Hook는지 살펴보겠습니다.
대상 애플리케이션은 하이퍼 스냅이며 우선 하이퍼 스냅을 띄웁니다.
일단 이 상태에서 TextOutA에 API코드를 보면 다음과 같습니다.
( 델파이 IDE에서 디버깅해보는 화면입니다. VC2005에서는 함수에 이름이 나오지 않기 때문에 사용하지 않았습니다. )
다음과 같은 코드로 이루어져 있다는 것을 보실 수 있으며 첫 부분은 mov edi, edi로 시작하게 됩니다. ( Windows xp sp2 기준. )
그렇다면 TextOutA가 하이퍼 스냅에 의해 훅이 되었을 경우 어떻게 바뀌는 보겠습니다.
( 참고 : TextOutA가 훅이 되는 시점은 사용자가 하이퍼 스냅에게 텍스트 캡쳐 명령을 내린 후 훅이 되고 바로 훅이 해제 되게 됩니다.
만약 테스트를 하려면 OnPaint 시점에 TextOutA를 호출하도록 하고 Text From an Object under Cursor메뉴를 이용해야 합니다. )
위와 같이 0xE9 xxxxx ( xx 는 내 함수가 있는 주소. 이 이미지에서 기계어 코드를 보시면 0xE9다음에 나오는 주소가
조금 이상하게 보일 수 있는데 0xE9에 경우는 상대주소를 사용하기 때문입니다. 이에 대해서는 다음에 설명하게 됩니다. )
형태로 하이퍼 스냅이 만들어 놓은 코드로 점프시키도록 합니다.
이 부분은 하이퍼 스냅에서 사용하는 Hook 함수 코드입니다.
또한 실제로, 이 주소에 모듈이 올라와 있는 것을 확인 할 수 있습니다. ( 주소는 시스템에 따라서 다를 수 있습니다. )
문서 쓰는 중...
기다려주..............3
Microsoft Office OneNote 2007을 사용하여 작성했습니다.
모든 노트 및 정보를 한 곳에서 볼 수 있습니다.