2012-06-25 16 views
12

Đối với Windows chứng nhận 8 ứng dụng, có (trong số khác) các yêu cầu:Enable Xử lý ngoại lệ an toàn trong C++ Builder

  • 3,2 ứng dụng của bạn phải được biên dịch bằng cách sử dụng /SafeSEH cờ để đảm bảo trường hợp ngoại lệ an toàn xử lý
  • 3.3 ứng dụng của bạn phải được biên dịch bằng cách sử dụng /NXCOMPAT cờ để ngăn chặn thực thi dữ liệu
  • 3.4 ứng dụng của bạn phải được biên dịch bằng cách sử dụng /DYNAMICBASE cờ cho bố trí không gian địa chỉ ngẫu nhiên (ASLR)

Tôi không thể tìm hiểu cách bật một trong hai loại này trong C++ Builder XE.

Đối với /NXCOMPAT/DYNAMICBASE, người ta có thể sử dụng editbin.exe từ VS hoặc peflags.exe từ Cygwin. Mặc dù tôi sẽ cảm thấy tự tin hơn về những tác dụng phụ có thể xảy ra, nếu có cách thức bản địa để kích hoạt chúng.

Dù sao, tôi hoàn toàn mất mát về số /SafeSEH.

+2

Chắc chắn Delphi XE2 không tạo ra tệp thực thi với [Bảng xử lý ngoại lệ an toàn] (http://www.jwsecure.com/2007/07/06/the-safe-exception-handler-table/). Tôi không có CPPBuilder để kiểm tra nhưng tôi không đặt cược. Tôi nghĩ bạn sẽ không may mắn và phải gửi yêu cầu QC. Nó thực sự có thể là các trình xử lý ngoại lệ có cấu trúc là an toàn nhưng điều đó không được sử dụng nhiều cho bạn nếu các tệp PE không được đánh dấu để nói như vậy. Ứng dụng 64 bit của bạn sẽ ổn, nhưng điều đó cũng không khả thi trong CPPBuilder. –

+0

Báo cáo QC có liên quan: http://qc.embarcadero.com/wc/qcmain.aspx?d=106781 –

Trả lời

4

Đầu tiên,/SafeSEH chỉ áp dụng cho x86, không phải x64 hoặc ARM. Nó yêu cầu trình biên dịch của bạn tạo ra các bảng bổ sung cho biết các địa chỉ hàm được coi là trình xử lý ngoại lệ hợp lệ vì lý do bảo mật. Có một cơ hội mỏng bạn có thể tự làm điều này, nhưng nó sẽ yêu cầu bạn nhìn vào chuỗi xử lý ngoại lệ fs:0 trong mã assembly đã biên dịch của bạn và liệt kê tất cả các địa chỉ được đẩy vào chuỗi đó, sau đó mô tả chúng như được ghi ở đây: http://msdn.microsoft.com/en-us/library/9a89h429(v=VS.80).aspx. Có một cơ hội (mỏng) mà mã của bạn không thực sự có bất kỳ trình xử lý nào và tất cả chúng đều trong thời gian chạy của C++ Builder (có thể dễ dàng nếu thời gian chạy là một DLL riêng biệt).

Bạn nên cố gắng thuyết phục C++ Builder cập nhật trình biên dịch của họ để hỗ trợ SafeSEH. Nó nằm trong nền tảng Windows kể từ XP SP2, và cắm một lỗ hổng bảo mật khá khó chịu (các địa chỉ xử lý ngoại lệ tồn tại trên ngăn xếp trong x86, chỉ cần chờ tràn bộ đệm để đặt bất kỳ địa chỉ ngẫu nhiên nào được thực hiện)

1

các vấn đề liên quan đến /NXCOMPAT/DYNAMICBASE, tôi đã tạo ra một yêu cầu cho các mối liên kết C++ Builder để hỗ trợ các lá cờ ở đây: https://quality.embarcadero.com/browse/RSP-13072

Sử dụng editbin.exe từ Visual C++ là hầu như không một giải pháp lý tưởng, và mối liên kết của họ cần phải hỗ trợ các cờ natively.

CẬP NHẬT: Một yêu cầu bổ sung đã được tạo ra ở đây cho C++ file runtime Builder/Delphi (DLL/BPLs) được phân phối với những lá cờ đã được thiết lập, để tránh phải sử dụng EDITBIN từ Visual C++ để thiết lập chúng mình: https://quality.embarcadero.com/browse/RSP-13231