함수 포인터

함수 포인터는 함수의 주소를 저장하는 포인터이며, 원래의 함수 대신 포인터 함수를 사용함으로써 시그니처 기반 탐지와 IAT에 흔적을 남기지 않음으로서 탐지를 우회할 수 있습니다.

소스코드 내 Windows API 호출 시 IAT에 흔적이 남는 반면, 함수 포인터는 남기지 않습니다.

소스코드 내 Windows API 함수 호출의 기록(IAT)

함수 포인터를 Windows API로 할당하는 문법은 다음과 같습니다.

  • kernel32.dll handle : Windows API가 저장된 kernel32.dll 등의 DLL 핸들

  • windows api name : 우회하여 사용하고자 하는 Windows API 이름

  • type : 사용하고자 하는 Windows API의 실제 매개변수 타입

다음과 같이 VirtualAlloc 함수를 사용하는 악성코드가 있으며, YARA 룰에서 VirtualAlloc이라는 글자를 탐지하고 있다고 가정하겠습니다.

VirtualAlloc 문자열은 string을 사용하여 문자열을 결합해 탐지를 우회합니다.

함수 포인터를 생성하는 방법은 위에서 언급한 문법대로 생성합니다.

이때는 우회하려는 함수의 실제 매개변수 타입대로 함수 포인터 타입을 정의해줘야 하며, VirtualAlloc의 매개변수 타입은 다음과 같습니다.

pFunctionRaw, pFuntion, windowsAPI_fn 변수들은 임의의 이름으로 변경해도 무방하며, 최종적으로 수정한 코드는 다음과 같습니다.

Demo

Last updated