티스토리 뷰
728x90
DLL EXPORT 방법 중 NONAME 기술
1. NONAME 기술이란?
NONAME 기술은 DLL에서 함수나 변수를 이름 대신 번호(ordinal)로 export하는 방식입니다. 이 방법을 사용하면 DLL 크기를 줄이고, 보안을 강화할 수 있지만, 사용성과 유지보수 측면에서 어려움이 있을 수 있습니다.
2. NONAME 기술의 장점
- DLL 크기 감소: 함수 이름을 저장할 필요가 없기 때문에, DLL 파일의 크기가 조금 줄어듭니다. 대규모 API나 많은 함수가 있는 DLL에서 유리합니다.
- 보안 강화: 함수 이름이 노출되지 않으므로, 공격자가 함수 이름을 기반으로 공격하는 것을 어렵게 만들 수 있습니다. DLL의 API가 쉽게 후킹되거나 오용되는 것을 방지할 수 있습니다.
- 간단한 호출: 프로그램은 ordinal 값만 알고 있으면, 해당 함수를 호출할 수 있습니다.
3. NONAME 기술의 단점
- 가독성 및 유지보수 문제: 함수 이름이 없으면 코드 가독성이 떨어지며, 유지보수나 디버깅이 어려워질 수 있습니다.
- 호출 오류 가능성: 잘못된 ordinal 값으로 함수를 호출하면, 예상치 못한 함수가 실행될 수 있습니다.
- 명확한 인터페이스 부족: 함수 이름이 없기 때문에 외부 개발자가 인터페이스를 쉽게 이해하기 어렵습니다.
4. NONAME으로 함수 export 설정
DEF 파일을 사용하여 DLL의 export 함수를 NONAME 방식으로 설정할 수 있습니다.
DEF 파일 작성 예시
LIBRARY MyDLL
EXPORTS
FunctionA @1 NONAME
FunctionB @2 NONAME
FunctionC @3 NONAME
이 예시에서 FunctionA
, FunctionB
, FunctionC
는 각각 @1
, @2
, @3
이라는 ordinal 값으로 export됩니다.
5. DLL과 NONAME 호출 예시
DLL 함수 구현 (MyDLL.cpp)
// MyDLL.cpp
#include <windows.h>
extern "C" __declspec(dllexport) void FunctionA() {
MessageBox(NULL, "Function A Called", "MyDLL", MB_OK);
}
extern "C" __declspec(dllexport) void FunctionB() {
MessageBox(NULL, "Function B Called", "MyDLL", MB_OK);
}
extern "C" __declspec(dllexport) void FunctionC() {
MessageBox(NULL, "Function C Called", "MyDLL", MB_OK);
}
DEF 파일 설정 (MyDLL.def)
LIBRARY MyDLL
EXPORTS
FunctionA @1 NONAME
FunctionB @2 NONAME
FunctionC @3 NONAME
NONAME 방식으로 함수 호출 (main.cpp)
#include <windows.h>
#include <iostream>
typedef void (*FunctionA)();
typedef void (*FunctionB)();
typedef void (*FunctionC)();
int main() {
HMODULE hModule = LoadLibrary("MyDLL.dll");
if (!hModule) {
std::cerr << "DLL 로드 실패" << std::endl;
return 1;
}
// Ordinal 값으로 함수 가져오기
FunctionA funcA = (FunctionA)GetProcAddress(hModule, MAKEINTRESOURCE(1)); // @1에 해당하는 함수
FunctionB funcB = (FunctionB)GetProcAddress(hModule, MAKEINTRESOURCE(2)); // @2에 해당하는 함수
FunctionC funcC = (FunctionC)GetProcAddress(hModule, MAKEINTRESOURCE(3)); // @3에 해당하는 함수
if (funcA) funcA();
if (funcB) funcB();
if (funcC) funcC();
FreeLibrary(hModule);
return 0;
}
6. 보안 강화 측면
NONAME 방식은 함수 이름을 숨김으로써 보안을 강화할 수 있습니다. 이는 공격자가 DLL 내부의 함수 이름을 쉽게 파악하고 악용하는 것을 방지할 수 있습니다. 그러나, 이 방식만으로는 충분하지 않으며 다른 보안 기법과 함께 사용하는 것이 좋습니다.
7. 결론
NONAME 기술은 DLL의 크기를 줄이고, 보안을 강화하는 데 유리하지만, 사용성과 유지보수 측면에서 어려움이 있습니다. 이 기술을 사용할 때는 장점과 단점을 신중히 고려하여 특정 상황에 맞게 사용하는 것이 좋습니다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- effective
- OpenSource
- 블루버블다이빙팀
- C#.NET
- 외돌개
- 스쿠버다이빙
- Effective c++
- CMake
- 패턴
- C#
- Linux
- C
- 성산블루버블
- script
- PowerShell
- Build
- 블루버블다이브팀
- 스쿠버 다이빙
- 서귀포
- Windows
- 제주도
- 암호화
- 네트워크 정보
- DLL
- 블루버블
- C++
- 울릉도
- 서귀포블루버블
- 현포다이브
- C# 고급 기술
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함
250x250