2008-12-08 20 views
8

Tôi có dự án biểu mẫu cửa sổ (.net 3.0) sẽ không chạy trên máy tính vista của khách hàng do lỗi DEP. Nó chạy trên máy vista của tôi, và trong một phiên bản sạch của vista sp1 trong một máy ảo. Tôi đang gặp khó khăn khi theo dõi các cách để làm cho chương trình DEP của tôi, Data Execution Prevention tương thích. Tôi thực sự không thể làm bất cứ điều gì để kết thúc các máy người dùng, nó chỉ cần chạy. Có cách nào thoát khỏi cơn ác mộng phát triển vista mới nhất này không? Chương trình của tôi sử dụng các điều khiển devexpress, sql express và điều khiển trình duyệt web .net tức là. Tôi đã jumpered ra kiểm soát tức là, nhưng vô ích. Tôi có chương trình khác sử dụng devexpress và sql thể hiện trên cùng một máy và họ chạy ok. Tôi đang thua lỗ để gỡ lỗi này trên máy tính của người dùng.Làm cách nào để chương trình của tôi tương thích với DEP?

Trả lời

17

DEP chạy theo một trong hai chế độ:

1) Phần cứng DEP là dành cho CPU mà có thể đánh dấu các trang bộ nhớ là không thực thi. Điều này giúp ngăn chặn một số khai thác nhất định như tràn bộ đệm.

2) Phần mềm DEP dành cho các CPU không có hỗ trợ DEP phần cứng. Nó không ngăn chặn việc thực thi mã trong các trang dữ liệu, mà thay vào đó, dừng SEH ghi đè lên (một kiểu tấn công khác).

Trên Windows XP với CPU hỗ trợ nó, phần cứng DEP được bật theo mặc định chỉ cho một số hệ thống Windows nhị phân và cũng cho các chương trình chọn "chọn tham gia".

Trên Vista có CPU hỗ trợ, phần cứng DEP được bật theo mặc định cho gần như tất cả các quy trình. Điều này đôi khi có thể có vấn đề, thường là cho các chương trình cũ và trình điều khiển, và cho ISVs đã không thực hiện bất kỳ thử nghiệm Vista.

Vì vậy, tôi nghi ngờ rằng bước đầu tiên là khám phá xem bạn đang xử lý DEP phần mềm hay phần mềm. Ngoài ra, bạn đang sử dụng C#/VB hoặc Managed C++? Và bạn có đang sử dụng bất kỳ mã hoặc thành phần gốc nào không? Nếu ứng dụng của bạn sử dụng một thành phần gốc hoặc một điều khiển ActiveX được xây dựng bằng cách sử dụng khung công tác ATL cũ, thì có thể ứng dụng của bạn sẽ thất bại với DEP phần cứng.

Vì .NET Framework 2.0 SP1, tôi tin rằng trình biên dịch C# phát ra mã được quản lý tương thích với DEP. Nhưng nếu ứng dụng của bạn đang tạo DEP ngoại lệ, thì bạn có thể thử xóa cờ IMAGE_DLLCHARACTERISTICS_NX_COMPAT để thực thi. Để làm điều này bạn sử dụng EDITBIN.EXE từ bộ công cụ VC như vậy:

editbin.exe /NXCOMPAT:NO <your binary> 

Nếu bạn đang sử dụng Visual Studio, bạn có thể thêm một bước sau xây dựng cho dự án của thực thi của bạn. Bạn sẽ cần phải thiết lập môi trường để các phụ thuộc của EDITBIN có thể được giải quyết.Khi tôi đang sử dụng mã nguồn gốc như là một phần của ứng dụng của tôi, bước sau xây dựng trông như thế này:

call $(DevEnvDir)..\tools\vsvars32.bat 
editbin.exe /NXCOMPAT:NO $(TargetPath) 
+1

