Tôi không thực sự hiểu làm thế nào để có được xung quanh IsDebuggerPresent. Tôi nghĩ rằng tôi có nghĩa vụ phải tìm các thanh ghi được sử dụng để gỡ lỗi và sau đó đặt nó 0 để lừa IsDebuggerPresent, nhưng tôi không biết làm thế nào để làm điều đó. Tôi đã thử tìm kiếm trên Google và thậm chí đã thử một vài giải pháp nhưng nó không thực sự hiệu quả với tôi. Ai đó có thể vui lòng giải thích cho tôi như thế nào điều này sẽ làm việc và làm thế nào tôi có thể bỏ qua điều này?Làm cách nào để bỏ qua IsDebuggerPresent với OllyDbg?
Trả lời
Có nhiều cách để thực hiện. Như bạn đã nói, có thể vá khối chuỗi của chương trình. Đây là một hướng dẫn, làm thế nào để có được xung quanh IsDebuggerPresent, bằng cách đơn giản vá chức năng này vì vậy nó luôn luôn trả về 0.
1) xác định vị trí IsDebuggerPresent
Trong trường hợp của tôi, nó là 7664EFF7, và bao gồm chỉ có ba hướng dẫn + một RET. Nó đọc khối chuỗi (địa chỉ là FS: 18), và sau đó xác định vị trí byte nói rằng "tôi đang được gỡ rối" và trả về nó. Giá trị trả về được lưu trữ trong EAX (như đối với hầu hết các hàm WINAPI). Nếu tôi sửa đổi hàm để cuối cùng nó sẽ có EAX = 0, tôi sẽ bỏ qua thành công IsDebuggerPresent.
2) vá nó
Bây giờ là cách dễ nhất để làm điều đó là để chỉ cần thực hiện các chức năng đơn giản làm một hướng dẫn MOV EAX, 0
và sau đó một RETN
:
Lưu ý rằng tôi cũng đầy phần còn lại của hàm với NOP để tránh thay đổi kích thước của nó. Có thể không cần thiết, bạn cũng có thể chỉ cần MOV EAX, 0
và sau đó chỉ cần RETN
.
Bạn cũng nên biết rằng sửa đổi chỉ hợp lệ cho một lần chạy chương trình. Khi bạn khởi động lại nó, nó sẽ tải một bản sao mới của kernel32.dll (nơi IsDebuggerPresent nằm) với chức năng ban đầu, và bạn sẽ phải áp dụng các bản vá một lần nữa. Nếu bạn muốn tạo bản vá vĩnh viễn, bạn cần sửa đổi nhị phân khởi chạy và sửa đổi/xóa số gọi thành chức năng này. Nhưng trước khi bạn làm điều đó bạn cũng cần phải chắc chắn rằng các nhị phân không kiểm tra bản thân để sửa đổi.
Có cách nào để tìm kiếm mã cho "FS" không? Ngoài ra, tôi thấy nhiều trường hợp của IsDebuggerPresent ... Trên thực tế, tôi thậm chí không thực sự chắc chắn làm thế nào tôi có thể tìm thấy 'FS' và đúng nơi để loại bỏ nó. Ở khắp mọi nơi, tôi thấy 'MOV DWORD PTR', ví dụ: 'MOV DWORD PTR FS: [0], EAX' và' MOV EAX, DWORD PTR DS: [13000] ' – Strawberry
Tôi chỉ tìm thấy nó bằng cách làm theo các cuộc gọi hàm. Ngoài ra, tôi hiểu rằng IsDebuggerPresent thường được sử dụng để thêm rác để mess mỗi suy nghĩ lên. Tôi có nên lưu nó sau khi thay đổi 'EAX = 0' và sau đó mở lại nó, vì vậy nó không tải rác? Tôi không thực sự chắc chắn nó hoạt động như thế nào, xin lỗi! – Strawberry
Chỉ nên có một nơi, trong đó IsDebuggerPresent được định nghĩa, đó là bên trong kernel32.dll. Có thể có nhiều * cuộc gọi * với nó, nhưng nếu bạn vá bản thân chức năng, tất cả các cuộc gọi sẽ nhận được "0" như một phản hồi. Bạn nên áp dụng các bản vá trước khi bạn chạy chương trình, và bạn cần phải áp dụng nó mỗi lần bạn trước khi bạn chạy nó. – kuba
Tiêm mã này trong quá trình của bạn:
mov eax,dword ptr fs:[18]
mov eax,dword ptr ds:[eax+30]
mov byte ptr ds:[eax+2],0
này sẽ vá các PEB.BeingDebugged
flag, đảm bảo IsDebuggerPresent
luôn trả 0
Khi sử dụng x64dbg bạn có thể chạy lệnh dbh
.
nếu bạn muốn ứng dụng của bạn không bao giờ kiểm tra xem nó làm điều này:
- Nhấn
Alt + e
hoặc mởExecutable modules
cửa sổ. - Chọn
C:\WINDOWS\system32\kernel32.dll
và nhấnctrl + N
- chọn
IsDebuggerPresent
và nhấn enter. - nhấn
f2
- chạy chương trình và đợi chương trình của bạn ngắt mã op này.
- nhấn một số
f8
cho đến khi quay lại mã của bạn. - nhìn lên một cái gì đó giống như
TEST EAX,EAX
và sau một số điều nhưje
jnz
và vv, hãy cẩn thận đầu ra củaIsDebuggerPresent
được lưu trongEAX
. - nếu nhảy xảy ra trên mã op này thay đổi nó thành
nop
và nếu không xảy ra, hãy thay đổi thànhjmp
. - lưu chương trình của bạn. nếu bạn không biết làm thế nào để lưu mã modifed trong ollyDBG chỉ cần tìm kiếm nó.
bạn đã thử các plugin bổ sung như [Hide Debugger] (https://tuts4you.com/download.php?view.57) hoặc [Olly Advanced] (https://tuts4you.com/download.php? xem.75)? chúng dễ sử dụng hơn thay vì tự sửa đổi mã mỗi lần. – Arash