Трассировка с адреса с помощью SEH or VEH

Тема в разделе "WASM.WIN32", создана пользователем punxer, 21 июн 2010.

  1. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    punxer,

    "Дело было ночером, делать было не с кем..." :derisive:
    Наваял кой чего в C, авось поможет.
    Код (Text):
    1. #include <Windows.H>
    2. #include <stdio.h>
    3.  
    4. typedef unsigned char byte;
    5. #define TF (0x100)
    6.  
    7. unsigned i, j;  // ALL HAIL FORTRAN! ;-)
    8.  
    9. tracer(unsigned code, EXCEPTION_POINTERS *ep) {
    10.     static traced = 0;
    11.     if (STATUS_BREAKPOINT == code) {
    12.         printf("%#10x; int3\n", ep->ContextRecord->Eip++);  // ++ за декодер длины, ага (дизассемблер длин звучит идиотски)
    13.         if (traced = ~traced) ep->ContextRecord->EFlags |= TF;
    14.     }
    15.     else if (STATUS_SINGLE_STEP == code && traced) {
    16.         printf("%#10x; int1; i: %u; j: %u\n", ep->ContextRecord->Eip, i, j);
    17.         if (0xCC == *(byte*)ep->ContextRecord->Eip) // кто ж виноват, что через зад
    18.             ep->ContextRecord->EFlags &= ~TF;
    19.         else
    20.             ep->ContextRecord->EFlags |= TF;
    21.     }
    22.     else return EXCEPTION_CONTINUE_SEARCH;
    23.     return EXCEPTION_CONTINUE_EXECUTION;
    24. }
    25.  
    26. main() {
    27.     __try {
    28.         __asm int 3;
    29.         for (i = j = 1; i<=10; ++i) j *= i;
    30.         __asm int 3;
    31.         printf("10! == %u\n", j);
    32.     }
    33.     __except (tracer(GetExceptionCode(), GetExceptionInformation())) {}
    34.     return 0;
    35. }
    В коде это выглядит ужасно, как я и предполагал.