2009-12-09 19 views
5

Phần mềm mà tôi viết (và bán) được nén và mã hóa trước khi phân phối. Mỗi khi tôi phát hành một bản dựng mới, tôi giữ tất cả các tệp .map và các tệp nhị phân được tạo ra bao gồm cả tệp exe trước khi nó được nén và mã hóa.Làm cách nào tôi có thể thay đổi tổng kiểm tra của mô-đun trong một minidump?

Khi nó gặp sự cố trên máy của khách hàng, tôi nhận được một khoản hoàn trả nhỏ. Tôi mở những minidumps trong Visual Studio và khám phá chúng ở đó.

Tôi đã sử dụng tốt các minidumps này bằng cách tìm kiếm địa chỉ trong tệp .map. Điều này thường sẽ đưa tôi vào đúng khu vực của mã và tôi thường có thể lý do tại sao vụ tai nạn xảy ra và sửa chữa nó nhưng điều này là RẤT tốn thời gian.

Sẽ hữu ích nếu tôi có thể sử dụng các ký hiệu mà tôi đã lưu từ bản dựng gốc trong quá trình gỡ lỗi của minidump.

Vấn đề của tôi là tôi nhận được cảnh báo về việc không thể tìm thấy các ký hiệu phù hợp. Nghiên cứu của tôi dẫn tôi tin rằng điều này là do tổng kiểm tra của exe trên máy của khách hàng không khớp với tổng kiểm tra của exe mà Visual Studio xây dựng. Và tôi hiểu tại sao, nó đã được nén và mã hóa. Tất nhiên tổng kiểm tra không khớp.

Tôi hình tôi có thể chỉnh sửa thủ công minidump hoặc thay đổi tổng kiểm của các tệp nhị phân đã lưu để khớp với tổng kiểm tra của phân phối. Tôi muốn thao tác các bản sao được lưu trữ vì vậy tôi không phải sửa đổi mọi bãi chứa đi kèm, nhưng tôi cũng sẽ có tính chất tương tự.

Vì vậy, câu hỏi của tôi là: Làm thế nào tôi có thể xác định được những kiểm tra này và tìm ra những gì tôi nên thay thế bằng? Là một câu hỏi phụ: Có cách nào tốt hơn không?

Trả lời

5

Không biết chính xác bạn đang nén và mã hóa các tệp nhị phân của mình như thế nào, thật khó cho tôi rất cụ thể.

Điều này blog post bởi John Robbins chỉ ra rằng hình ảnh thực thi được liên kết với PDB của chúng thông qua GUID được nhúng vào tiêu đề PE của tệp thi hành. Bạn sẽ có thể xem nó bằng cách chạy DUMPBIN/HEADERS trên tệp thực thi và tìm đầu ra của Thư mục gỡ lỗi. Nếu nén và mã hóa của bạn đã sửa đổi các tiêu đề PE sao cho thông tin này không có sẵn (hoặc chính xác), thì nó sẽ giải thích tại sao trình gỡ lỗi của bạn không thể tìm thấy bất kỳ thứ gì.

Có một vài cách tiếp cận mà tôi cho rằng bạn có thể thực hiện để giải quyết vấn đề này. Để thực sự cố gắng để có được điều này để làm việc, bạn có thể muốn xem xét việc sử dụng WinDbg thay vì trình gỡ lỗi Visual Studio. Bạn sẽ hiểu tại sao tôi đề xuất điều này trong giây lát ...

WinDbg cung cấp một số tùy chọn cho phép tải các tệp biểu tượng một cách thoải mái. Ý tưởng với tùy chọn này là, nếu mã nguồn không thay đổi nhưng các tệp nhị phân từ một bản dựng khác với PDB, thì kiểm tra GUID có thể được miễn và tệp biểu tượng không phù hợp có thể được tải. Tôi không biết làm thế nào tốt sẽ làm việc với nén và mã hóa của bạn, do đó, YMMV.

WinDbg và các công cụ đi kèm của nó có thể được sử dụng để loại bỏ GUID khỏi cả tệp thi hành và PDB, nhưng tôi bỏ qua điều đó vì tôi hy vọng rằng các bước đó sẽ không cần thiết.

Sau khi bạn đã mở minidump của bạn trong WinDbg, bạn sẽ cần phải nhập một số lệnh vào dòng lệnh để có được điều này tất cả làm việc:

.symopt +0x40 
!sym noisy 
ld <exe name> 

Lệnh đầu tiên cho phép tùy chọn SYMOPT_LOAD_ANYTHING mà bỏ qua việc kiểm tra GUID .Lệnh !sym cho phép đầu ra chi tiết để tải biểu tượng để bạn có thể thấy thông báo lỗi chi tiết hơn. Lệnh ld hướng WinDbg để thử tải các ký hiệu cho tên thực thi mà bạn sẽ nhập vào vị trí <exe name>. Nếu bạn lặp lại lệnh ld, WinDbg sẽ chỉ ra nếu nó tải thành công các biểu tượng lần đầu tiên.

Hy vọng điều này sẽ giúp - một lần nữa, tôi không biết điều này sẽ hoạt động tốt như thế nào với việc nén và mã hóa của bạn, nhưng đáng để thử.

+0

Tôi nghĩ lệnh đầu tiên phải là .symopt + 0x40 (bạn đã quên dấu chấm ban đầu). – Patrick

0

Đây có phải là tính năng nén/mã hóa như UPX không? Nếu nội dung thực thi của các tập tin nhị phân đang thay đổi (như được thực hiện với các công cụ như UPX), bạn sẽ không may mắn (trừ khi bạn thích gỡ lỗi các ứng dụng phức tạp trong ngôn ngữ assembly). Phần mềm của bạn có thực sự quan trọng/đặc biệt đến mức mã nhị phân của nó cần phải được mã hóa trước khi được phân phối không? Theo kinh nghiệm của tôi, khả năng gỡ lỗi các bãi rác là quan trọng hơn nhiều so với việc ngăn chặn mọi người từ kỹ thuật đảo ngược mã của bạn.

+0

Tôi sẽ không nói phần mềm của tôi là đặc biệt/quan trọng. Nó là một sản phẩm tiêu dùng thương mại nên kỹ thuật đảo ngược không phải là mối quan tâm. Cracking và keygens là. –

+1

Mọi người sẽ tìm ra cách để crack ứng dụng của bạn bất kể bạn làm gì, ít nhất là nếu nó đủ phổ biến hoặc hữu ích. Theo kinh nghiệm của tôi, nỗ lực để tăng cường ứng dụng của bạn chống lại loại điều đó không đáng giá thời gian và tiền bạc mà nó đòi hỏi, đặc biệt là nếu nó gây ra những cơn đau đầu với người dùng hợp pháp. – Luke

+2

Nó cũng giống như khóa xe của bạn và lấy chìa khóa. Nó không ngăn chặn những tên trộm xác định, nhưng cũng không phải là vô dụng. –

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