làm thế nào bạn có được SEH tên và/hoặc mô tả? bất thườngkhông cầnPhải mã hóa chuỗi vào ứng dụng của bạn?
我尝试使用 FormatMessage()
, nhưng đôi khi nó cắt bớt tin nhắn, ngay cả khi bạn chỉ định bỏ qua phần chèn:
__asm { // nâng cao vi phạm quyền truy cập
xor eax, eax
di chuyển eax, [eax]
}
Sử dụng mã 0xC0000005 (EXCEPTION_ACCESS_VIOLATION)
Ném một ngoại lệ.
thông điệp char[256];
Định dạngMessageA(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS,
GetModuleHandleA("ntdll.dll"), 0xC0000005,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
tin nhắn, sizeof(tin nhắn), NULL);
pad với chuỗi cắt ngắn tin nhắn
:"Hướng dẫn tại 0x
”。
Mã ngoại lệ có cấu trúc được xác định bằng số NTSTATUS. Mặc dù ai đó từ MS gợi ýsử dụng FormatMessage()Chuyển đổi số NTSTATUS thành chuỗi, tôi không làm điều đó. đánh dấu FORMAT_MESSAGE_FROM_SYSTEM
để chuyển đổi GetLastError() Kết quả là một chuỗi nên ở đây nó không có ý nghĩa. sẽ ký FORMAT_MESSAGE_FROM_HMODULE
Và ntdll.dll
Sử dụng cùng nhau sẽ khiến một số mã có kết quả không chính xác. Ví dụ, đối với EXCEPTION_ACCESS_VIOLATION
, bạn sẽ nhận được Hướng dẫn tại 0x
, điều này không hữu ích lắm :).
Khi bạn xem ntdll.dll
các chuỗi trong , rõ ràng là nhiều chuỗi trong số đó nên được so sánh với printf() được sử dụng cùng nhau. chức năng, không liên quan đếnFormatMessage() .Ví dụ,EXCEPTION_ACCESS_VIOLATION
Chuỗi là:
Lệnh ở 0x%08lx tham chiếu bộ nhớ ở 0x%08lx. Bộ nhớ không thể là %s.
%0
被 FormatMessage() Xử lý theo trình tự thoát có nghĩa là kết thúc tin nhắn chứ không phải chèn. Chèn là %1 đến %99. đó là lý do tại sao đánh dấu FORMAT_MESSAGE_IGNORE_INSERTS
Không có sự khác biệt.
Bạn có thể muốn bắt đầu với ntdll.dll
Tải chuỗi và chuyển nó tới vprintf()Nhưng bạn cần chuẩn bị các thông số chính xác theo quy định của chuỗi (ví dụ: EXCEPTION_ACCESS_VIOLATION
,它是 dài không dấu
,dài không dấu
,char*
). Cách tiếp cận này có một nhược điểm lớn:ntdll.dll
Bất kỳ thay đổi nào về số lượng, thứ tự hoặc kích thước của các tham số có thể làm hỏng mã của bạn.
Do đó, việc mã hóa chuỗi thành mã của riêng bạn sẽ an toàn và dễ dàng hơn. Tôi thấy thật nguy hiểm khi sử dụng các chuỗi do người khác chuẩn bị mà không phối hợp với tôi :) Và còn có các chức năng khác. Đây chỉ là một khả năng khác của sự cố.
Tôi là một lập trình viên xuất sắc, rất giỏi!