NOTE:
Các cách phát hiện software breakpoint trong file thực thi sẽ vô dụng khi gặp hardware breakpoint (trong thanh ghi).
Debugger cho phép step-over function call (button F8). Thông thường debugger sẽ set software breakpoint (0xCC).
Để phát hiện khi step over qua hàm, ta có thể xem xét byte đầu tiên của câu lệnh ngay lệnh call một function, xem có bị set breakpoint không.
Hoặc trap tại entrypoint của file.
Check bên trong hàm, sử dụng _ReturnAddress để lấy địa chỉ trả về ngay sau của hàm đang được thực thi. Nếu byte đó có giá trị băng với software breakpoint (0xCC), ta có thể sửa lại byte đó.
Ý tưởng tương tự, nhưng sử dụng Windows API
Cho phép đọc bộ nhớ của các tiến trình khác
Cũng là để patch lại file, nhưng đọc file thực thi
Sử dụng guard page trong bộ nhớ (page này được bảo vệ bởi OS). Nếu page này bị truy cập lần đầu, nó sẽ raise STATUSGUARDVIOLATION exception.
Guard page được tạo bằng cách sử dụng PAGE_GUARD memory protection option khi sử dụng API VirtualProtect.
hardware breapoint trong các thanh ghi DR0 -> DR3, có thể được lấy từ thread context. Nếu các giá trị này khác không, tức là hardware bp đã được set.
Hook GetCurrentThread và chỉnh giá trị của dr0->dr3
Memory page của bộ nhớ tiến trình, code section là vùng nhớ chia sẻ giữa các processes cho đến khi page này được ghi đè. Ngược lại, khi OS tạo một bản copy của page nhớ này và map vào vùng nhớ ảo (process virtual mem) thì mem page này không còn được chia sẻ nữa.
Quá trình Copy-on-write diễn ra khi debugger set software breakpoint vào code section.
Do đó, ta có thể truy vấn Working Set của tiến trình hiện tại và kiểm tra trường Shared và ShareCount. Nếu software breakpoint được set trong code section, 2 trường này sẽ không được set.
Hàm này được gọi khi một debugger attach vào môt tiến trình đang chạy.
Ta có thể ngăn debugger attach vào bằng cách xóa breakpoint bên trong ntdll!DbgBreakPoint(). Do đó, debugger không thể can thiệp và thread sẽ bị thoát.
Khi debugger gọi kernel32!DebugActiveProcess, ntdll!DbgUiRemoteBreakin cũng được gọi tương ứng. Để ngăn debugger attach tới tiến trình, ta sẽ patch DbgUiRemoteBreakin gọi tới kernel32!TerminateProcess.
windows-internal
anti-debug
rev