2009-02-21 33 views
25

Tại nhà tuyển dụng trước đây của chúng tôi, chúng tôi đã sử dụng một thành phần của bên thứ ba về cơ bản chỉ là một tệp DLL và một tệp tiêu đề. Đó là mô-đun cụ thể xử lý in ấn trong Win32. Tuy nhiên, công ty làm thành phần bị phá sản nên tôi không thể báo cáo lỗi mà tôi đã tìm thấy.Bí quyết gỡ lỗi yêu thích của bạn là gì?

Vì vậy, tôi đã tự quyết định khắc phục lỗi và khởi chạy trình gỡ rối. Tôi rất ngạc nhiên khi tìm thấy mã chống gỡ lỗi hầu như ở khắp mọi nơi, như thường lệ IsDebuggerPresent, nhưng điều đó làm tôi chú ý là thế này:

; some twiddling with xor 
    ; and data, result in eax 
    jmp eax 
    mov eax, 0x310fac09 
    ; rest of code here 

Tại cái nhìn đầu tiên tôi chỉ bước qua thói quen đó được gọi hai lần, sau đó mọi thứ vừa đi chuối. Sau một thời gian, tôi nhận ra rằng kết quả twiddling bit luôn giống nhau, tức là jmp eax luôn nhảy ngay vào hướng dẫn mov eax, 0x310fac09. Tôi đã giải mã các byte và ở đó, 0f31, lệnh rdtsc được sử dụng để đo thời gian giữa một số cuộc gọi trong DLL.

Vì vậy, câu hỏi của tôi đối với SO là: Bí quyết gỡ lỗi yêu thích của bạn là gì?

+10

Đó là ý kiến ​​của tôi rằng tôi thực sự không muốn mã chạy trên hệ thống của tôi đã có mọi thứ được thực hiện để ngăn chặn gỡ lỗi. Nó cho thấy rằng tác giả của mã không thể tin cậy được. – bruceatk

+1

Tôi đồng ý với bruceatk, đặc biệt là đối với các tệp DLL và các thành phần khác mà tôi sử dụng để xây dựng ứng dụng của mình. Tôi ít quan tâm đến các ứng dụng đầy đủ mà tôi sử dụng. Tôi không ngạc nhiên khi công ty bị phá sản :) - họ sẽ dành thời gian sản xuất mã tốt hơn là bảo vệ nó. – Michael

+0

@bruceatk để bạn không chạy Windows? Bản thân hệ điều hành chứa một số thủ thuật chống gỡ lỗi để giúp ẩn một số cơ chế bảo vệ thú vị hơn của nó. – mrduclaw

Trả lời

27

Bí quyết yêu thích của tôi là viết trình mô phỏng lệnh đơn giản cho bộ vi xử lý tối nghĩa.

Bảo vệ bản sao và một số chức năng cốt lõi sẽ được biên dịch cho bộ vi xử lý (GCC là trợ giúp tuyệt vời ở đây) và được liên kết với chương trình dưới dạng nhị phân.

Ý tưởng đằng sau điều này là, việc bảo vệ bản sao không tồn tại trong mã x86 thông thường và vì vậy không thể tháo rời.Bạn không thể xóa toàn bộ trình giả lập vì điều này sẽ loại bỏ chức năng cốt lõi khỏi chương trình.

Cơ hội duy nhất để hack chương trình là đảo ngược kỹ sư giả lập bộ vi xử lý làm gì.

Tôi đã sử dụng MIPS32 cho mô phỏng vì nó dễ dàng mô phỏng (chỉ mất 500 dòng mã C đơn giản). Để làm cho mọi thứ trở nên mơ hồ hơn, tôi đã không sử dụng các mã MIPS32 nguyên. Thay vào đó, mỗi opcode được xor'ed với địa chỉ riêng của nó.

Mã nhị phân của bảo vệ bản sao trông giống như dữ liệu rác.

Rất khuyến khích! Phải mất hơn 6 tháng trước khi một vết nứt xuất hiện (nó là cho một dự án trò chơi).

+0

Vì vậy, về cơ bản bạn đã đi qua tất cả những công việc biết bạn sẽ thất bại cuối cùng? – fow

+0

Sáu tháng là một thời gian dài khi chúng ta nói về việc nứt một ứng dụng. – Irwin

+3

