zDiv
Super Moderator
-
12/02/2014
-
21
-
12 bài viết
RE6: AntiDebug
I. Giới thiệu về AntiDebug
1. AntiDebug là gì?
AntiDebug là các kỹ thuật được sử dụng để vô hiệu hóa các Debugger, nhằm mục đích gây khó khăn cho công việc Reverse, làm tiêu tốn nhiều thời gian hơn khi thực hiện phân tích một mẫu.
Các AntiDebug có thể tác động đến một số Debugger như OllyDBG, SoftICE hay các công cụ phân tích tĩnh như IDA.
2. Một số AntiDebug
a. Làm rối code
Một biện pháp đơn giản nhất được sử dụng để AntiDebug đó là làm rối code. Cách này được sử dụng để chống lại cả các Debugger và các Disassembler.
Có thể thay đổi tên các hàm, các biến thành những cái tên tối nghĩa hoặc tên được sinh ra ngẫu nhiên. Sử dụng nhiều lệnh jump tạo thành những vòng luẩn quẩn. Mã hóa các chuỗi được sử dụng.
Tất cả những biện pháp trên khiến công việc đọc đoạn code sau khi disassembly trở nên khó khăn hơn rất nhiều.
b. Mã hóa code
Biện pháp biển đổi code ở mức độ cao hơn đó là mã hóa code và sau đó giải mã rồi thực thi trong quá trình chạy chương trình. Ta chỉ có thể đọc được đoạn code thực sự thực thi công việc cụ thể khi sử dụng các debugger và đọc trong quá trình chương trình thực thi.
Kỹ thuật này thường được sử dụng bởi virus và malware.
c. Nhận diện Debugger
Một kỹ thuật AntiDebug khác đó là sử dụng các biện pháp mà hệ điều hành kiểm soát quá trình debug. Bao gồm việc sử dụng các API cung cấp thông tin về một chương trình có bị debug hay không, kiểm tra các breakpoint được đặt trong đoạn code thực thi, loại bỏ các hardware breakpoint và sử dụng các lỗi đã biết của debugger để gây crash.
Sau đây bài viết sẽ đề cập đến 1 AntiDebug cụ thể, đó là kỹ thuật Anti-Debug sử dụng IsDebuggerPresent.
II. IsDebuggerPresent – AntiDebug
Ở đây ta cùng tìm hiểu mẫu Crackme1 của Ty123
Link
Đầu tiên ta thử mở file .exe với Olly và run.
Kết quả thu được như sau:
Tiến trình đã bị terminated.
Như đã giới thiệu ở trên ta sẽ tìm hiểu về AntiDebug IsDebuggerPresent, vậy ta cùng tìm hàm IsDebuggerPresent được gọi đến trong chương trình Crackme1.exe
Ta Search all Name (label) in current module
Tiếp đó tìm kiếm IsDebuggerPresent. Và kết quả như sau:
Lựa chọn IsDebuggerPresent và ấn Enter, kết quả ta có được vị trí lời gọi hàm API IsDebuggerPresent.
Đặt breakpoint tại vị trí trên.
Chạy lại chương trình, và nhảy qua lệnh gọi hàm.
Chú ý giá trị của EAX.
Và bây giờ cùng tìm hiểu xem hàm IsDebuggerPresent trả về các giá trị mang ý nghĩa như thế nào.
Sau khi tham khảo tại đây thì ta biết được, hàm IsDebuggerPresent sẽ trả về giá trị 0 nếu như chương trình đang không bị debug, và ngược lại, trả về giá trị khác 0 nếu chương trình đang bị debug.
Như vậy ta cần sửa giá trị EAX = 0 để chương trình hiểu rằng nó đang không bị debug.
Sau khi sửa và F9, ta có kết quả như sau:
Chương trình đã chạy bình thường.
Như vậy, ta đã biết 1 cách để vượt qua IsDebuggerPresent AntiDebug.
Tìm hiểu sâu hơn vào hàm IsDebuggerPresent, ta thấy nó sẽ kiểm tra byte BeingDebugged trong PEB. link
Từ đó ta có thể có một cách khác để vượt qua AntiDebug này mà không cần phải chỉnh sửa giá trị trả về của hàm IsDebuggerPresent tại mỗi lần gọi hàm. Đó là sửa byte offset+2 trong PEB structure.
Ta có thể sử dụng Plugin của Olly để thực hiện tự động công việc này. Có thể tham khảo việc sử dụng Hide Debugger hoặc IsDebuggerPresent.
1. AntiDebug là gì?
AntiDebug là các kỹ thuật được sử dụng để vô hiệu hóa các Debugger, nhằm mục đích gây khó khăn cho công việc Reverse, làm tiêu tốn nhiều thời gian hơn khi thực hiện phân tích một mẫu.
Các AntiDebug có thể tác động đến một số Debugger như OllyDBG, SoftICE hay các công cụ phân tích tĩnh như IDA.
2. Một số AntiDebug
a. Làm rối code
Một biện pháp đơn giản nhất được sử dụng để AntiDebug đó là làm rối code. Cách này được sử dụng để chống lại cả các Debugger và các Disassembler.
Có thể thay đổi tên các hàm, các biến thành những cái tên tối nghĩa hoặc tên được sinh ra ngẫu nhiên. Sử dụng nhiều lệnh jump tạo thành những vòng luẩn quẩn. Mã hóa các chuỗi được sử dụng.
Tất cả những biện pháp trên khiến công việc đọc đoạn code sau khi disassembly trở nên khó khăn hơn rất nhiều.
b. Mã hóa code
Biện pháp biển đổi code ở mức độ cao hơn đó là mã hóa code và sau đó giải mã rồi thực thi trong quá trình chạy chương trình. Ta chỉ có thể đọc được đoạn code thực sự thực thi công việc cụ thể khi sử dụng các debugger và đọc trong quá trình chương trình thực thi.
Kỹ thuật này thường được sử dụng bởi virus và malware.
c. Nhận diện Debugger
Một kỹ thuật AntiDebug khác đó là sử dụng các biện pháp mà hệ điều hành kiểm soát quá trình debug. Bao gồm việc sử dụng các API cung cấp thông tin về một chương trình có bị debug hay không, kiểm tra các breakpoint được đặt trong đoạn code thực thi, loại bỏ các hardware breakpoint và sử dụng các lỗi đã biết của debugger để gây crash.
Sau đây bài viết sẽ đề cập đến 1 AntiDebug cụ thể, đó là kỹ thuật Anti-Debug sử dụng IsDebuggerPresent.
II. IsDebuggerPresent – AntiDebug
Ở đây ta cùng tìm hiểu mẫu Crackme1 của Ty123
Link
Đầu tiên ta thử mở file .exe với Olly và run.
Kết quả thu được như sau:
Tiến trình đã bị terminated.
Như đã giới thiệu ở trên ta sẽ tìm hiểu về AntiDebug IsDebuggerPresent, vậy ta cùng tìm hàm IsDebuggerPresent được gọi đến trong chương trình Crackme1.exe
Ta Search all Name (label) in current module
Tiếp đó tìm kiếm IsDebuggerPresent. Và kết quả như sau:
Lựa chọn IsDebuggerPresent và ấn Enter, kết quả ta có được vị trí lời gọi hàm API IsDebuggerPresent.
Đặt breakpoint tại vị trí trên.
Chạy lại chương trình, và nhảy qua lệnh gọi hàm.
Chú ý giá trị của EAX.
Và bây giờ cùng tìm hiểu xem hàm IsDebuggerPresent trả về các giá trị mang ý nghĩa như thế nào.
Sau khi tham khảo tại đây thì ta biết được, hàm IsDebuggerPresent sẽ trả về giá trị 0 nếu như chương trình đang không bị debug, và ngược lại, trả về giá trị khác 0 nếu chương trình đang bị debug.
Như vậy ta cần sửa giá trị EAX = 0 để chương trình hiểu rằng nó đang không bị debug.
Sau khi sửa và F9, ta có kết quả như sau:
Chương trình đã chạy bình thường.
Như vậy, ta đã biết 1 cách để vượt qua IsDebuggerPresent AntiDebug.
Tìm hiểu sâu hơn vào hàm IsDebuggerPresent, ta thấy nó sẽ kiểm tra byte BeingDebugged trong PEB. link
Từ đó ta có thể có một cách khác để vượt qua AntiDebug này mà không cần phải chỉnh sửa giá trị trả về của hàm IsDebuggerPresent tại mỗi lần gọi hàm. Đó là sửa byte offset+2 trong PEB structure.
Ta có thể sử dụng Plugin của Olly để thực hiện tự động công việc này. Có thể tham khảo việc sử dụng Hide Debugger hoặc IsDebuggerPresent.
Chỉnh sửa lần cuối bởi người điều hành: