정보공간_1

[6기 대구 허정욱] EasyHook - Windows API Hooking 본문

IT 놀이터/Elite Member Tech & Talk

[6기 대구 허정욱] EasyHook - Windows API Hooking

알 수 없는 사용자 2014. 10. 6. 20:19

10여 년 전 후킹 기법은 고급 테크닉에 속하는 생소한 개념이였습니다.

단순한 후킹도 고급기술로 취급받았습니다. 하지만 이제는 누구나 후킹을 사용할 수 있도록 오픈소스가 준비되어 있습니다. 그렇지만 많은 사람들은 이 기술을 잘 알고 사용하기란 쉽지 않았습니다.

저번 포스트에서 말씀드렸다시피, 후킹은 기본적으로 '함수 호출을 가로채 변형한 다음 특정 프로그램이나 운영체제의 기능을 변형시키기는 기술'을 의미합니다.

이전에 했던 Detours는 32bit에서만 적용됩니다. 64bit에서 사용하려면, 유료 버전을 구매하여야합니다.

Detours 외에도 madCodeHook과 같은 라이브러리들도 있지만, 오늘은 64bit환경에서도 사용할 수 있는 EasyHook 오픈소스 라이브러리를 알아보려고 합니다. 이번 과정은 EasyHook 방식과 환경설정 방법을 알려드리겠습니다.

EasyHook을 사용하게 되면 추가적으로 DLL을 배포해야하며,
반드시 'Powered by EasyHook'이라는 로고를 사용하려는 프로그램 또는 제품에 명시해야 합니다.

[블로그 참조 그림 1 : 다시 보는 후킹 기법]


[블로그 참조 그림 2 : 다시 보는 후킹 기법]


좌측은 후킹 이전이며 우측은 후킹 이후의 함수 코드입니다. 결과적으로 <그림 1>과 같은 방법을 사용해 코드가 변경됐다는 것을 확인할 수 있습니다. 또한 <그림 2>에서 보면 함수의 시작 부분에 의미 없는 코드인 MOV EDI, EDI 라는 명령어가 있는데, 이는 윈도우즈 XP 이후에 이뤄진 Hot Patching과 후킹 방식을 사용해 원활한 윈도우 업데이트하고자 추가된 내용입니다. 만약 이 코드가 없다면 MOV EBP, ESP 아래의 CMP 명령어까지 영향을 받게 되지만, MOV EDI, EDI 코드가 있기 때문에 필요한 5바이트를 안전하고 정확하게 얻어낼 수 있습니다. (블로그 참조 : 

다시 보는 후킹 기법)


또한 EasyHook 라이브러리는 LGPL 라이선스이기때문에, 상용해서 써도 아무런 문제가 되지 않습니다.
단지, 소스 코드를 가져다가 쓰되, Detours 같은 후킹 라이브러리를 새로 만들지 않아야합니다.

오픈소스SW 라이선스 LGPL 바로알기 

[블로그 참조 그림3 : http://yes.imhappyo.com/422]

LGPL은 GPL의 조건이 너무 엄격해서 사람들이 쓰는 것을 꺼려할까봐 이를 감안해서 만든 라이선스 입니다. 따라서 GPL과는 다르게 LGPL 라이브러리에 응용프로그램을 정적 혹은 동적으로 링크시킨다고 해도 응용프로그램의 소스코드를 공개할 필요가 없습니다. LGPL 전문에 있는 ”라이브러리의 복제본을 무상이나 유상으로 배포할 경우에, 당신은 우리가 당신에게 부여한 모든 권리를 수취인에게도 그대로 부여해야 한다.“라는 내용으로 요구 조건만 준수한다면 상업적인 유상 배포도 허용하고 있습니다. 따라서 자기가 만든 소스코드의 공개없이 가격을 받는 상용제품으로 판매하셔도 됩니다.

다만, LGPL 라이브러리의 소스코드를 수정하였을 때에는 2차적 파생 저작물에 해당하므로 라이브러리의 소스코드를 제공해야 합니다. (블로그 참조 : http://yes.imhappyo.com/422)


이제 EasyHook 라이브러리를 다운받아 프로젝트 환경을 만들어보겠습니다.

[그림 4. EasyHook 사이트]


easyhook 사이트에 가셔서, download를 합니다. 

[그림 5. EasyHook 압축파일]


바탕화면이나 작업하려는 폴더에 압축을 풉니다.

그리고 Visual Studio 환경에서 작업을 시작해보겠습니다.


[그림 6. 64비트 설정]


위와 같은 작업 환경을 만듭니다.

EasyHook은 64ibt 환경에서 작업할 수 있도록 만들어줍니다.

프로젝트 속성에서 C/C++  일반 속성란에, 추가 포함 디렉터리에 현재 다운로드 받은 폴더를 지정하고,

링커 속성에서 추가 라이브러리에 똑같은 폴더를 지정해줍니다.


[그림 7. dll 등록]


마지막으로 EasyHook64.dll을 자신의 실행 폴더 exe있는 곳으로 옮겨줍니다.

그래야 컴파일을할 때, dll을 실행시킬 수가 있게 됩니다.


#include <iostream>
#include "easyhook.h"

#if defined(_AMD64_)
#pragma comment(lib, "EasyHook64.lib")
#else
#pragma comment(lib, "EasyHook32.lib")
#endif

int main()
{
int i;
scanf("%d", &i);
return 0;
}

[소스 1. 환경설정 확인 소스]

위와 같이 시작할 수 있는 소스 파일을 실행시켜서 아무런 무리가 없이 실행이 되면 Easyhook을 이용할 준비가 된 것입니다.


기본적으로는 위와 같은 환경설정이긴 하나, 실제로 후킹할 때에는 위의 소스코드가 포함되는 DLL을 만들어주어야합니다.


[그림 8. EasyHook 함수 후킹 과정]


[그림 8]은 함수 후킹하는 과정을 간단하게 나타낸 것입니다.

위와 같은 과정은 아래와 같은 순서대로 실행프로그램에서 준비를 해주어야합니다.


1. 먼저 우리는 Inject 될 DLL을 구현을 합니다. (API_Hook DLL 구현)

2. 이 DLL은 우리가 후킹하려는 파일에서 실행할 수 있도록 CreateProcess 함수로 실행시킵니다. 

3. CreateProcess 함수는 CREATE_SUSPENDED로 설정하여 호출합니다.

4. RhInjectLibrary 함수로 DLL을 실행 프로그램에 Injection 시킵니다.

5. ResumeThread 함수로 실행 프로그램을 재시작시킵니다.