본문 바로가기
기타

Detours 에서 Detoured.dll 제거하기

by WeZZ 2009. 4. 30.
Detours 라이브러리는 현존하는 API 후킹 라이브러리중에 가장 뛰어나고 가장 심플한
후킹 라이브러리이다. 또한, 고급후킹방법과 최고레벨의 후킹기술을 보여주는 샘플도
함께제공한다. 무엇보다 VC++ 을 하는 사람한테는 델파이의 매드훅라이브러리가 부럽지
않게 해줄 정도의 완벽한 후킹라이브러리이다. 이것을 해커들도 알고있으므로 1.5 버전
부터 해커들의 책에 자주등장하였다. 이 Detours 라이브러리의 처음 배포시점의 이미지와
설명법이 rootkit 책에서 조차 인용되고있을 정도로 유명한 라이브러리이다. 이 라이브러리의
응용법은 무궁무진하다. 다만, 고급으로 사용하려면 그만큼의 많은 연습과 노력이 필요하다.
여기까지 라이브러의 설명을 마치고 1.5 버전과 최신버전의 2.1 버전에서 발생하는 문제를
해결하기로한다. 1.5 버전까지는 아주 그야말로 환상적이었지만 반면에 어딘가 모를 불안함
이 있었다. 예를들면 소켓을 후킹하면 connect 시에 항상 에러를 발생시킨다던가 기타등등의
몇가지 api 후킹시에 이상한 에러를 내뱉었다. 그러므로 1.5 는 버리라고 과감히 말하고싶다.
2.1 버전에는 저자가 설명하길 몇가지 심각한 버그들이 해결되었다고 했으므로 2.1 버전을
사용하는 것이 안전한 후킹을 할 수 있다. 그런데 항상 발생하는 문제이지만 업그레이드만
되면 되는데 항상 뭔가 불편함이 따라붙기 마련이다. 역시 2.1 버전으로 업그레이드 되면서
불편함이 따라붙었다. 불필요한 dll 파일을 요구하는 것이다. 필자는 처음부터 이점을 제거해서
쓰고있었다가 다른 사람들도 필요할거 같아서 제거하는 방법을 팁으로 적어볼까 한다.
어쩌다보니 Detours 를 지우게되어서 다시 받아서 설치하고 쓰려니 요놈의 혹이 다시 귀찮게
굴어서 패치하고나서 컴파일하는 시간에 글을 작성해본다.
--------------------------------------------------------------------------------------

Detours 1.5 가 아닌 2.1 버전부터는 인젝션시에 항상 Detoured.dll 파일이 같이 있어야 한다.
즉, 한개의 파일로 심플하게 후킹을 걸었던 예전과 달리 쓰잘데기없는 혹이 달려있다. Detoured.dll 의
역할은 확인해보면 알겠지만 마커이다. 즉, 해커가 만들은 dll 파일이 Detours 를 이용한 후킹파일인지
확인하기위한 용도이므로 아무런 역할도 없다. 이 혹을 떼어버리기 위해서 다음과 같이 몇군데만 바꾸
자.

다음의 사이트에서 Detours 라이브러리를 다시 받는다.
http://research.microsoft.com/sn/detours/

DetoursExpress2.1 버전에는 Build215 버전과 Build216 버전이 있는데 최근버전이 216 버전이므로
기존에 갖고있다고 하더라도 Build215 버전일 것이다. 그러므로 새로 받는다.
(차이점은 lib 파일을 다 비교해 보았는데 빌드상 차이가 없었다. 아마도 샘플이 늘어난듯하다.)

설치경로가 C 드라이브라고 가정하면 다음의 경로에서 각각의 파일들을 열어서 패치한다.
C:\Detours Express 2.1\src
-----------------------------------------------------------------------------------
[makefile 파일의 69 번째 줄]
CFLAGS=$(CFLAGS) /Gs /DDETOURS_X86=1 /D_X86_ /DDETOURS_INTERNAL_USAGE

위와 같이 /DDETOURS_INTERNAL_USAGE 를 삽입해서 컴파일시 정의문을 하나 삽입한다.
-----------------------------------------------------------------------------------
[detours.cpp 파일을 열어서 USAGE 로 검색하라(총 두군데)]
#ifdef DETOURS_INTERNAL_USAGE
// #error Feature not supported in this release.
#else
    Detoured();
#endif

위와 같이 #error 전처리를 무시하도록 주석처리한다. 위에서 makefile 에서 정의했기 때문에
빠져드는 쪽은 #error 쪽이고 Detoured(); 를 호출하지 않는 것을 알수 있다.
-----------------------------------------------------------------------------------
USAGE 라는 단어로 다시한번 검색하면 한군데가 더 검색될 것이다.(총 두군데)

#ifdef DETOURS_INTERNAL_USAGE
// #error Feature not supported in this release.
    return (HMODULE)NULL;
#else
    return Detoured();
#endif

위와 같이 패치하라. 마찬가지로 #error 전처리로 강제 컴파일에러를 무시하고 핸들에 NULL 을
돌려주도록 추가하라. 그러면 역시 Detoured(); 함수는 무시된다.


이제 C:\Detours Express 2.1\ 디렉토리에서 nmake 를 입력하면 Detoured.dll 이 필요없는
Detours.lib 파일이 생성된다. dll 인젝션을 위한 setdll.exe  과 withdll.exe (샘플에 존재)
파일은 Detours 라이브러리 1.5 버전(인터넷에 있음. 검색을 생활화..)에 있는 것을 사용하면
Detoured.dll 파일을 지정할 필요가 없고 기능은 동일하다.

p.s: (초보자를 위한 도움말)
      nmake 명령은 콘솔명령이므로 cmd (도스창)창에서 입력하며 그냥 입력하면 경로와
      환경변수가 셋팅되어있지 않으므로 사용할 수 없으므로 VC++ 6.0 이 설치된 디렉토리로
      가서 VCVARS32.BAT 라는 파일을 도스창에서 실행시켜줘야만 사용이 가능하다.


---------------------------------------------------------------------------------------
[어차피 아무도 안할테니까.. 그냥 첨부파일로 쓰기좋게 이미 다 해놓고 올린다. -_-; ]
---------------------------------------------------------------------------------------
첨부파일은 이미 패치한 Detours Express 2.1 Build216 버전이며
Detoured.dll 을 요구하지 않는 버전인 Detours 라이브러리 1.5 용
withdll.exe 와 setdll.exe 를 첨부하였다.

출처 : 시큐리티프로프(http://www.securityproof.org )