-
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]번 방법을 사용해서 함수 포인터를 얻을 수 있다.