Kiểm tra kernel objects handles để phát hiện.
Một process mặc định không bị debug sẽ không có quyền SeDebugPrivilege
trong access token của nó. Tuy nhiên, quyền SeDebugPrivilege
sẽ được bật bởi trình debugger như OllyDbg hay WinDbg.
Do đó, nếu process có thể mở tiến trình csrss.exe, cũng tức là có quyền SeDebugPrivilege
trong access token, hay prcess đó đang bị debug.
Với tham số là PID của tiến trình csrss.exe.
NOTE: Chỉ thành công khi chạy dưới quyền của nhóm administrators và debug privileges.
Gọi NtClose hay CloseHandle với một handle không hợp lệ để tạo một exception EXCEPTION_INVALID_HANDLE (0xC0000008). Nếu luồng được truyền cho exception handler, chứng tỏ rằng tiến trình đang bị debug.
tương tự như OpenFile. Khi một file được load sử dụng kernel32!LoadLibrary (ntdll!LdrLoadDll). Handle của loaded file sẽ được mở và lưu trong LOAD_DLL_DEBUG_INFO struct. Nếu handle này không được close bởi debbuger, file này sẽ không thể open.
Ta sẽ load file bất kỳ sử dụng LoadLibrary và cố găng mở file sử dụng CreateFile. Nếu CreateFile lỗi -> có sự hiện diện của debugger.
Khi debugging session bắt đầu, một kernel object được gọi là "debug object" được tạo ra, và một handle tương ứng với object đó.
Sử dụng ntdll!NtQueryObject để truy vấn đến list các objects tồn tại, và kiểm tra số lượng handles tương ứng với debug object tồn tại.
Trace đến hàm check:
Hook các hàm và thay đổi giá trị trả về:
LoadLibrary quite hard to bypass :<
Khi xảy ra exception và không có Exception Handlers (cả Structured lẫn Vectored). Hàm UnhandledExceptionFilter sẽ được gọi.
Có thể đăng ký một custom unhandled exception filter dùng kernel32!SetUnhandledExceptionFilter(). Nhưng nếu chương trình chạy dưởi một debugger, custom filter sẽ không được gọi và exception được truyền tiếp cho debugger.
Các exception như DBC_CONTROL_C (0x40010005) hay DBG_RIPEVENT (0x40010007) không được chuyển tiếp đến exception handlers của tiến trình hiện tại mà được xử lí bởi debugger.
Sử dụng kernel32!RaiseException để ép xảy ra một exception cụ thể.
Nếu exception handle không được gội -> có sự tồn tại của debugger.
Tạo một exception handler (structured hay vectored), raise exception và handler tương ứng sẽ tới gọi tới khác.
windows-internal
rev
anti-debug