2012-05-06 25 views
5

Tôi đã sử dụng WinDbg để gỡ lỗi các tệp kết xuất một lúc.
Có một "mẹo" tốt đẹp hoạt động với các chương trình gốc x86, bạn có thể quét ngăn xếp cho các cờ CONTEXT_ALL (0x1003f).Tôi làm cách nào để tìm các ngoại lệ gốc trong ngăn xếp x64?

Trong x64 các CONTEXT_ALL cờ dường như không chứa 0x1003f ...

Bây giờ vấn đề là đôi khi bạn kết hợp tự nhiên với mã số quản lý, các phương pháp thông thường của việc tìm kiếm ngoại lệ (như .exc hay. sự kiện cuôi cung).

Tương đương với điều này 0x1003f in x64 là gì? có một hằng số như vậy không?

EDIT:

BTW, nếu bạn đang tự hỏi, về mặt lý thuyết nó cần phải có được 10003f vì các định nghĩa:

#define CONTEXT_I386 0x00010000 
#define CONTEXT_AMD64 0x00100000 

#define CONTEXT_CONTROL    0x00000001L // SS:SP, CS:IP, FLAGS, BP 
#define CONTEXT_INTEGER    0x00000002L // AX, BX, CX, DX, SI, DI 
#define CONTEXT_SEGMENTS   0x00000004L // DS, ES, FS, GS 
#define CONTEXT_FLOATING_POINT  0x00000008L // 387 state 
#define CONTEXT_DEBUG_REGISTERS  0x00000010L // DB 0-3,6,7 
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L // cpu specific extensions 
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS) 
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS) 

#define CONTEXT_I386_FULL CONTEXT_I386 | CONTEXT_FULL 
#define CONTEXT_I386_ALL CONTEXT_I386 | CONTEXT_ALL 
#define CONTEXT_AMD64_FULL CONTEXT_AMD64 | CONTEXT_FULL 
#define CONTEXT_AMD64_ALL CONTEXT_AMD64 | CONTEXT_ALL 

Nhưng nó không phải là ...

Trả lời

2

Tôi thường sử dụng các giá trị đăng ký phân đoạn cho khóa của tôi để tìm các bản ghi ngữ cảnh (ES và DS có cùng giá trị và nằm cạnh nhau trong cấu trúc CONTEXT). Cờ lừa là gọn gàng quá mặc dù.

Buộc một ngoại lệ trong một ứng dụng thử nghiệm sau đó đào cấu trúc biểu ghi bối cảnh ra khỏi ngăn xếp, trông giống như giá trị kỳ diệu trong trường hợp của tôi sẽ được 0x10001f:

0:000> dt ntdll!_context 000df1d0 
... 
    +0x030 ContextFlags  : 0x10001f 
... 
    +0x03a SegDs   : 0x2b 
    +0x03c SegEs   : 0x2b 
... 

Cũng lưu ý rằng giá trị ContextFlags không phải là tại bắt đầu của cấu trúc, vì vậy nếu bạn thấy rằng giá trị bạn sẽ phải trừ @@ C++ (# FIELD_OFFSET (ntdll! _CONTEXT, ContextFlags)) từ nó để có được cơ sở của cấu trúc ngữ cảnh.

Ngoài ra, chỉ trong trường hợp không rõ ràng, giá trị này đến từ kích thước mẫu chính xác. Nó có thể không chính xác trong môi trường của bạn và tất nhiên nó có thể thay đổi (như là bất cứ điều gì thực hiện cụ thể như thế này).

+0

có vẻ như hoạt động, nhưng bù lại phần đầu của cấu trúc là gì? Tôi không thể lấy chồng của tôi từ này được nêu ra. –

+0

Giá trị bạn đang tìm kiếm có lẽ đại diện cho trường ContextFlags của cấu trúc _CONTEXT. Khi bạn tìm thấy giá trị ma thuật trên ngăn xếp, địa chỉ con trỏ ngăn xếp trỏ đến địa chỉ của trường ContextFlags của cấu trúc. Vì vậy, để có được cơ sở của cấu trúc, bạn cần phải trừ giá trị bù trừ của trường ContextFlags. – snoone

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