본문 바로가기

My Study/Reversing

DeleteFiber을 사용한 안티디버깅 기법



한국사이트에는 많은 자료가 없는데 해외사이트에는 안티리버싱 관련된 자료들이 많아 있군요.
한국 사람과 외국 사람과 차이점이 확 들어나네요. 한국인은 자료가 있으면 공개보다는 폐쇄형이지만 외국인들은 공개형이군요. 한국인들도 서로 아는 내용들이 있다면 많이들 공유하면서 공부했으면 좋겠습니다..
=========================================
DeleteFiber함수는 기존의 Fiber을 삭제 시키는 함수입니다. 함수의 원형을 보도록 하겠습니다.
VOID WINAPI DeleteFiber(

          
 __in LPVOID lpFiber

);
리턴 값은 없고 인자로 포인터 변수를 받고 있습니다. 위 코드를 사용한 안티디버깅 기법부터 보시겠습니다.

함수 호출이 끝난 직후 에러 코드가 0x57이면 정상 상태라고 되어있습니다. 
그러면 0x57에러코드가 어떠한 것인지 보겠습니다.

매개변수가 틀렸다는 오류코드 입니다.
딱 봐도 코드상에서 Fiber에 대한 무언가를 설정해 주고나서 DeleteFiber를 해줘야하는데 
단순히 포인터변수만 생성하고 호출하고 있습니다. 인자가 틀린 것이지요.
그렇기 때문에 무조건 0x57이라는 오류코드가 발생합니다. 

그러면 디버깅 중에는 어떠한 오류코드가 발생하는지 보겠습니다.

오류코드 0x0은 작업을 정상적으로 완료 했을 때 발생하는 오류코드입니다.


왜 디버깅 중에는 해당 함수가 정상적으로 호출이 되는 것인지 알아보겠습니다.
크게 플래그와 관련이 있는데 이에 대한 내용은 외국문서에서 찾아보았습니다.

DeleteFiber은 직접 힙과 관련이 있고 힙 메모리 자체의 특성을 플래그로 셋팅합니다.
이 플래그는 디버깅 중일 때와 아닐 때 다른 값을 지니게 됩니다.
이러한 플래그는 exe파일이 실행 될 때 바로 만들어진다고 생각할 수 있습니다.
Windows NT안에서 프로세스는 PspUserThreadStartup를 통해서 생성이 됩니다.
그리고 우리는 그 안에서 우리가 찾고 싶은 것을 찾을 수 있습니다.
그 플래그는 아래와 같습니다.

아마 많이 보신 플래그 일 것입니다. 바로 NtGlobalFlag를 사용한 안티디버깅 탐지 기법을 공부할 때
보았던 플래그들 일 것입니다. 바로 여기서 말하는 플래그도 이 플래그 입니다.
그렇기 때문에 정상 실행할 때와 디버깅 할 때 플래그 값이 다르기 때문에 정상 실행할 때와 달리 DeleteFiber함수는 정상 호출이 됩니다.

약간 뜬구름 잡는 식으로 설명했는데 대충은 이해가 가셨을 것입니다. 결론을 내리면 디버깅 할 때와 일반 실행 할 때와 플래그 값이 달라서 DeleteFiber함수의 결과가 달라지게 된다는 것입니다.

그리고 올디의 플러그인의 NtGlobalFlag를 사용한 안티디버깅 기법 우회하는 기능이 있는데 이 기능을 키게되면 우회가 되는 것이 아니라 아에 예외가 발생해버리며 프로그램이 죽게 되네요.