티스토리 뷰

반응형

Detours는 Microsoft사에서 공개한 매우 강력한 Windows API 후킹 라이브러리이다.

 

기존에는 $9,999 이상의 비용을 내고 사용해야 하던 라이브러리였지만, 현재는 라이센스가 MIT License로 변경되면서 완전 무료 오픈소스로 변경되었습니다. 2002년부터 Microsoft에서 공식적으로 사용해오던 매우 신뢰할 수 있는 라이브러리 입니다. 

 

[ 설치방법 ]

DownLoad : https://github.com/microsoft/detours

 

Github를 통해 다운로드를 받은 후 "Command Prompt"를 입력해 Visual Studio 터미널창으로 진입한다. 이와 같은 항목이 없을 경우에는 Visual Studio를 설치한 후에 진행하면 된다.

 

 

해당 프로젝트를 다운로드 받은 경로로 이동한 뒤 nmake 명령어를 통해 MakeFile를 실행해 빌드를 진행하도록 한다.

빌드하는데 3~10분정도가 소요되니 여유있게 기다려주자.

 

 

컴파일을 하게되면 bin.X86, lib.X86 파일이 생기는 것을 확인할 수 있다.

디렉토리별 설명은 아래와 같다.

bin.X86 : samples에 있는 소스코드들이 컴파일 되어서 exe, dll파일로 저장되는 디렉토리이다.

            앞으로 예제에서 사용하게될 setdll.exe 파일도 해당 경로에 존재한다.

include : 내가 직접 dll코드를 작성하게 될 때 사용해야할 헤더파일이 존재하는 디렉토리이다.

lib.X86 : 내가 직접 dll코드를 작성하게 될 때 사용해야할 라이브러리 파일이 존재하는 디렉토리이다.

samples : Detours Library에 적응하기위해 테스트 해볼수 있는 예제 코드들이 존재하는 디렉토리이다.

             setdll.exe와 같이 실제 사용하기 좋은 소스코드도 많이 존재하는 것 같다. (공부필요....)

 

 

 

setdll.exe 파일을 이용해 샘플을 돌려보며 적응해보자. 잘 모를땐 항상 /? 옵션을 사용해서 도움말을 참고하도록 하자. 대부분의 샘플 명령어에는 기본적으로 해당 옵션이 존재한다.

 

 

후킹 전, 후킹 명령어, 후킹 후 결과를 차례로 확인할 수 있다.

후킹 명령어는 setdll.exe /d:[DLL] [Target EXE] 을 통해 해당 EXE에 원하는 DLL을 주입할 수 있다.

 

 

해당 EXE파일에 주입되어있는 DLL을 다시 제거하는 명령어는 아래와 같다.

setdll.exe /? [Target EXE]  명령어를 사용해서 해당 EXE파일에 주입된 기타 DLL을 제거할 수 있다.

 


[ 실습 ]

그럼 이제 내가 원하는 EXE파일에 내가 원하는 Windows API를 후킹하기 위해서 직접 DLL 파일을 생성해서 setdll.exe 를 사용해 Hooking하는 과정을 진행해보겠다.

 

우선 Hooking에 사용할 EXE파일은 crackme3.exe 파일이다. KeyFile의 존재여부에 따라 MessageBoxA API를 통해 메세지박스를 띄워주는 실행파일이다.

 

 

위와 같은 MessageBox가 띄워지는 프로그램인 것을 확인할 수 있다.

 

PEView로 확인해본 결과 USER32.dll의 MessageBoxA API가 사용되고 있는 것을 확인할 수 있었다.

 

그러면 간단하게 MessageBoxA API를 후킹해 출력되는 Message를 변경하는 실습을 진행해보자.

 

 

우선 DLL파일을 만드는데 여기서 중요한 부분 몇 가지를 체크해보겠다.

 

1) 3번 라인에서 detours.h를 반드시 include 해줘야한다.

   그래야 Detours Libraray의 API들을 사용할 수 있다.

2) 7번 라인에서의 #define은 사실 필수적이진 않지만 export 함수를 만드는 과정에서

   해당 접두사가 너무길기 때문에 #define을 통해서 편리하게 사용할 수 있도록 했다.

3) 9번 라인에서 detours.lib를 해당 프로젝트에서 사용할 수 있도록 해주는 과정도 반드시 필요하다.

 

이렇게만 한다면 우선 DLL 파일을 만들 준비는 끝났다.

 

그리고 나서는 내가 Hooking하고자 하는 API를 Google에 검색해 반환형과 인자를 찾는다.

 

Microsoft의 API목록에서 쉽게 찾을 수 있다. 그러면 위 코드 11번 라인에서 처럼 static 변수로 해당 API를 반환형과 인자의 자료형을 맞춰서 함수 포인터에 저장해준다. 이는 나중에 후킹을 진행할 때 어떤 API를 후킹할지 명시해주기 위함이다.

 

그리고 이제 내가 해당 API 대신 수행할 Hooking API를 작성하면 된다.

이때 당연하겠지만 반드시 반환형과 인자의 자료형은 일치시켜줘야 한다.

위 코드에서 13~15번 라인에 해당되는 내용이며, 기존에 출력해려던 문자열 대신 "Hooking" 이라는 문자열을 메세지 박스에 출력하게 하는 코드이다. ( 응용은 엄청나게 다양하게 가능할 것으로 예상된다... )

 

이제 마지막으로 DllMain을 작성해준다.

 

아직 Detours Library의 API들의 각각 자세한 역할은 제대로 이해하지 못했다. 나중에 그에 대해 충분히 이해한다면 따로 코멘트를 남기도록 하겠다. 29번, 37번 라인을 통해 Attach, Detach를 진행한다는 것만 확인하고 위 코드는 일단 기억해두자 !!

 

 

이후 해당 DLL 파일을 Build해서 DLL파일로 추출해낸다.

 

이후 위 실습과 동일하게 setdll.exe를 통해 Hooking을 진행해준다.

 

하면 해당 EXE가 있는 경로에 Hooking이 진행된 EXE파일이 생성된다.

실행해보면 정상적으로 후킹이 완료된 것을 확인할 수 있다.

 

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함