2009-10-21 28 views
14

Tôi đã sử dụng Visual Studio 2005 trong Windows XP Pro 64 bit cho các dự án C và C++ trong một thời gian. Một trong những thủ thuật phổ biến mà tôi đã sử dụng theo thời gian trong trình gỡ rối là nhớ giá trị con trỏ số từ lần chạy gỡ lỗi trước đó của chương trình (nói 0x00000000FFAB8938), thêm nó vào cửa sổ xem với kiểu chữ thích hợp (ví dụ: ((MyObject *) 0x00000000FFAB8938)->data_field) và sau đó xem bộ nhớ bị chiếm bởi đối tượng trong lần chạy gỡ lỗi tiếp theo. Trong nhiều trường hợp, đây là một điều khá hữu ích và hữu ích để làm, miễn là mã vẫn không thay đổi, nó là hợp lý để mong đợi rằng bố cục bộ nhớ được cấp phát sẽ không thay đổi. Tóm lại, nó hoạt động.Độ ổn định con trỏ trong Windows Vista

Tuy nhiên, tương đối gần đây tôi bắt đầu sử dụng cùng một phiên bản của Visual Studio trên máy tính xách tay với Windows Vista (Home Premium) 64 bit. Kỳ lạ là đủ, khó sử dụng thủ thuật này hơn trong thiết lập đó. Địa chỉ bộ nhớ thực tế dường như thay đổi thường xuyên từ chạy để chạy không có lý do rõ ràng, tức là ngay cả khi mã của chương trình không bị thay đổi chút nào. Dường như địa chỉ thực tế không thay đổi hoàn toàn ngẫu nhiên, nó chỉ chọn một giá trị từ một tập hợp giá trị cố định nhiều hơn hoặc ít cố định hơn, nhưng trong mọi trường hợp, việc xem bộ nhớ này trở nên khó khăn hơn nhiều.

Có ai biết lý do của hành vi này trong Windows Vista không? Điều gì gây ra sự thay đổi trong bố cục bộ nhớ? Có phải là một số xâm nhập bên ngoài vào không gian địa chỉ quy trình từ các quy trình [hệ thống] khác không? Hoặc là một số tính năng/tính năng của việc triển khai API Heap trong Vista? Có cách nào để ngăn chặn điều này xảy ra không?

+1

Trong Linux có một khoảng thời gian dài hơn một trình ngẫu nhiên heap nhằm tránh các cuộc tấn công tràn bộ đệm. Có lẽ nó cuối cùng cũng đã được thực hiện bởi MS? – jdehaan

+0

Vâng, tôi biết về điều này, nhưng AFAIK nó chỉ hoạt động khi bạn * khởi động lại * copmputer. Chính xác hơn, tôi nghe nói rằng MS đã thực hiện phiên bản của họ để phân ngẫu nhiên mọi thứ ở mỗi lần khởi động (không biết nó hoạt động như thế nào trên Linux). Vì vậy, hành vi tôi quan sát trong Vista dường như không liên quan. – AnT

+0

Mặc dù điều này có thể là một cái gì đó. Tôi đang chạy VS 2005, là ứng dụng 32 bit có thể gỡ lỗi các ứng dụng 64 bit. AFAIK, nó hoạt động thông qua cơ chế gỡ lỗi từ xa của MS. Nó có thể được rằng Vista về cơ bản "khởi động" một môi trường 64-bit mới mỗi khi tôi bắt đầu một ứng dụng 64-bit từ VS 2005 (do đó gây ra những thứ để có được ngẫu nhiên)? – AnT

Trả lời

30

Windows Vista triển khai address space layout randomization, heap randomization, and stack randomization. Đây là một cơ chế bảo mật, cố gắng ngăn chặn các cuộc tấn công tràn bộ đệm dựa trên kiến ​​thức về nơi mà mỗi đoạn mã và dữ liệu nằm trong bộ nhớ.

Có thể tắt ASLR bằng cách đặt giá trị đăng ký MoveImages. Tôi không thể tìm thấy một cách để vô hiệu hóa heap ngẫu nhiên, nhưng một số anh chàng Microsoft đề nghị địa chỉ máy tính liên quan đến _crtheap. Ngay cả khi đống di chuyển xung quanh, địa chỉ tương đối có thể vẫn ổn định.

+0

Cảm ơn bạn đã trích dẫn. :) Đó là một điều để suy đoán nhưng tốt đẹp để xem evicdence. – BobbyShaftoe

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