ML

TLS 콜백 함수 설명과 안티디버깅 우회

728x90
반응형

TLS 콜백

TLS 콜백 함수는 프로세스의 스레드가 생성 및 종료될 때마다 자동으로 호출되는 콜백 함수이며 EP 코드보다 먼저 호출되는 점을 이용해 안티 디버깅 기법으로 사용된다.

 

TLS 콜백 함수 정의는 아래 형식으로 구성되어 있다.

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
	PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
);

두번째 파라미터의 Reason은 TLS 콜백 함수가 호출된 이유를 나타내고, 각 의미의 해당하는 값은 아래와 같다.

DLL_PROCESS_ATTACH	->	1
DLL_THREAD_ATTACH	->	2
DLL_THREAD_DETACH	->	3
DLL_PROCESS_DETACH	->	0

위에 설명한 것처럼 메인 EP코드가 실행되기 전에 TLS 콜백 함수가 실행되는 것을 볼 수 있다.

TLS 콜백 디버깅

TLS 콜백 함수가 적용된 프로그램을 디버거로 열면 EP 코드보다 먼저 실행되는 TLS 콜백 함수를 디버깅 할 수 없다. 그러므로 디버깅 옵션 중 '시스템 브레이크 포인트'를 설정하여 디버깅을 진행한다. 하지만 이 방법은 매우 번거롭다. x64dbg는 기본적으로 TLS 콜백지점에 멈추도록 옵션이 설정되어 있으며 추가적으로 아래 화면과 같은 설정들이 Default로 설정되어 있다.

위와 같이 설정하고 디버거에 Attach 시키면 아래와 같이 TLS 콜백 부분으로 진입할 수 있다. 아래 TLS 콜백 코드는 ISDebuggerPresent 함수를 이용해 현재 프로세스가 디버깅중인지 확인하고, 디버깅중이면 "Debugger Detected!" 문자열을 출력한다. 아래 파일은 리버싱핵심원리 TLS 예제 파일이다.

안티디버깅 기술 중 TLS 콜백 함수를 이용해 안티디버깅을 적용하는 경우가 있다. EP 코드가 실행되기 전에, TLS 콜백 함수가 실행되는 점을 이용하여 TLS 콜백 함수 부분에 안티디버깅 코드를 삽입하기 때문에 TLS 콜백 부분부터 디버깅을 진행하여 우회해야한다.

 

반응형

댓글

Designed by JB FACTORY