취약점 분석/안티 리버싱

CheckRemoteDebuggerPresent, 우회방법 (최신)

night-Ohl 2019. 2. 27. 16:53
반응형

CheckRemoteDebuggerPresent 안티디버깅 기법, 우회 방법


Remote라고 해서 꼭 원격의 디버거만을 의미하는 게 아니라, 디버거가 별도의 병렬 프로세스에 존재한다는 것을 나타낸다. 내부적으로 IsDebuggerPresent or NtQueryInformationProcess 함수를 사용하여 호출 프로세스가 디버거에서 실행 중인지 여부를 탐지한다.


CheckRemoteDebuggerPresent

Syntax


HANDLE hProcess [in]

: 확인하고싶은 프로세스의 핸들


PBOOL pbDebuggerPresent [in, out]

: 디버깅 중이냐 아니냐 값 True or False 반환됨.


[CheckRemoteDebuggerPresent 함수 내부]

내부에서 2번째 인자로 ProcessDebugPort(0x07)을 push하여 NtQueryInformationProcess() 함수를 호출한다.


NtQueryInformationProcess() 함수는 아래 링크 참조.

https://nightohl.tistory.com/entry/NtQueryInformationProcess-ProessDebugPort-우회방법


[Remarks]

CheckRemoteDebuggerPresent Remark를 보면 IsDebuggerPresent를 통해 디버거가 실행중인지를 판단한다라고 했다.

디버거로 함수 내부를 봤을 때는 IsDebuggerPresent가 아닌, NtQueryInformationProcess() 함수를 호출하였는데 뭘까?


NtQueryInformationProcess를 보면 향후에 대체되거나 사용할 수 없을 것이라고 말하고 있다.

이래서 아마 IsDebuggerPresent를 호출하도록 바뀐 것 같은데... 확인은 못해봤다.


내부에서 호출하는 안티디버깅 API 함수가 다르더라도 당황하지 말자.


[우회 방법]

1) 호출 후 CheckRemoteDebuggerPresent 함수의 두번째 인자 PBOOL 값을 0으로 바꿔준다.

2) CheckRemoteDebuggerPresent 내부의 안티디버깅 API 함수를 우회한다.

(NtQueryInformationProcess or IsDebuggerPresent


반응형