DLL Injection 에 대해서 자세히 알아보겠습니다.

DLL Injection 기법은 다른 프로세스에 침투하는 가장 쉽고 강력한 방법입니다.



DLL Injection 이란?


다른 프로세스에 특정 DLL 파일을 강제로 삽입시키는 것입니다.

더 정확히 표현하면 다른 프로세스에게 LoadLibrary() API 를 호출하도록 명령하여 내가 원하는 DLL 을 loading 시키는 것입니다.

따라서 DLL Injection 이 일반적인 DLL loading 과 다른점은 loading 대상이 되는 프로세스가 내 자신이냐 아니면 다른 프로세스냐 하는 것입니다.

아래 그림을 봐주세요.


<Fig. 1>

notepad 프로세스에 myhack.dll 을 강제로 삽입시켰습니다.
(원래 notepad 는 myhack.dll 을 로딩하지 않습니다.)

notepad 프로세스에 로딩된 myhack.dll 은 notepad 프로세스 메모리에 대한 (정당한) 접근권한이 생겼기 때문에 사용자가 원하는 어떤 일이라도 수행할 수 있습니다. (예: notepad 에 통신기능을 추가하여 메신저나 텍스트 웹브라우저 등으로 바꿔버릴 수도 있습니다.)



DLL Injection 사용 목적


LoadLibrary() API 를 이용해서 어떤 DLL 을 로딩시키면 해당 DLL 의 DllMain() 함수가 실행됩니다.

DLL Injection 의 동작원리는 외부에서 다른 프로세스로 하여금 LoadLibrary() API 를 호출하도록 만드는 것이기 때문에 (일반적인 DLL loading 과 마찬가지로) 강제 삽입된 DLL 의 DllMain() 함수가 실행됩니다.

또한 삽입된 DLL 은 해당 프로세스의 메모리에 대한 접근권한을 갖기 때문에 사용자가 원하는 다양한 일(버그 패치, 기능 추가, 기타)을 수행 할 수 있습니다.

그런데 문제는 대부분 악의적인 용도로 사용된다는 것입니다.

- 악성 코드

정상적인 프로세스(winlogon.exe, services.exe, svchost.exe, explorer.exe, etc)에 몰래 숨어들어가 악의적인 짓들을 합니다. 다른 악성 파일을 다운받거나, 몰래 백도어를 열어두고 외부에서 접속하거나, 키로깅 등의 나쁜짓을 하는 것이죠.

정상 프로세스 내부에서 벌어지는 일이라서 일반적인 PC 사용자들은 눈치채기 어렵습니다.
만약 explorer.exe 가 80 포트로 어떤 사이트에 접속시도를 한다고 생각해보세요.
일반인들은 그냥 정상 프로세스의 정상적인 동작으로 생각하기 쉽습니다.

- 유해 프로그램, 사이트 차단 프로그램

부모님들께서 아이들의 건전한 PC 사용을 위해 설치하는 '프로세스 차단 프로그램' 등이 있습니다.
주로 게임 프로그램과 성인 사이트 접속 등을 방지하는 역할을 하지요.

아이들 입장에서야 원수(?)같은 프로그램이라서 미친듯이 해당 프로세스를 종료하려 듭니다.
DLL Injection 기법으로 정상 프로세스에 살짝 숨어들어간다면 들키지도 않고, 프로세스 강제 종료에도 안전하게 됩니다. (Windows 핵심 프로세스를 종료하면 시스템이 같이 종료되기 때문에 결국 '차단' 하려는 목적을 달성하는 셈이지요.)

- 기능 개선 및 (버그) 패치 

만약 어떤 프로그램의 소스 코드가 없거나 수정이 여의치 않을 때 DLL Injection 을 사용하여 전혀 새로운 기능을 추가하거나 (PlugIn 개념) 문제가 있는 코드, 데이타를 수정할 수 있습니다.
일단 프로세스 메모리에 침투한 DLL 은 해당 프로세스의 메모리에 자유롭게 접근 할 수 있기 때문에 코드, 데이타를 고칠 수 있습니다.
저도 예전에 인터넷에서 다운받은 헥사 에디터에 버그가 있길래 DLL Injection 기법을 이용해서 해당 버그 코드를 간단히 패치해서 사용한 적이 있습니다. (그냥 다른 헥사 에디터를 다운 받아도 써도 되지만 고쳐 쓰고 싶은 마음에... ^^)

- API Hooking

다음번에 설명드릴 주제인데요, API Hooking 에 DLL Injection 기법이 많이 사용됩니다.
정상적인 API 호출을 중간에서 후킹하여 제가 원하는 기능을 추가 (혹은 기존 기능을 제거)하는 목적으로 사용됩니다.

이 역시 삽입된 DLL 은 해당 프로세스의 메모리에 대한 접근 권한을 가지고 있다는 특성을 잘 활용한 것입니다.



DLL Injection 간단 실습


notepad.exe 프로세스에 myhack.dll 을 injection 시키도록 하겠습니다.
=> myhack.dll 은 www.naver.com/index.html 을 다운받도록 프로그래밍 하였습니다.

