Reversing/Anti-Debugging 6

[Dynamic 안티디버깅] Assembly instructions

'Anti-Debug Assembly instructions' 설명 CPU가 특정 명령을 실행할 때 디버거가 작동하는 방식에 따라 디버거의 존재를 탐지하는 방법 1. INT 3 2. INT 2D 3. DegubBreak 4. INT1 5. Stack Segment Register 6. POPF and Trap Flag 7. PREFIX REP INT 3 INT3은 소프트웨어 브레이크 포인트로 사용되며 INT3이 호출되면 EXCEPTION_BREAKPOINT (0x80000003)가 발생하고 예외 처리기가 호출된다. 일반적인 실행 인 경우 예외가 발생되면 예외 처리기에 의해 제어되지만 디버깅중일 경우는 예외처리를 디버거가 받기 때문에 예외 처리기가 실행되지 않은 상태에서 코드가 실행되는 것을 이용 주로 S..

[static 안티디버깅] BlockInput()

' BlockInput() ' 설명 키보드 및 마우스 입력 이벤트가 애플리케이션에 도달하지 못하도록 차단합니다. 함수 원형 BOOL BlockInput( [in] BOOL fBlockIt ); fBlockIt : 이 매개 변수가 TRUE이면 키보드 및 마우스 입력 이벤트가 차단됩니다. 이 매개 변수가 FALSE이면 키보드 및 마우스 이벤트가 차단 해제됩니다. 디버깅 중 BlockInput(True); 함수가 호출되면 키보드와 마우스 이벤트 동작이 먹통이 되므로 다른 안티디버깅 루틴 처럼 디버깅 여부를 탐지 해내기 보다는 분석을 하는 행위에 직접적으로 방해를 주는 안티디버깅 기술 이다. 내부적으로 NtUserBlockInput() 를 호출 하여 키보드 , 마우스 이벤트 동작을 차단한다. CODE #incl..

[static 안티디버깅] NtSetInformationThread()

' NtSetInformationThread() ' 설명 스레드의 우선 순위를 설정합니다. 함수 원형 NtSetInformationThread는 ZwSetInformationThread 의 wrapper function이며, ring3 에서는 두 함수의 기능이 동일 하다. NtSetInformationThread 2번째 파라미터에 ThreadHideFromDebugger를 전달 할 경우 첫번쨰 인자로 전달되는 ThreadHandle 과 디버거의 연결을 해제 (Dettach) 한다. ThreadInformationClass는 enum (열거형)으로써 다음과 같다. typedef enum _THREAD_INFORMATION_CLASS { ThreadBasicInformation, ThreadTimes, Th..

[static 안티디버깅] NtQueryInformationProcess()

' NtQueryInformationProcess() ' 설명 지정된 프로세스에 대한 정보를 검색합니다. 함수 원형 NtQueryInformationProcess는 ZwQueryInformationProcess 의 wrapper function이며, ring3 에서는 두 함수의 기능이 동일 하다. ntdll 라이브러리는 중요한 함수이므로 직접 호출을 하지않고 간접 호출을 한다. 2번쨰 파라미터인 ProcessInformationClass 에서 ProcessDebugPort (0x07), ProcessDebugObjectHandle (0x1E),ProcessDebugFlags (0x1F) 정보 유형을 가져와서 디버깅 중인지 여부를 체크 할 수 있다. ProcessInformationClass는 enum (..

[static 안티디버깅] CheckRemoteDebuggerPresent()

' CheckRemoteDebuggerPresent() ' 설명 지정된 프로세스가 디버그되고 있는지 여부를 확인합니다. 반환값 함수가 성공하면 반환 값이 0이 아닙니다. 함수가 실패하면 반환 값은 0입니다. 함수 원형 BOOL CheckRemoteDebuggerPresent( [in] HANDLE hProcess, [in, out] PBOOL pbDebuggerPresent ); hProcess : 디버깅 중 인지 체크할 프로세스 핸들 pbDebuggerPresent : 함수 리턴 값이 저장될 변수 bool 형 현재 자신 프로세스를 디버깅 여부를 체크하기 위해선 다음과 같은 코드를 작성해 볼 수 있다. CODE #include #include void anti() { BOOL DebugCheck; Che..

[static 안티디버깅] IsDebuggerPresent

' IsDebuggerPresent ' 설명 호출 프로세스가 사용자 모드 디버거에 의해 디버깅되는지 여부를 확인합니다. 반환값 현재 프로세스가 디버거의 컨텍스트에서 실행 중인 경우 반환 값은 0이 아닌 값입니다. 현재 프로세스가 디버거의 컨텍스트에서 실행되고 있지 않으면 반환 값은 0입니다. CODE #include #include void anti() { if (IsDebuggerPresent()) { MessageBox(NULL, "Detect", "", MB_OK); } } int main() { anti(); return 0; } Disassemble IsDebuggerPresent() 함수의 반환 값으로 현재 프로세스가 디버깅 중인지 eax 구분을 하여 분기를 일으킨다. IsDebuggerPre..