-
안티디버깅 기법 - CheckRemoteDebuggerPresent()> Information Security/Windows 2012. 5. 20. 00:26
안티디버깅 기법 - CheckRemoteDebuggerPresent()
CheckRemoteDebuggerPresent()는 IsDebuggerPresent()와 비슷하고,
WindowsNT버전에서만 가능하다. (XP이상)
따라서, 이 함수 내부에서는
NtQueryInformationProcess()라는 API함수를 호출하고,
EPROCESS라는 구조체 커널구조체에서 Debugport값을 검사한다.
또한, 디버거가 선택된 프로세스내에서 보여지는지에 대한 여부는
TRUE와 FALSE값으로 나타내어진다.
먼저, CheckRemoteDebuggerPresent()함수는
한글로 표현하면
'원격으로 디버거가 보여지는지를 체크' 한다는 말이다.
즉, 자신 이외의 다른 프로세서가 디버깅을 당하는 지를 알 수 있는 API함수라고 할 수 있겠다.
이 함수의 원형은
BOOL CheckRemoteDebuggerPresent(
HANDLE hProcess,
PBOOL pbDebuggerPresent
);로 되어있으며 한가지 예를 들어보겠다.
다음은 OpenRCE.com에 업로드되어있는 파일이다.
CheckRemoteDebuggerPresent.exe
CheckRemoteDebuggerPresent.obj
이 파일의 코드는 다음과 같다.
#define _WIN32_WINNT
#include <stdio.h>
#include <windows.h>
int main()
{
BOOL bDebugged = FALSE;
while(1)
{
Sleep(1000);
CheckRemoteDebuggerPresent( GetCurrentProcess(), &bDebugged );
if(bDebugged)
printf("It is Debugged!\n");
else
printf("Debugger not found!\n");
}
return 0 ;
}이 파일을 실행해보면 디버거를 찾을 수 없다고 나타나는데,
만일 디버깅 된 상태라고 했을 때
이를 우회하는 방법은
인자 bDebugged의 값을 0으로 설정해 주거나,
JMP문을 이용하여 무조건 정상쪽으로 분기하도록 수정해주는 방법이있다.
우회하는 방법의 어셈블리어 코드는 다음과같다.
.386
.model flat, stdcall
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
DbgNotFoundTitle db "Debugger status:",0h
DbgFoundTitle db "Debugger status:",0h
DbgNotFoundText db "Debugger not found!",0h
DbgFoundText db "Debugger found!",0h
krnl db "kernel32.dll",0h
chkrdbg db "CheckRemoteDebuggerPresent",0h
.data?
IsItPresent dd ?
.code
start:
; MASM32 antiRing3Debugger 의 예.
; coded by ap0x (출처)
; Reversing Labs: http://ap0x.headcoders.net; GetProcAddress를 통해 함수 호출
PUSH offset krnl ;kernel32.dll
CALL LoadLibrary
PUSH offset chkrdbg ;CheckRemoteDebuggerPresent
PUSH EAX
CALL GetProcAddress
; IsItPresent는 결과값을 저장할 것.
PUSH offset IsItPresent
PUSH -1
CALL EAX
MOV EAX,DWORD PTR[IsItPresent]
TEST EAX,EAX
JNE @DebuggerDetected
PUSH 40h
PUSH offset DbgNotFoundTitle
PUSH offset DbgNotFoundText
PUSH 0
CALL MessageBox
JMP @exit
@DebuggerDetected:
PUSH 30h
PUSH offset DbgFoundTitle
PUSH offset DbgFoundText
PUSH 0
CALL MessageBox
@exit:
PUSH 0
CALL ExitProcess
end start-출처 : OpenRCE : http://www.openrce.org
W.H : http://blog.naver.com/aaaa875,
hacker dakuo : http://dakuo.tistory.com
728x90반응형'> Information Security > Windows' 카테고리의 다른 글
악성코드 탐지 - 툴 사용법 (0) 2014.05.30 Stealth (프로세스 은폐기법) (2) 2012.06.11 API Code Patch (0) 2012.06.11 안티디버깅 - IsDebuggerPresent (3) 2012.04.11 안티디버깅(Anti Debugging) (0) 2012.04.11