ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DLL Injection
    Hack/Reversing 2015. 1. 15. 18:13

    안녕하세요 송사리입니다.

     

    이번 강의에서는 DLL Injection에대해서 다뤄보려합니다.

     

    DLL Injection이란 프로그램실행시 프로세스에 올라가게됩니다.

     

    그 프로세스를 이용해서 DLL을 인젝션, 즉 주입시키는것입니다

    그럼 DLL은 메인에서는 자기의역할을하고 프로세스에서는 지정된역할을 할수있습니다

     

    DLL Injection기법을이용하면 정말 최강의 공격이 탄생합니다

     

    이로서, 강의해드리려합니다

     

    일단 기본적인것부터 강의해드리려합니다.

     

    아래와같이 DLL을 만들어봅시다 ㅎㅎ 

     

     

    우선 Visual C++ 6.0을 기준으로 설명해드릴겁니다.

     

    우선 프로젝트생성을하시고 Win32 Dynamic-Link Library를 선택하신후 파일명을 입력해주시면됩니다

     

    DLL은 Dynamic-Link Library의 약자입니다. 참고해두세요 ㅎㅎ 

     

    그리고 OK를 누르시면됩니다 

     

     

    그리고 simple DLL project에 체크해줍니다

     

    왜 빈파일로안만드냐면요~!?

     

    DLL Main을 자동으로 짜주기때문에 아주 편해서 그냥하는것입니다 ㅎㅎ 

     

    #include "windows.h"

    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
          )
    {
        return TRUE;
    }

    이 코드를 짜실분이계신다면 그러셔도 좋습니다..

     

    하지만 저는 편의상 심플프로젝트를선택하겠습니다.

     

    여기까지 완료하고 프로젝트를 생성하면 소스파일이 자동으로 생성됩니다.

     

     

    네 보시면 자동으로짜여져있습니다.

     

    일단생성하시면

     

    #include "stdafx.h"로 되어있으실텐데

     

    #include <Windows.h>로 바꿔주시길바랍니다 ㅎㅎ

     

     

    자 이렇게 소스코드를 짜주시길바랍니다

     

    하나하나 설명해드리겠습니다 일단 

     

    DLL_PROCESS_ATTACH 케이스인데 딱 해석하시면아시겠지만

    저희가만든 DLL이 프로세스에 붙여지면 메세지박스를띄우고 DETACH가 된다면 메세지박스를 띄우는것입니다.

     

    컴파일전에, Project > Setting 탭에 들어가줍니다.

     

     

    그럼 위와같은 화면이 나오게됩니다.

     

    여기서 C/C++탭에 들어가줍니다.

     

    그럼 

     

     

    위처럼 General 이라고 표시되어있는데 저것을 아래와같이 바꿔줍니다.

     

     

     

    바꿔주시고 체크하는곳을 맨위로 두시면됩니다 ㅎㅎ

     

    이거안하시면 dll 컴파일오류나니 조심!! 

     

    자 컴파일하고 프로젝트폴더에 만들어졌는지 확인해보도록하죠 

     

    (어머 case두번째에서 PROCCESS가아니라 PROCESS입니다 오타났네요 죄송합니다;;)

     

     

    네 DLL 파일이 정상적으로 만들어졌습니다.

     

    이젠 맵핑시키는 프로그램을 만들차례입니다!! (헉헉 오늘따라 강의가힘드네요)

     

     

    자 test.dll을 c드라이브에 놓습니다

     

    c:\\경로는 이렇게되겠쬬?? ㅎㅎ

     

     

    자 이렇게 했습니다. 

     

    설명해드리겠습니다

     

    일단 핸들을만들고 그핸들은 LoadLibrary라는 함수를통해서 test.dll을 로드시킵니다.

     

    자동으로 로드시키죠 ㅎㅎ

     

    if문에서 hModule이 제대로 로드되었으면 Success 아니면 Failed가 출력됩니다.

     

    그리고 로드되었다면 FreeLibrary함수를 호출해 라이브러리 로드시킨것을 해제시킵니다 이때 분리되는것입니다.

     

    예측해보면 두개의 메세지박스가 정상적으로 뜨겠군요 (아까 제작한dll에서..)

     

    자 한번 실행결과를 보도록하겠습니다.

     

     

     

     

     

     

    dll 맵핑이 성공되었씁니다

     

    자 이젠 FreeLibrary함수가 호출되겠죠???

     

     

    네 정상적으로 호출되었습니다.

     

     

    이떄쯤 질문들어올것이있습니다

     

    Q.dll이 로드된지 확인해볼수있나요??

    A.네 있습니다 Process Explorer라는 프로그램으로 확인가능합니다.

     

     

    자 일단 process Explorer를 키고!! 

     

    저희가 만든 프로그램을 실행시켜봅시다.

     

     

    프로그램과 test.dll이 동시에 로드되었습니다

     

    자 그다음 확인을눌러서 dll을 해제시켜보겠습니다 ㅎㅎ

     

     

    test.dll이 사라졌씁니다!!!1

     

    여기까지 dll 인젝션 기초였습니다.

     

    기초가 조금 어렵긴하다만 API기본이 다져져있으신분들은 손쉽게할수있으니 홧팅!!!

     

    이상 수고하셨습니다

     

     

    'Hack > Reversing' 카테고리의 다른 글

    GetProcAddress()  (0) 2015.01.16
    Soft BreakPoint  (0) 2015.01.16
    Thread32First()  (0) 2015.01.15
    CreateToolhelp32Snapshot()  (0) 2015.01.15
    OpenThread()  (0) 2015.01.15

    댓글

Designed by Tistory.