Crash dump'ы и KeCapturePersistentThreadState

    Я тут обнаружил очень занятную недокументированную функцию, экспортируемую ядром, на которую нет ссылок внутри ядра, но которая делает весьма занятную вещь. А именно, записывает в переданный кусок памяти полноценный minidump на данный момент времени.
    Весьма полезно с учетом того, что там (в дампе) есть оффсеты неэкспортируемых структур типа PsLoadedModuleList, которые могут пригодиться.
    Спасибо Freeman за помощь)

    ULONG
    NTAPI
    KeCapturePersistentThreadState(
    PCONTEXT Context,
    PKTHREAD Thread,
    ULONG BugCheckCode,
    ULONG BugCheckParameter1,
    ULONG BugCheckParameter2,
    ULONG BugCheckParameter3,
    ULONG BugCheckParameter4,
    PVOID VirtualAddress
    );


    Входные параметры:
    Context — текущий контекст (можно от балды, нужно лишь заполнить EIP & ESP)
    Thread — текущий поток. можно указать NULL, тогда она сама возьмет текущий
    BugCheckCode, ParametersX — багчек код и аргументы, которые она запишет в дамп.
    VirtualAddress — адрес выделенных 16 страниц памяти (64кб), куда она положит аккуратно готовенький крешдамп.

    Пример:

    Заголовок дампа:
    typedef struct _DUMP_HEADER {
    /* 00 */ ULONG Signature;
    /* 04 */ ULONG ValidDump;
    /* 08 */ ULONG MajorVersion;
    /* 0c */ ULONG MinorVersion;
    /* 10 */ ULONG DirectoryTableBase;
    /* 14 */ PULONG PfnDataBase;
    /* 18 */ PLIST_ENTRY PsLoadedModuleList;
    /* 1c */ PLIST_ENTRY PsActiveProcessHead;
    /* 20 */ ULONG MachineImageType;
    /* 24 */ ULONG NumberProcessors;
    /* 28 */ ULONG BugCheckCode;
    /* 2c */ ULONG BugCheckParameter1;
    /* 30 */ ULONG BugCheckParameter2;
    /* 34 */ ULONG BugCheckParameter3;
    /* 38 */ ULONG BugCheckParameter4;
    /* 3c */ CHAR VersionUser[32];
    /* 5c */ UCHAR PaeEnabled;
    UCHAR NotUsed[3];
    /* 60 */ PVOID KdDebuggerDataBlock;
    } DUMP_HEADER, *PDUMP_HEADER;


    Использование функции: www.everfall.com/paste/id.php?mkgmkfg1a057

    Кодес получает дамп, показывает адерса MmPfnDatabase, PsActiveProcessHead, PsLoadedModuleList и сбрасывает дамп на диск. Дамп можно спокойно запихать в WinDbg и изучать

    Вообщем, весьма занятная штуковина…

    Надо будет переписать свой gr8lkd (http://gr8lkd.googlecode.com/) с использованием этой функции.
    Поделиться публикацией

    Комментарии 3

    • НЛО прилетело и опубликовало эту надпись здесь
        0
        ну тут не особо много так что я решил катом не пользоваться, а насчет объяснить общественности: не думаю, что если объяснить это широкой массе людей, то это будет полезно. кому надо тот и так поймет, а остальным это просто не нужно
          0
          Полностью согласен Грейт :-) Ты посмотри что люди пишут в группе «С++» :-) перехват API и инжект в процесс…

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое