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)
'취약점 분석 > 안티 리버싱' 카테고리의 다른 글
NtQueryInformationProcess - ProcessDebugObjectHandle 우회방법 (0) | 2019.02.27 |
---|---|
NtQueryInformationProcess - ProessDebugPort 우회방법 (0) | 2019.02.27 |
NtQueryInformationProcess - NoDebugInherit 우회방법 (0) | 2019.02.27 |
안티 리버싱 - BP를 찾자. (0) | 2019.02.26 |
SeDebugPrivilege, 우회방법 (0) | 2019.02.26 |