2012-04-10 12 views
15

Tại sao mã lắp ráp sau đây là công cụ chống gỡ lỗi?Tại sao mã này cho phép tôi phát hiện trình gỡ lỗi?

l1: 
call l3 
l2: 
;some code 
l3: 
mov al, 0c3h 
mov edi, offset l3 
or ecx, -1 
rep stosb 

Tôi biết rằng C3hRETN và tôi biết rằng stobs viết giá trị trong al như opcode theo bù đắp trong edi và nó được thực hiện cho ecx lần vì rep.

Tôi cũng biết thực tế là stobsstosw sẽ chạy nếu chúng được tìm nạp trước trên kiến ​​trúc intel làm định dạng ban đầu của chúng.

Nếu chúng tôi chạy chương trình ở chế độ gỡ lỗi, việc tìm nạp trước không liên quan và nhãn l2 sẽ chạy (vì nó là một bước), nếu không có trình gỡ lỗi, nó sẽ là ping-pong giữa l1 và l3 am I đúng?

+1

Nó vẫn không phụ thuộc vào việc nó được đặt thành một bước không? Bởi vì tôi thành thật không thể thấy tại sao trình gỡ lỗi sẽ vấp phải điều này. Quy tắc có phần khác nhau trong một bước. – 0xC0000022L

+0

http://stackoverflow.com/questions/12633599/anti-debug-using-prefetch-queue-doesnt-work-with-my-cpu – 0x90

Trả lời

13

Khi hàng đợi tìm nạp trước chương trình được gỡ lỗi (tức là một bước) được xóa ở mỗi bước (khi xảy ra gián đoạn). Tuy nhiên, khi được thực hiện bình thường, điều đó sẽ không xảy ra với rep stosb. Các bộ xử lý cũ hơn đã không xóa nó ngay cả khi có bộ nhớ ghi vào vùng lưu trữ, để hỗ trợ mã tự sửa đổi đã được thay đổi trừ rep movsrep stosb. (IIRC nó cuối cùng đã được cố định trong bộ vi xử lý i7.)

Đó là lý do tại sao nếu có một chương trình gỡ rối (bước duy nhất) mã sẽ thực hiện một cách chính xác và khi rep stosb được thay thế bằng retl2 sẽ được thực thi. Khi không có trình gỡ lỗi rep stosb sẽ tiếp tục, vì ecx là lớn nhất có thể nó cuối cùng sẽ viết ở đâu đó mà nó không phải viết và một ngoại lệ sẽ xảy ra.

Kỹ thuật chống gỡ lỗi này được mô tả trong this paper.

+1

cảm ơn liên kết! –

+2

Tất cả các con đường dẫn đến Peter Ferrie ... – Leigh

2

Điều duy nhất mà trình gỡ lỗi thực hiện ở đây là thêm thời gian trễ. Đó có thể là chìa khóa để làm thế nào điều này hoạt động. Sách hướng dẫn của Intel (và tôi giả định AMD) nói rõ ràng rằng mã tự sửa đổi không phải là gauranteed "để làm việc" trừ khi chương trình báo hiệu CPU rằng dòng bộ nhớ cache tiếp theo lệnh đã sửa đổi đã thay đổi. Điều này là làm cho logic prefetch rẻ; các nhà thiết kế chip không muốn có phần cứng kiểm tra liên tục rằng mỗi byte của một đường dẫn bộ nhớ vẫn còn hợp lệ.

Vì vậy, tôi cho rằng những gì xảy ra với các bộ dò lỗi là cuộc gọi l1 L3, mà các cửa hàng trở lại sau khi STOSB đại diện, và sự trở lại được thực hiện becaued của sự chậm trễ dài gây ra bởi các trình gỡ lỗi trong bước duy nhất, buộc cachecline containng l3 để được nạp lại sau khi thay đổi.

Nếu không có trình gỡ lỗi, tôi đoán hướng dẫn (không được hiển thị) sau khi stosb được thực thi. Nếu nó là một bước nhảy tới "không có trình sửa lỗi" thì thành công của bước nhảy sẽ chứng minh rằng không có trình gỡ lỗi một bước nào đang được sử dụng.

Nếu tôi tìm thấy mã này trong một ứng dụng, tôi sẽ từ chối chạy nó.