Tôi gặp khó khăn và sử dụng cụ thể (editbin.exe không có trong công cụ để tôi sao chép nó): gọi "C: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ Tools \ vsvars32.bat" editbin.exe/NXCOMPAT : KHÔNG "$ (TargetPath)" TY để có câu trả lời tuyệt vời, sẽ liên hệ lại với bạn về kết quả của khách hàng. –

+0

Ok hoàn toàn mát mẻ này là câu trả lời. –

+0

Đã thêm dấu ngoặc kép quanh đường dẫn, ngăn chặn thực thi VS2010 – Ulterior

0

Bắt đầu bằng cách tìm hiểu vị trí và cách chương trình của bạn bị lỗi. Bạn có thể sao chép vấn đề trên hệ thống của mình không? Với việc kích hoạt DEP cho ứng dụng trên hệ thống của bạn? Khi bạn có thể sao chép vấn đề và nhận được lỗi (vi phạm truy cập), bạn có thể tìm cách sửa chữa chương trình của mình.

Xem MSDN article for information on DEP.

+0

Đó là tình huống hoàn toàn mờ đục. Tôi không nhận được chi tiết từ vista, tôi không có trình gỡ rối trên hệ thống. Chương trình chạy tốt trên máy tính vista dev của tôi và trong một máy ảo vista sạch sẽ. –

5

Phiên bản cũ hơn của ATL không phải là DEP, vì vậy nếu bạn sử dụng bất kỳ điều khiển ActiveX nào được xây dựng bằng ATL và được xây dựng trên phiên bản ATL (phiên bản 7.1 trở xuống), bạn sẽ gặp lỗi DEP .

Như một phương sách cuối cùng, bạn có thể vô hiệu hóa DEP cho quá trình bằng cách gọi hàm API: SetProcessDEPPolicy.

Thông tin thêm về SetProcessDEPPolicy

5

Các trình biên dịch rằng vận chuyển với .NET 2.0 SP1 bật cờ NXCOMPAT trong tiêu đề tập tin thực thi. Bạn có thể tắt cờ đó trong bước Xây dựng bài đăng bằng cách chạy EditBin.exe bằng tùy chọn/NXCOMPAT: NO.

+1

Vâng đây cũng là câu trả lời. –

3

FWIW, điều đáng nói đến là trong nhiều trường hợp, các ứng dụng không "không tương thích với DEP" mà đúng hơn là sắp sửa sụp đổ và DEP "đút vào để tiết kiệm trong ngày". Rất thường xuyên, một khi bạn vô hiệu hóa DEP, bạn sẽ thấy rằng bạn đang đánh AV "bình thường".

Nếu dự án của bạn được viết hoàn toàn bằng .NET 3.0, điều này gần như chắc chắn là do .NET không thực hiện bất kỳ điều "điên" nào kích hoạt DEP (ví dụ: chức năng thunking, v.v ...).

Để gỡ lỗi, cài đặt trình gỡ lỗi hoặc bật Watson để tạo tệp .DMP, sau đó lấy tệp .DMP đó vào máy của nhà phát triển và tìm ra điều gì đã xảy ra.

+0

Vấn đề là với một điều khiển activex cũ hơn mà tôi phải sử dụng với chương trình của tôi. Nó điều khiển một mét, và mục đích chính của ứng dụng là chạy đồng hồ. Tôi đã không thể yêu cầu nhà cung cấp xây dựng lại ứng dụng với các thư viện atl mới hơn. Ứng dụng này cũng phải chạy trên tất cả các máy người dùng cuối và tôi đang gặp lỗi trên một số máy. Tôi không có quyền kiểm soát hoặc quản lý trực tiếp các máy người dùng. –

+0

Ah. Vâng, một lựa chọn sẽ là sử dụng SetProcessDEPPolicy để chọn tham gia DEP thay vì sử dụng tùy chọn liên kết NXCOMPAT. Khi bạn sử dụng SetProcessDEPPolicy để bật DEP, nó sẽ kích hoạt ATL Thunk Emulation, không giống như tùy chọn trình liên kết. Đây là cách IE8 bật DEP để vẫn tương thích với các điều khiển ATL cổ đại. – EricLaw

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