Tôi sẽ nói phải mất 6 tháng trước khi ai đó cố gắng. Nó không đáng để nỗ lực. Tôi chắc rằng bất cứ điều gì bạn đã làm đều dễ dàng bị bỏ qua bởi điều mà bạn chưa bao giờ nghĩ tới. – bruceatk

0

Sử dụng nop để tháo lắp ráp thông qua trình gỡ lỗi là một mẹo hữu ích. Tất nhiên, việc đưa mã trở lại khó hơn rất nhiều !!!

+1

Tùy thuộc vào trình gỡ lỗi nên có tính năng 'hoàn tác'. OllyDbg có một, chỉ cần chọn các byte đã sửa đổi và nhấn ALT + BACKSPACE. – Irwin

6

Tôi đã là thành viên của nhiều cộng đồng RCE và đã chia sẻ công bằng của tôi về hack & nứt. Từ thời gian của tôi, tôi đã nhận ra rằng những thủ thuật mỏng manh như vậy thường dễ bay hơi và khá là vô ích. Hầu hết các thủ thuật chống gỡ lỗi chung là hệ điều hành cụ thể và không phải là 'di động'.

Trong ví dụ nói trên, có lẽ bạn đang sử dụng lắp ráp nội tuyến và naked chức năng __declspec, cả hai đều không được MSVC hỗ trợ khi biên dịch trên kiến ​​trúc x64. Có tất nhiên vẫn còn cách để thực hiện các thủ thuật nói trên nhưng bất cứ ai đã được đảo chiều cho đủ dài sẽ có thể phát hiện và đánh bại lừa trong vài phút.

Vì vậy, thông thường tôi khuyên bạn không nên sử dụng các thủ thuật chống gỡ lỗi bên ngoài việc sử dụng API IsDebuggerPresent để phát hiện. Thay vào đó, tôi muốn đề nghị bạn viết một cuống và/hoặc một máy ảo. Tôi đã mã hóa máy ảo của riêng mình và đã cải thiện nó trong nhiều năm nay và tôi có thể thành thật nói rằng đó là quyết định tốt nhất mà tôi đã thực hiện liên quan đến việc bảo vệ mã của tôi cho đến nay.

2

Tôi thứ hai đề xuất máy ảo. Tôi đã thực hiện một mô phỏng MIPS I (bây giờ) có thể thực thi các tệp nhị phân được tạo bằng mipsel-elf-gcc. Thêm vào đó mã/dữ liệu mã hóa khả năng (AES hoặc với bất kỳ thuật toán khác của sự lựa chọn của bạn), khả năng tự mô phỏng (vì vậy bạn có thể có mô phỏng lồng nhau) và bạn có một obfuscator mã khá tốt.

Tính năng đẹp của việc chọn MIPS I là 1) thật dễ dàng để thực hiện, 2) Tôi có thể viết mã trong C, gỡ lỗi trên máy tính để bàn của tôi và chỉ biên dịch nó cho MIPS khi nó được thực hiện. Không cần phải gỡ lỗi mã tùy chỉnh hoặc viết mã theo cách thủ công cho máy ảo tùy chỉnh.

+0

Wtf - bạn cũng sử dụng MIPS? Tôi nghĩ tôi là người duy nhất làm theo cách này. –

+0

Vâng, đầu tiên tôi muốn thiết kế một tập lệnh tùy chỉnh, nhưng nó nhanh chóng xảy ra với tôi rằng tôi sẽ lên án bản thân mình để viết và gỡ lỗi mã theo cách thủ công cho nó. Vì vậy, tôi đã đi để tìm một CPU đơn giản được hỗ trợ bởi gcc :-) – zvrba

3

Phương pháp obfuscation hiện đại nhất có vẻ là máy ảo.

Bạn về cơ bản lấy một phần mã đối tượng của mình và chuyển đổi nó thành định dạng bytecode của riêng bạn. Sau đó, bạn thêm một máy ảo nhỏ để chạy mã này. Cách duy nhất để gỡ lỗi đúng mã này sẽ là mã một trình giả lập hoặc bộ tách rời cho định dạng lệnh của máy ảo của bạn. Tất nhiên bạn cũng cần nghĩ về hiệu suất. Quá nhiều bytecode sẽ làm cho chương trình của bạn chạy chậm hơn mã gốc.

