|
A. IsDebuggerPresent
The first anti-debugging method that most new reverse
engineers discover is the Microsoft API call,
IsDebuggerPresent.
이 메소드는 대부분의 초보리버서들이 처음 발견하는 안티 디버깅 메소드이다.(Microsoft API 임..)
This function call analyses the running
process environment block (PEB) and looks at the
DebuggerPresent flag.
이 메소드는 실행중인 PEB(Process Environment Block)와 DebuggerPresent flag를 참조하여 디버깅 여부를 분석한다.
The function returns the value located
at this flag.
이 메소드는 DeguggerPresent flag에 위치해 있는 값을 리턴한다.
If the return value is zero, there is no debugger
present; however, if the value returned is non-zero, a debugger
is attached to our process.
0을 리턴한다면, 디버거가 존재하지 않는 다는 것이고, 0이 아닌 다른 값을 리턴한다면, 우리프로세스에 디버거가 붙어 있다는 것을 의미한다.
if (IsDebuggerPresent()) {
MessageBox(NULL, L"Debugger Detected Via
IsDebuggerPresent", L"Debugger Detected", MB_OK);
} else {
MessageBox(NULL, L"No Debugger Detected", L"No
Debugger", MB_OK);
}
Appendix: isDebuggerPresent.sln
B. CheckRemoteDebuggerPresent
Conceptually similar to the IsDebuggerPresent method,
개념상 IsDebuggerPresent 메소드랑 비슷하다.
the CheckRemoteDebuggerPresent function checks the PEB
block of the target process for the BeingDebugged flag.
CheckRemoteDebuggerPresent 메소드는 타겟 프로세스의 PEB 블럭값들 중 BeingDebugged 플래그값을 검사한다.
The
CheckRemoteDebuggerPresent API call takes two parameters,
the first of which is a handle to the target process, and the
second being the return value indicating if the target process
has a debugger attached.
CheckRemoteDebuggerPresent API는 2개의 파라메터들을 갖는다. 첫번째 파라메터는 타겟 프로세스의 핸들이고, 두번째 파라메터는 타겟 프로세스가 디버거가 달라 붙어 있는지에 대한 여부를 받아오기 위한 변수이다.
This API call requires Windows XP
service pack one or later to be installed.
이 API는 윈도우XP 서비스팩 1 이상이 설치 되있어야 한다.
CheckRemoteDebuggerPresent(GetCurrentProcess(),
&pbIsPresent);
if (pbIsPresent) {
MessageBox(NULL, L"Debugger Detected Via
CheckRemoteDebuggerPresent", L"Debugger Detected",
MB_OK);
} else {
MessageBox(NULL, L"No Debugger Detected", L"No
Debugger", MB_OK);
}
Appendix: CheckRemoteDebuggerPresent.sln
C. OutputDebugString
The OutputDebugString anti-debugging method requires
Microsoft Windows 2000 or newer to operate.
OutputDebugString 안티티버깅 메소드는 마이크로소프트 윈도우 2000이상의 버전에서 사용가능하다.
The OutputDebugString function is sensitive to whether a
debugger is attached to the running process and will return an
error code if our process is not currently running under a
debugger.
OutputDebugString 메소드는 실행중인 프로세스에 디버거가 달라 붙어 있는지 아닌지에 대해 민감하다. 그리고 우리의 프로세스가 현재 디버거모드로 돌아가고 있지 않다면, 에러코드를 리턴할 것이다.
To detect the presence of a debugger we can make a
call to SetLastError() with an arbitrary value, followed by a
call to OutputDebugString(). If the arbitrary value remains
when we check GetLastError() then we know that the
OutputDebugString() was successful and the process is being
debugged.
디버거의 존재 여부를 탐지하기 위해, 우리는 임의의 값으로 SetLastError() 함수를 설정할 수 있다. 그리고 그 뒤에는 OutputDebugString() 함수가 뒤따른다. GetLastError() 함수를 호출 했을 때, 임의로 설정한 값이 남아있다면, 우리는 OutputDebugString() 함수가 성공적이었고 해당 프로세스는 디버깅 상태라는 것을 알수 있다.
DWORD Val = 666;
SetLastError(Val);
OutputDebugString(L"anything");
if (GetLastError() == Val) {
MessageBox(NULL, L"Debugger Detected Via
OutputDebugString", L"Debugger Detected", MB_OK);
} else {
MessageBox(NULL, L"No Debugger Detected", L"No
Debugger Detected", MB_OK);
}
Appendix: OutputDebugString.sln
D. FindWindow
The FindWindow detection method is different in that it
does not specifically detect the presence of a debugger
attached to our process;
FindWindow 탐지 메소드는 기타 다른 디버거 탐지하는 메소드들과는 다른 메소드이다.
instead it retrieves a handle to the toplevel
window whose class name matches a specified string.
대신, 이 메소드는 탑레벨 윈도우 클래스이름으로 해당 윈도우의 핸들을 얻을 수 있다.
The common debuggers can be checked for by executing
FindWindow with their class name as the parameter.
유명한 디버거들은 FindWinodw에 해당 디버거 클래스이름을 파라메터로 넘겨서 찾아 낼 수 있다.
The debugger WinDbg can be detected by calling FindWindow
with a class name parameter of “WinDbgFrameClass”.
WinDbg 같은 경우 FindWindow 클래스이름에 "WinDbgFrameClass"라고 파라메터를 설정하고 FindWindow를 호출하면 WinDbg를 감지해 낼수 있다.
In the code example below, a FindWindow call is made passing the
string OLLYDBG, and the return handle is evaluated.
아래 있는 예제 코드에서, FindWindow에 "OLLYDBG"를 인자값으로 주어 호출하면, 해당 리턴 값으로 디버거 존재여부를 알아 낼수 있다.
Appendix: FindWindow.sln
E. Registry Key
Searching through the registry is another method we can
used to detect the presence of a debugger.
레지스트리를 통한 검색이 디버거 존재여부를 탐지하는 또다른 방법으로 이용될 수 있다.
This method does not detect the attaching of a debugger to a target process, nor
does it even indicate that a particular debugger is running.
이 방법은 타겟 프로세스에 디버거가 달라 붙어 있는지 탐지 할 수 없으며, 심지어 디버거가 실행중인지도 알아낼 수 없다.
Instead this method simply indicates to the program that
debugger is installed on the system.
대신, 이방법으로 간단하게 시스템에 디버거가 설치되어있는지 알아낼수 있다.
Since this technique has
limited effectiveness,
one should only use it as a supporting
piece of information when deciding how to act upon other,
more definitive detection mechanisms. There are three registry
keys that can be used to indicate the installation of a debugger
on the system. If either of the first two keys exists, OllyDbg
has been configured as a shell extension to open target files by
right clicking them.
HKEY_CLASSES_ROOT\dllfile\shell\Open with
Olly&Dbg\command
HKEY_CLASSES_ROOT\exefile\shell\Open with
Olly&Dbg\command
If the final key has been set, the value of the Debugger
name/value pair represents the debugger that has been
configured as the just in time debugger for the system. In the
event of a program crash, this is the debugger that will be
called. Visual studio is represented as vsjitdebugger.exe while
OllyDbg will be OLLYDBG.EXE.
API BASED ANTI-DEBUGGING
A. IsDebuggerPresent
B. CheckRemoteDebuggerPresent
C. OutputDebugString
D. FindWindow
E. Registry Key
F. NtQueryInformationProcess (ProcessDebugPort)
H. NtSetInformationThread Debugger Detaching
I. Self Debugging with DebugActiveProcess
J. NtQueryInformationProcess (ProcessDebugObjectHandle)
K. OllyDbg OutputDebugString() Format String
L. SeDebugPrivilege OpenProcess
M. OllyDbg OpenProcess String Detection
N. OllyDbg Filename Format String
DIRECT PROCESS AND THREAD BLOCK DETECTIONS
A. IsDebuggerPresent Direct PEB
B. IsDebuggerPresent Set/Check
C. NtGlobalFlag
D. Vista TEB System DLL Pointer
E. PEB ProcessHeap Flag Debugger
F. LDR_Module
HARDWARE AND REGISTER BASED DETECTION
A. Hardware Breakpoints
B. VMware LDT Register Detection
C. VMware STR Register Detection
TIMING BASED DETECTIONS
A. RDTSC
B. NTQueryPerformanceCounter
C. GetTickCount
D. timeGetTime
MODIFIED CODE DETECTION
A. CRC Checking
EXCEPTION BASED DETECTION
A. INT 3 Exception (0XCC)
B. INT 2D (Kernel Debugger Interrupt)
C. ICE Breakpoint
D. Single Step Detection
E. Unhandled Exception Filter
F. CloseHandle
G. Control-C Vectored Exception
H. Prefix Handling
I. CMPXCHG8B and LOCK
J. OllyDbg Memory Breakpoint
K. VMware Magic Port