2012-05-06 53 views
5

Używam WinDbg do debugowania plików zrzutu od jakiegoś czasu.
Istnieje niezła "sztuczka", która działa z natywnymi programami x86, można zeskanować stos dla flag CONTEXT_ALL (0x1003f).Jak znaleźć natywne wyjątki w stosie x64?

W x64 na CONTEXT_ALL flagi najwyraźniej nie zawierają 0x1003f ...

Teraz problemem jest to, że czasami, kiedy rodzimy wymieszać z kodu zarządzanego, regularnych sposobów znajdowania wyjątków (jak .exc lub. ostatnie wydarzenie).

Jaki jest odpowiednik tego 0x1003f w x64? czy jest taka stała?

EDIT:

BTW, jeśli zastanawiasz się, w teorii powinno być 10003f ponieważ z definicji:

#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 

ale to nie jest ...

Odpowiedz

2

Zwykle używam wartości rejestru segmentu dla mojego klucza do wyszukiwania rekordów kontekstu (ES i DS mają tę samą wartość i znajdują się obok siebie w strukturze CONTEXT). Sztuczka flagi jest jednak zadowalająca.

wymuszanie wyjątek w aplikacji testowej następnie kopanie strukturę rekordu kontekst ze stosu, wygląda magicznej wartości w moim przypadku byłaby 0x10001f:

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

Należy również pamiętać, że wartość ContextFlags nie jest na początek struktury, więc jeśli znajdziesz tę wartość, musisz odjąć od niej @@ C++ (# FIELD_OFFSET (ntdll! _CONTEXT, ContextFlags)), aby uzyskać podstawę struktury kontekstu.

Również w przypadku, gdy nie było to oczywiste, wartość ta pochodzi z próbki o dokładnie jednym. Może to nie być poprawne w twoim środowisku i oczywiście podlega zmianom (jak to jest w przypadku konkretnej implementacji takiej jak ta).

+0

który wydaje się działać, ale jakie jest przesunięcie z powrotem do początku struktury? Nie mogłem jeszcze zdobyć mojego stacka. –

+0

Wartość, na którą polujesz, prawdopodobnie oznacza pole ContextFlags struktury _CONTEXT. Po znalezieniu magicznej wartości na stosie adres wskaźnika stosu wskazuje adres pola ContextFlags struktury. Tak więc, aby uzyskać podstawę struktury, należy odjąć przesunięcie pola ContextFlags. – snoone