본문 바로가기

*집필*/*집필* Reverse

ZwLoadDriver 함수 개념

간혹 분석 하다가 ZwLoadDriver를 호출하는 Malware가 보여서 로그를 남긴다.

Driver 파일을 로드하기 위해 필요로 하는 함수 중 ZwLoadDriver 함수는 드라이버로 등록된 서비스에

대하여 로드를 수행할 수 있다.

## 우선적으로 설명하지만 현재 외부 네트워크가 연결되지 않은 환경에서 블로깅을 진행하고 있기 때문에

## 더욱 자세한 정보나 공개되어 있는 정보들에 대한 부가 설명은 제외 되었다.


ZwLoadDriver( LSA_UNICODE_STRING buf );

Microsoft 사의 MSDN에서 해당 함수를 검색해보면 위와 같은 함수 형에 대한 설명을 찾을 수 없었다.

위 함수를 이해하기 위해 구글링*을 하던 중 어느 중국의 한 블로거의 소스코드를 보게 되었다.

물론 위와 같이 함수를 사용한것은 아니나 ZwLoadDriver( buf ) 로 사용하고 있는것을 확인했다.

함수 파라메터 값을 역으로 추적해 보니 LSA_UNICODE_STRING 구조체로 할당하고 있는것을 체크 한 후

역시 이 구조체에 대하여 구글링을 수행하였다.

Typedef struct _LSA_UNICODE_STRING{

USHORT Legth;

USHORT MaximumLength;

PVOID Buffer;

}

조금 감이 잡히는가?

참고로 32bit 환경에서는 USHORT의 변수 사이즈는 2byte이다.

첫 번째 2Byte는 Buffer 내의 문자열 사이즈,

두 번째 2Byte는 Buffer 의 최대 크기 (엄밀히 말하자면 할당 사이즈)

그리고 마지막 void형 포인터는 문자열을 가리키는 주소값이다.

이렇게 모두 8bytes를 가진 해당 구조체 정보를 ZwLoadDriver 함수에 사용하기만 하면 된다.

여기서 (중요한) 한가지 알고 넘어가야하는것은 우리가 알고있는 LoadLibrary와 같이

Buffer 내의 문자열이 드라이버 파일의 Path정보를 나타내는 것이 아니다.

void형 포인터가 가리키는 정보는 시스템에 등록한 서비스 Path 정보라는 것.

즉 시스템에 드라이버 파일로 동작하는 "AAA" 서비스가 등록되어 있다면

void형 포인터가 가리키는 정보는

"\Registry\Machine\System\CurrentControlSet\Services\AAA"가 된다.

AAA 하위 ImagePath 키에 저장되어 있는 드라이버 파일이 실제 로드가 되며

ZwLoadDriver()는 서비스에 대한 정보만 제공하면된다.

그렇다면.

ZwLoadDriver 함수가 호출되었다는것은 이미 서비스는 시스템에 등록이되어 있다는것을 의미한다.

_____________________________________________________________________________

* 구글링 : 웹 서칭이다. 구글 검색 엔진을 통해 원하는 정보를 탐색하는 일련의 행위를 말한다.