ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DLL 라이브러리에서 (DLL Export Function) 함수 이름 숨기기
    프로그래밍/해킹/보안 2023. 4. 5. 21:37

    C/C++ 기반으로 DLL을 만들어서 공유 라이브러리로 사용하면 어쩔 수 없이 C 함수를 노출시키는 경우가 흔하다.

    하지만 이거는 보안상 아주 위험한 짓이다.

     

    왜냐?  일반적인 DLL 같은 경우는 `Export Table` 정보가 그대로 저장이 되기 때문이다.

    솔루션 회사에서 만약 본인들의 DLL 모듈의 Export 함수가 존재할 때, 이 함수의 정보를 외부로 노출 시킨다고 생각해보자.

    악의적인 목적으로 누군가가 DLL Export Table 정보를 쭉 확인하고 함수 이름으로 이 DLL의 기능을 추측할 수 있다는거다.

     

    이때 그러면 DLL Export Function 이름을 대충 만들면되는거 아니야?  라고 한다면 할 말이 없다.

    SecretFunction_1, SecretFunction_2, SecretFunction_3 ... SecretFunction_N  같이 대충만들면된다.

    그럼 개발자는 개발어떻게해? 하나하나 함수 이름이 뭔지 정리된 문서를 보고 함수를 찾아야한다.

    생산성이 아주 바닥을 칠 것이다. (내 주식 처럼)

     

    자 그럼 어떻게 숨기는지 이제부터 알아보자

    #include <Windows.h>
    
    class CWinAPI {
    public:
    	void ExtCreateFile();
    };
    
    class CWinAPI extApi;
    
    
    __declspec(dllexport) void ExtCreateFile()
    {
    	return extApi.ExtCreateFile();
    }
    
    
    
    void CWinAPI::ExtCreateFile()
    {
    	CreateFileA(0, 0, 0, 0, 0, 0, 0);
    }

    만약 위와 같은 코드를 작성했다고 가정해보자.

    그리고 빌드를 하고, DLL Export Table 정보를 볼 수 있는 툴을 통해 정보를 확인하면 다음과 같이 나타난다.

    위와 같이 나타난다. 이름이 그대로 나온것이다..

    그럼 이제 숨겨보도록 하자

     

    프로젝트에 def 파일 아무거나 하나 만들고 내용을 입력한다.

    EXPORTS
     ExtCreateFile   @1 NONAME

    이후 비쥬얼 스튜디오 프로젝트 속성 → 링크 → 입력 이 들어가서 `모듈 정의 파일` 정보를 위 def 파일로 지정해준다.

     

    이제 빌드를 하고 dumpbin 으로 export table 정보를 확인한다.

    위와 같이 함수 이름이 숨겨졌다.

     

     

    Export 함수면 Import 해서 쓸 때는 어떻게 쓰나 ? 

    fp = (fn_ExtCreateFile)GetProcAddress(hDllLibrary,"ExtCreateFile "); // 1
    fp = (fn_ExtCreateFile)GetProcAddress(hDllLibrary,"(LPCTSTR)MAKELONG(1,0)"); // 2

    기존에는 [1] 처럼 썻다면, 위와 같이 def 파일을 통해 링크타임에 함수 이름을 숨겼다면 [2]번 방법을 사용해서 함수 포인터를 얻을 수 있다.

    댓글

Designed by Tistory.