Hầu hết các thủ đoạn cũ là vô dụng bây giờ:

  • Isdebuggerpresent: rất khập khiễng và dễ dàng để vá
  • Khác debugger/nhận diện breakpoint
  • Ring0 thứ: người dùng không muốn cài đặt trình điều khiển, có lẽ bạn thực sự phá vỡ điều gì đó trên hệ thống của họ, v.v.
  • Những thứ tầm thường khác mà mọi người đều biết hoặc làm cho phần mềm của bạn không ổn định. hãy nhớ rằng ngay cả khi một vết nứt làm cho chương trình của bạn không ổn định nhưng nó vẫn hoạt động, tính không ổn định này sẽ được đổ lỗi cho bạn.

Nếu bạn thực sự muốn tự mình mã hóa giải pháp VM (có các chương trình tốt để bán), không chỉ sử dụng một định dạng lệnh. Làm cho nó đa hình, để bạn có thể có các phần khác nhau của mã có định dạng khác nhau. Bằng cách này, tất cả các mã của bạn không thể bị phá vỡ bằng cách viết chỉ một trình giả lập/bộ tách. Ví dụ, giải pháp MIPS một số người được cung cấp có vẻ dễ dàng bị phá vỡ vì định dạng hướng dẫn MIPS là tài liệu tốt và các công cụ phân tích như IDA có thể đã tháo rời mã.

List of instruction formats supported by IDA pro disassembler

1

Tính nhảy ở giữa một hợp pháp tìm kiếm nhưng thực sự cất giấu một hướng dẫn giảng dạy thực tế là tôi yêu thích. Chúng khá dễ phát hiện đối với con người, nhưng các công cụ tự động thường làm hỏng nó.

Đồng thời thay thế địa chỉ trả lại trên ngăn xếp sẽ làm cho thời gian hoạt động tốt hơn.

3

Tôi muốn mọi người viết phần mềm vững chắc, đáng tin cậy và làm những gì nó được quảng cáo để làm. Rằng họ cũng bán nó với giá hợp lý với giấy phép hợp lý.

Tôi biết rằng tôi đã lãng phí quá nhiều thời gian đối phó với các nhà cung cấp có chương trình cấp phép phức tạp chỉ gây ra vấn đề cho khách hàng và nhà cung cấp. Nó luôn luôn là đề nghị của tôi để tránh những nhà cung cấp. Làm việc tại một nhà máy điện hạt nhân, chúng tôi buộc phải sử dụng một số sản phẩm của nhà cung cấp nhất định và do đó buộc phải đối phó với các chương trình cấp phép của họ.Tôi ước có một cách để lấy lại thời gian mà cá nhân tôi đã lãng phí đối phó với những nỗ lực thất bại của họ để cung cấp cho chúng tôi một sản phẩm được cấp phép hoạt động. Nó có vẻ như là một điều nhỏ để hỏi, nhưng nó có vẻ là một điều khó khăn cho những người mà quá phức tạp vì lợi ích của chính họ.

+0

Tấn công? Tôi rất muốn ai đó quyết định gắn nhãn cho cuộc tấn công này để liên lạc với tôi và giải thích điều gì xúc phạm về nó. [email protected] – bruceatk

+0

+1 Để phản tác dụng "gây khó chịu". Điểm ảo +1 cho các mối quan tâm về năng lượng hạt nhân. –

+1

Tôi đã không đánh dấu bạn là xúc phạm, nhưng tôi đã đánh giá bạn xuống vì bài đăng của bạn thực sự không nằm trong chủ đề. – rhinovirus

6

Tắt quy trình con đính kèm với cha mẹ làm trình gỡ lỗi & sửa đổi các biến chính. Điểm thưởng để giữ cho quá trình con cư trú và sử dụng các hoạt động bộ nhớ trình gỡ lỗi như một loại IPC cho một số hoạt động chính.

Trên hệ thống của tôi, bạn không thể đính kèm hai trình gỡ rối vào cùng một quy trình.

Điều tuyệt vời về điều này là trừ khi họ cố gắng làm xáo trộn mọi thứ không có gì xảy ra.

2

yêu thích cá nhân của tôi là trên Amiga, nơi có một coprocessor (các Blitter) làm dữ liệu lớn chuyển độc lập khỏi bộ vi xử lý; chip này sẽ được hướng dẫn để xóa tất cả bộ nhớ, và thiết lập lại từ một IRQ hẹn giờ.

Khi bạn đính kèm hộp Action Replay, dừng CPU có nghĩa là Blitter sẽ tiếp tục xóa bộ nhớ.

Các vấn đề liên quan