본문 바로가기

ETC/까먹지 않기

[C++] 기본으로 추가되는 IAT, 모듈을 제외하기

Visual Studio 2019에서 C++ Dynamic-Link Library (DLL) 템플릿으로 프로젝트 생성

 

Clean Module으로 명명하고,

 

그대로 빌드 시 빌드에 성공한다.

 

pch.h, frameworks.h를 따라가 보면 windows.h 헤더를 인클루드한다.

 

IDA로 열어보면 내가 사용하지도 않은 함수들과 모듈들이 IAT에 나타난다.

 

프로젝트 설정을 수정하여

1. windows.h 헤더 인클루드 제외

2. Security Check 해제

3. 사용하지 않는 라이브러리를 포함시키지 않음

4. ep 함수를 지정

조치를 해 준다.

 

1. 

우선 프로젝트의 dllmain.cpp를 제외하고 헤더와 소스 모두 삭제한다.

 

소스에서도 pch.h를 인클루드하지 않고, 프리미티브 타입을 이용한 함수로 변경한다.

int DllMain(unsigned long hModule, unsigned long ul_reason_for_call, void* lpReserved)
{
	switch (ul_reason_for_call)
	{
	case 1:
	case 2:
	case 3:
	case 0:
		break;
	}
	
	return 1;
}

 

C/C++ > Precompiled Headers > Precompiled Header 옵션을 사용 안 함으로 설정한다.

 

 

2. 

CleanModule 프로젝트 Configuration에서 옵션을 수정한다.

C/C++ > Code Generation > Security Check를 끈다. (/GS-)

 

3. 

Linker > Input > Additional Dependencies 에서 불필요한 의존 라이브러리를 제거한다.

Linker > Input > Ignore All Default Libraries 옵션을 Yes (/NODEFAULTLIB) 으로 설정한다.

 

4.

Linker > Advanced > EntryPoint를 1에서 지정한 EP 함수 이름으로 지정한다.

 

빌드에 성공한다.

 

IDA로 열어보면 IAT가 비어있다.

 

 

String을 모아보면 디버깅을 위한 pdb 파일 경로 정보만 있다.

 

아무것도 구현하지 않은 DllMain 함수에는 TRUE (1) 을 리턴하는 코드만 남겨져 있다.

 

다른 라이브러리의 함수를 사용하려면 IAT가 필수적으로 있어야 할 것 같지만 꼭 그런것도 아니다.

DLL은 다른 EXE나 DLL에 임포트되고 메모리에 할당되는데, 이미 그 프로세스에서 사용하고 있는 필수적인 모듈들이 있다.

NtCurrentTeb()을 통해 TEB와 PEB를 얻고, 프로세스에 로드된 모듈들의 주소와 EAT를 얻어올 수 있다.

구조체에 접근하고 사용할 수 있게 되니 이미 로드되어 있는 모듈들을 사용하는데에는 전혀 문제가 없다.