웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

사티아 나델라로가 새로운 Microsoft의 CEO가 되고나서부터 Microsoft에서는 오픈소스에 큰 관심을 갖고있습니다. 그 중 대표적으로 github를 인수했으며, github의 private project가 완전 유료였으나 이 또한 소규모 프로젝트에서는 무료로 사용할 수 있도록 변경이 되었죠. 그리고 수많은 오픈소스 프로젝트들이 공개되고 있습니다.

 

그리고 최근! Detours는 MIT License로 변경되면서 완전 무료 오픈소스로 변경되었습니다.

 

https://www.microsoft.com/en-us/research/project/detours/

 

Detours - Microsoft Research

Detours is a software package for re-routing Win32 APIs underneath applications. For almost twenty years, has been licensed by hundreds of ISVs and used by nearly every product team at Microsoft. What’s New? Detours 4.0.1 is now open source under the MIT l

www.microsoft.com

실제로는 몇년 된것같지만 저는 최근에 알게되었습니다.

 

Detours가 어떤녀석인가?

원래 Detours는 Microsoft에서 유료로 판매하던 API Hooking 라이브러리입니다.

그것도 9,999$ 즉 1,000만원 이상 비용을 지불해야 사용할 수 있던 소스이며, 2002년부터 Microsoft에서 공식적으로 사용해오던 매우 신뢰할 수 있는 라이브러리 입니다.

Detours는 x86, x64 및 기타 Windows 호환 프로세서 (IA64 및 ARM)를 모두 지원합니다.

 

https://github.com/microsoft/detours

 

microsoft/Detours

Detours is a software package for monitoring and instrumenting API calls on Windows. It is distributed in source code form. - microsoft/Detours

github.com

 

Microsoft 공식 Github를 통해서 Detours를 받을 수 있습니다.

 

 

 

 

Microsoft Detours Build

Project를 다운받게되면 별도의 visual studio solution은 제공되지 않고, nmake를 통해 빌드할 수 있도록 Makefile을 제공하고있습니다. 기본 셋팅은 되어있으니 시작 -> Command Prompt를 검색하여 목록을 확인 합니다.

만약 아무것도 나타나지 않다면 Visual Studio를 설치하면 됩니다.

 

 

Detours는 x86과 x64를 모두 지원하기때문에 각각 빌드를 통하여 모든 lib를 추출해야합니다.

1. x86 Native Tools Command Prompt for VS 2019.exe를 실행하여 소스파일 경로로 이동하여 nmake 명령어를 입력하기만 하면 자동으로 빌드가 됩니다!

nmake

 

change source directory

 

nmake

빌드 시간은 느린PC 기준으로 10분정도는 걸리는것같네요.. 걸어놓고 딴짓하고오세요~

2. 완료되었으면 x64 Native Tools Command Prompt for VS 2019.exe를 실행하여 마찬가지로 nmake를 진행하시면 됩니다.

 

빌드가 완료되면 아래와같이 bin, lib 폴더가 생성되게됩니다.

lib는 앞으로 개발할 때 include와 함께 사용하게 될 library가 될것이며,

bin 폴더에는 sample들을 직접 실행해 볼 수 있는 테스트 파일들이 존재합니다.

 

 

bin.x86 folder

해당 경로에서 빌드된 샘플들을 확인할 수 있으며, 직접 테스트도 해볼 수 있습니다.

 

 

lib.x86 folder

앞으로 사용할 파일들이니 lib 파일들과 include 파일들을 따로 백업해두면 됩니다.

 

 

 

빌드도 되었으니 샘플을 한번 돌려볼까요

가장 기본으로 해볼만한 setdll.exe를 테스트해보려 합니다. 근데 이걸 어떻게 쓰는건지 자세히 나와있는곳들이 잘 없죠

그래서 샘플들에선 기본적으로 /? 커맨드들을 만들어놨습니다.

D:\code\microsoft\Detours\bin.X86>setdll /?
Usage:
    setdll [options] binary_files
Options:
    /d:file.dll  : Add file.dll binary files
    /r           : Remove extra DLLs from binary files
    /?           : This help screen.

/? 커맨드를 사용하면 위와같이 사용 방법이 나오게 됩니다. 다른 샘플들도 마찬가지구요

 

D:\code\microsoft\Detours\bin.X86>setdll /d:simple32.dll sleep5.exe
Adding simple32.dll to binary files.
  sleep5.exe:
    simple32.dll
    KERNEL32.dll -> KERNEL32.dll

 

그렇다면 sleep5.exe는 어떻게 바꼈을까요?

//
// setdll을 실행하기 전
//

D:\code\microsoft\Detours\bin.X86>sleep5
sleep5.exe: Starting.
sleep5.exe: Done sleeping.


//
// setdll을 실행한 후
//

D:\code\microsoft\Detours\bin.X86>sleep5
simple32.dll: Starting.
simple32.dll: Detoured SleepEx().
sleep5.exe: Starting.
sleep5.exe: Done sleeping.
simple32.dll: Removed SleepEx() (result=0), slept 5000 ticks.

simple32.dll이 SleepEx()라는 API부분에 Hooking되어 sleep5.exe에서 SleepEx()를 호출할 때 Hooking 되어있는 모듈에서 먼저 처리가 가능해졌네요

SleepEx뿐만 아니라 모든 API를 후킹하여 처리할 수 있습니다.

반응형