myhack.dll

InjectDll.exe


1) InjectDll.exe 와 myhack.dll 을 다운받아 C:\ 에 복사합니다.
2) 메모장(notepad.exe) 을 실행합니다.
3) InjectDll.exe 를 실행합니다.

Process Explorer 를 이용하여 notepad.exe 프로세스에 Injection 된 myhack.dll 을 확인해 보겠습니다.


<Fig. 2>

notepad.exe 프로세스 메모리 공간에 myhack.dll 이 들어와 있는게 보이시죠?

C:\index.html (네이버 초기화면 html) 파일이 정상적으로 생겼는지 볼까요?


<Fig. 3>

index.html 파일을 메모장으로 열어보겠습니다.


<Fig. 4>

정상적으로 notepad.exe 프로세스에 myhack.dll 이 Injection 되어 http://www.naver.com/index.html 파일을 받아왔습니다.

이와 같이 다른 프로세스에 침투하여 원하는 동작을 마음껏 수행할 수 있는 Dll Injection 기법의 원리와 구현 방법에 대해서 알아보겠습니다.


Dll Injection - 다른 프로세스에 침투하기 (2)


ReverseCore

  1. 베리굿 2009.11.09 19:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    잘만 사용하면 무서운 기능이군요

  2. bywords 2010.10.29 23:47 신고 댓글주소 | 수정 | 삭제 | 댓글

    윈 7에서 실행이 안되는 것은 왜그러는 것인가요~

    • reversecore 2010.11.03 00:39 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      실행이 안된다는 것인가요?
      아니면 index.html 을 받지 못한다는 말씀이신지요...

      제가 XP 와 7 에서 테스트를 완료하였습니다만...
      index.html 파일을 다운 받지 못하는 사례가 있습니다. 다양한 이유를 생각해 볼 수 있습니다. (보안 프로그램, 접속 사용자 권한, 네트워크 방화벽 정책, 기타)

      위의 예제는 DLL Injection 첫 예제로는 좋지 않은 것 같아서 바꿀 예정입니다.

      감사합니다.

  3. dngchn 2010.12.13 11:19 신고 댓글주소 | 수정 | 삭제 | 댓글

    위 컬럼과 유사하게 테스트 중입니다. notepad 대신 activeX 컨트롤을 포함하고 있는 타겟을 대상으로 dll을 인젝션시켰습니다. 인젝션 시킨 dll 내부에서 dll attach타이밍에 해당 activeX 컨트롤의 핸들을 얻어와서 CWnd::FromHandle을 통해 해당 컨트롤을 제어하려고 해보았는데(해당 ActiveX의 컨트롤이 CWnd를 상속받음), Debug Assertion 실패 에러가 나오네요. (이 의미가 서로 다른 쓰레드에서 해당 컨트롤을 접근하여 발생한 듯 한데..), 그런데, 타겟의 버튼 컨트롤에 대해서는 위와 같은 시도가 정상적으로 동작합니다. dll attach 타이밍에 핸들을 찾아 이를 통해 FromHandle하여 얻은 오브젝트를 Button으로 캐스팅하면 해당 버튼을 온전히 제어할 수 있습니다. Button과 ActiveX와 어떤 차이가 있을까요? ActiveX에 포함된 컨트롤을 제어하려면 어떻게 해야 할까요?

    • reversecore 2010.12.16 15:24 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      메일로도 비슷한 질문을 해주셨죠?

      일반 버튼 컨트롤은 문제 없는데 유독 ActiveX 컨트롤만 Debug Assertion 에러가 나왔다구요?

      저도 일반 어플리케이션의 콘트롤들을 가지고 노는건 많이 해봤지만 ActiveX 객체는 한번도 해본 적이 없군요. 제가 부족한 부분이라고 생각됩니다.

      향후에는 ActiveX 관련 리버싱에 대해서도 공부를 잘 해놓아야 할것 같습니다.

      감사합니다.

  4. ASK! 2011.01.28 21:46 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요..
    전 CORE님 책으로 리버싱 입문하고 싶어서
    책 나오기만을 기다리고 있는 미래의 독자(?)입니다..
    윗 댓글을 보니 머지않아 볼 수 있는건가요?+_+
    ㅎ 제가 글을 쓰느 이유는 궁금한게 있어서요.

    1. 책을 볼려면 어셈정도는 알고 봐야 하나요?
    2. C + API조금 알고 있는 상태에서 책을 구입하여 읽으면 괜찮을까요?

    음.. 써놓고 보니 1번 문제는 어쩌면 당연한거고..
    2번은 약간 질문에 모순이 있는거 같기도 하고..
    그냥 책을 읽기 위한 '선지식'에 대해 궁금해서요..

    글이 이것도 아니고 저것도 아니게 됬네요..
    쩝.. 아무튼 책 얼릉 보고싶네요! 수고하세요!

    • reversecore 2011.01.31 11:40 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      일단 제 책을 기다려 주셔서 감사드립니다. ^^~

      1. 제 경우 어셈블리를 전혀 모르는 상태에서 리버싱에 입문하였습니다. 입문과정에서는 어셈블리 지식 보다는 디버거 사용법, Windows 구조 등이 좀 더 중요한 것 같습니다.

      2. C 언어와 Win32 API 는 어차피 잘 배우셔야 하므로 잘 알면 잘 알수록 좋지요. 너무 방대하다는게 문제지만요. 근데 모르는 사람들도 어찌어찌 잘 들 하십니다. 크게 걱정하지 마세요. 부딪혀서 그때 그때 자료 조사해서 나갈 수 있습니다.

      문의한 내용들은 어쩌면 리버싱 중/고급 과정으로 올라가기 위해 필요하다고 볼 수 있고요, 입문/초급 과정에는 심각하게 중요한 것은 아니라고 생각합니다. ^^

      감사합니다.

  5. unuruu 2011.12.04 10:10 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요~

    혹시 dll 을 제가 정한 인젝터에만 연동 되게 하려면 어떻게해야하나요?
    이 소스 한번 봐줄수있으신지요 이렇게 했는데요
    이건 윈도우 폴더만 인식하더라구요
    그 정한 인젝터를 프로세스에서 실행됬을때로
    바꿀려면 어떻게해야하죠?
    int main(){

    HWND hwnd;

    hwnd = FindWindow(NULL,"test.exe");


    if (hwnd == 0){

    MessageBox(0,"text인젝터가 실행중이지 않잖아!","",0);

    return 0;
    }

    if (hwnd == NULL){


    MessageBox(0,"프로세스 없음","",0);
    }
    else{
    MessageBox(0,"전용 인젝터군!","",0);

    }
    return 0;
    }

    어디가 문제인지 알려줄수있으신가요?

    • reversecore 2011.12.21 01:48 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      먼저 인젝터(Injector) 라는 용어를 DLL Injection 을 시켜주는 프로그램(InjectDll.exe) 으로 사용하신게 맞으시죠?

      윈도우 폴더만 인식한 다는 말씀은 잘 이해가 안가네요.

      코드를 보자면 "test.exe" 캡션을 가진 윈도우를 찾아서 없다면 "text인젝터가..." 메시지를 출력하고, 만약 있다면 "전용..." 메시지가 출력되겠네요.

      이 main() 코드가 인젝터 내부의 코드인가요?

      감사합니다.

  6. 독자 2013.01.07 11:29 신고 댓글주소 | 수정 | 삭제 | 댓글

    myhack.dll을 다음에서 악성코드로 분류했기 때문에 다운로드 할 수가 없습니다. 조치를 취해주시거나 새로 압축해서 올려주시면 감사하겠습니다.

    • reversecore 2013.01.12 01:02 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      아, 그렇군요...

      제 실습예제에 포함되어 있으므로 그걸로 테스트 해보시기 바랍니다.

      http://www.reversecore.com/104

      23장의 myhack.dll 파일입니다. (블로그와 약간 주소가 달라질 수 있습니다.)

      감사합니다.

  7. 실습생 2013.02.07 20:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    음 책에서 나온 예제를 따라하고 있는데 아래와 같은 오류로 진행이 안되고 있습니다. 어떻게 진행을 해야 할까요?
    C:\work>InjectDll.exe 4032 c:\work\myhack.dll
    The token does not have the specified privilege.

    • reversecore 2013.02.08 17:13 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      아마 23장 예제를 따라하시는것 같습니다.
      그 예제는 32bit OS 에서 정상동작하는데요.

      사용하시는 OS 와 제가 만든 실습 예제가 맞는지(혹시 직접 만드신 건지) 확인해 주시기 바랍니다.

      또한 특정 시스템 프로세스에는 인젝션 되지 않습니다. (Windows Vista/7 에서는 약간 다른 방법을 사용합니다. 43장을 참고하시기 바랍니다.)

      감사합니다.

  8. BSUN 2013.03.15 15:29 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하십니까.
    좋은 글을 올려주셔 감사합니다.
    플래시파일(swf)에도 인젝이 가능합니까.
    흥미삼아 IE로 플래시파일을 로드하여 여기에 DLL을 인젝시키려고 하였는데 제대로 동작하지 않습니다. 혹시 불가능한걸 제가 하겠다고 시도하는지...
    좀 가르쳐주세요.

    • reversecore 2013.04.01 22:27 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      swf 파일은 일종의 데이터 파일이지요. DLL Injection 은 프로세스에게만 가능합니다. 따라서 플래쉬 플레이어 프로세스에게 인젝션 하는 것이 맞습니다.

      질문 내용에 따르면 IE 에게 DLL 인젝션 시키셔야 합니다.

      감사합니다.

  9. 모듈이.. 2014.01.17 10:21 신고 댓글주소 | 수정 | 삭제 | 댓글

    모듈이 접근 제한ㄴ이 걸렸습니다...





티스토리 툴바