-
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]번 방법을 사용해서 함수 포인터를 얻을 수 있다.
반응형'프로그래밍 > 해킹/보안' 카테고리의 다른 글
안티치트 솔루션 개발에 필요한 기능 정리 (2) 2025.03.27 안티치트 커널 드라이버에서 프로세스 행위 검사를 위한 정보 수집 콜백 항목 정리 (0) 2025.03.26 게임 보안 프로그램이 게임의 메모리 변조를 탐지 하는 방식 (0) 2025.03.26 윈도우 프로세스 메모리 보호를 위한 방식 분석 (0) 2025.03.25