蓝屏,谁之过?

Bug总能在你意想不到的地方给你个措手不及,只是它所带来并不是惊喜,而是Blue Screen Of Death !

既如此,只能兵来将挡。

先介绍一下程序的大体流程:

NTSTATUS
XXXProcessDirents(…)
{    
    do {
        KeEnterCriticalRegion();
        ExAcquireResourceSharedLite(&fcb->Resource, TRUE);

        /* access several members of fcb structure */
        ExReleaseResourceLite(&fcb->Resource);
        KeLeaveCriticalRegion();

         XXXXProcessDirent(…);

    } while (list_is_not_empty(….));

    return status;
}

NTSTATUS
XXXXProcessDirent(…)
{
    HANDLE handle = NULL;
    XXXX_FILE_HEADE fileHead;
    ……

    /* open file */
    status = ZwCreateFile(&handle, GENERIC_READ, &oa, &iosb, NULL, 0,
                          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                          FILE_OPEN, 0, NULL, 0);

    /* read file header*/
    status = ZwReadFile(handle, ioevent, NULL, NULL, &iosb, (PVOID)&fileHead,
                        sizeof(XXXX_FILE_HEADE), &offset, NULL);

    /* check whether file is interesting to us */
    if (status == STATUS_SUCCESS && iosb.Information == sizeof(……)) {
        /* it’s my taste, haha */
    }

    /* close file, not interested in it any more */

    if (handle){
        ZwClose(handle);
    }

    return status;
}

过程比较简单,XXXProcessDirents()会循环调用XXXProcessDirent(),直至列表中所有项全检查完毕。

下面再来看windbg分析吧:

1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

IRQL_NOT_LESS_OR_EQUAL (a)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If a kernel debugger is available get the stack backtrace.
Arguments:
Arg1: 0abc9867, memory referenced
Arg2: 00000002, IRQL
Arg3: 00000001, bitfield :
bit 0 : value 0 = read operation, 1 = write operation
bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
Arg4: 806e7a2a, address which referenced memory

Debugging Details:
------------------

WRITE_ADDRESS:  0abc9867

CURRENT_IRQL:  2

FAULTING_IP:
hal!KeAcquireInStackQueuedSpinLock+3a
806e7a2a 8902            mov     dword ptr [edx],eax

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0xA

PROCESS_NAME:  System

TRAP_FRAME:  b9019bbc -- (.trap 0xffffffffb9019bbc)
ErrCode = 00000002
eax=b9019c40 ebx=00000000 ecx=c0000211 edx=0abc9867 esi=c0000128 edi=8842d268
eip=806e7a2a esp=b9019c30 ebp=b9019c68 iopl=0         nv up ei ng nz na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010286
hal!KeAcquireInStackQueuedSpinLock+0x3a:
806e7a2a 8902            mov     dword ptr [edx],eax  ds:0023:0abc9867=????????
Resetting default scope

LAST_CONTROL_TRANSFER:  from 806e7a2a to 80544768

STACK_TEXT:
b9019bbc 806e7a2a badb0d00 0abc9867 804f4e77 nt!KiTrap0E+0x238
b9019c68 806e7ef2 00000000 00000000 b9019c80 hal!KeAcquireInStackQueuedSpinLock+0x3a
b9019c68 b9019d24 00000000 00000000 b9019c80 hal!HalpApcInterrupt+0xc6
WARNING: Frame IP not in any known module. Following frames may be wrong.
b9019cf0 80535873 00000000 8896fb20 00000000 0xb9019d24
b9019d10 b79d87ff ba668a30 8859b7e8 00000440 nt!ExReleaseResourceLite+0x8d
b9019d2c b79d8a5c 8a3ff2f0 00000003 ba6685f0 XXXXX!XXXProcessDirents+0xef
b9019d88 b79e163a e2f6b170 00000001 00000001 XXXXX!XXXKernelQueryDirectory+0x20c
b9019ddc 8054616e b79e1530 88a8ae00 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

问题出在系统函数ExReleaseResourceLite()及KeAcquireInStackQueuedSpinLock()上,且程序要写的地址为0abc9867 ,明显不对,所以此处可做栈损坏推断。

第一嫌疑要考虑的是,XXXProcessDirents()中有锁保护的部分,此部分是果真是最容易造成栈损坏buffer复制操作。但经过仔细检查及测试,便排除了此部分出错的可能。

在排除第一嫌疑后,就没有明显目标了。只好再接着看windbg log:

貌似KeAcquireInStackQueuedSpinLock()要写的地址是LockHandle的LockQueue->Next,而LockHandle一般都在从当前堆栈分配的,由此可肯定之前对于栈损坏的推断。可问题是,是谁导致的栈损坏。

Stack中有hal!HalpApcInterrupt()调用记录,它是处理APC的软中断。hal!HalpApcInterrupt()会一般会调用nt!KiDeliverApc()来处理线程的APC队列。但当ExReleaseResourceLite()调用的时候,线程还处于临界区内(Critical Section),此时User mode APC及Kernel mode normal APC都会被禁止的,但Kernel mode special APC不会。

Kernel Special APC最常见的情况便是由IoCompleteRequest()添加的:在APC Level中调用IopCompleteRequest()以处理Irp的Stage 2的清理工作。

至此,问题终于有些眉目了。分析代码中唯一有可能导致APC添加的地方就在函数XXXXProcessDirent()中的ZwReadFile()调用,而且fileHead正是于堆栈中分配的。

想到此处,此bug的根据原因便付出水面:

XXXXProcessDirent()没有处理ZwReadFile()返回STATUS_PENDING的情况,此情形下,XXXXProcessDirent()退出并继续执行,而之前的ZwReadFile()的IRP完成操作也在同时进行(还没有完成),并且此完成操作所要写的fileHead地址,正是早已被回收并加以重用的当前栈。

搞清楚之后,便在调用ZwReadFile()后,特别针对STATUS_PENING的情况来调用ZwWaitForSingleObject()以确保读操作全部完成后,再进行下一步操作。

到此,问题解决!

一个蓝屏的问题,竟然如此之绕,不禁让我想起刘震云的《一句顶一万句》,只是这能顶一万句的一句到底是哪句呢?

<下一步打算写写APC相关的东西,操作系统将APC隐藏得太深,总让人捉摸不定!>

6,492 条评论

  1. Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
    псис семаранг читайте подробнее про ставки и букмекеров на bkradar.com

  2. Каждый инструмент имеет чёткие показания и ограничение: мы объясняем, какую гипотезу проверяем, по каким признакам поймём, что она верна, и когда перестанем использовать метод, если вклад невелик. Это снижает тревогу и формирует доверие к плану.
    Узнать больше – анонимная наркологическая клиника в петрозаводске

  3. Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
    бока хуниорс читайте подробнее про ставки и букмекеров на bkradar.com

  4. Анонимность в клинике «Северный Вектор» является неотъемлемой частью лечебного процесса. Наркологическая клиника в Ростове-на-Дону обеспечивает конфиденциальность на всех этапах взаимодействия с пациентом, начиная с первичного обращения и заканчивая медицинским наблюдением. Клиническая практика показывает, что сохранение анонимности снижает уровень тревожности и повышает готовность пациента к полноценному лечению, что напрямую влияет на стабильность результатов.
    Получить дополнительные сведения – http://narkologicheskaya-klinika-v-rostove19.ru/

  5. Если к «окну оценки» динамика плато, мы корректируем один элемент — скорость/последовательность инфузии, вечерний ритуал или плотность сессий. Это защищает от полипрагмазии и делает вклад каждого шага читаемым.
    Детальнее – наркологическая клиника нарколог

  6. Лечение в режиме круглосуточного наблюдения выстраивается как непрерывный медицинский процесс. Даже при экстренном обращении терапия рассматривается как последовательность взаимосвязанных мероприятий с обязательным врачебным контролем.
    Детальнее – наркологические клиники алкоголизм

  7. Мы собрали для вас самые захватывающие факты из мира науки и истории. От малознакомых деталей до грандиозных событий — эта статья расширит ваш кругозор и подарит новое понимание того, как устроен наш мир.
    Есть чему поучиться – нарколог на дом круглосуточно москва цены

  8. В наркологической клинике во Владимире применяются передовые медицинские технологии и психологические методы, направленные на восстановление здоровья и социальной адаптации пациента. Врачи используют комплексный подход, сочетающий медикаментозное лечение, психотерапию и социальную поддержку. Такой подход способствует не только устранению физической зависимости, но и коррекции психологических аспектов заболевания.
    Ознакомиться с деталями – наркологическая клиника цены в владимире

  9. Для пациентов, нуждающихся в более глубокой терапии, предусмотрены стационарные программы. В клинике организованы палаты с комфортными условиями, круглосуточное наблюдение, психотерапевтические группы, индивидуальная работа с психиатром и врачом-наркологом. Также доступен формат дневного стационара и амбулаторных приёмов, которые подходят для пациентов с высокой степенью социальной адаптации.
    Подробнее можно узнать тут – наркологическая психиатрическая помощь в владимире

  10. Детоксикация при запое — это не «универсальная капельница», а медицинская стабилизация по состоянию. Сначала оцениваются риски: давление, пульс, дыхание, признаки обезвоживания, выраженность интоксикации и отмены, наличие хронических заболеваний, препараты, которые человек уже принимал. Затем подбирается поддержка, направленная на снижение интоксикации и восстановление функций организма.
    Изучить вопрос глубже – http://www.domen.ru

  11. Мы собрали для вас самые захватывающие факты из мира науки и истории. От малознакомых деталей до грандиозных событий — эта статья расширит ваш кругозор и подарит новое понимание того, как устроен наш мир.
    Обратитесь за информацией – выведение из запоя санкт петербург стационар

  12. Этот текст призван помочь читателю расширить кругозор и получить практические знания. Мы используем простой язык, наглядные примеры и структурированное изложение, чтобы сделать обучение максимально эффективным и увлекательным.
    Прочитать подробнее – выезд нарколога москва

  13. В этой статье представлен занимательный и актуальный контент, который заставит вас задуматься. Мы обсуждаем насущные вопросы и проблемы, а также освещаем истории, которые вдохновляют на действия и изменения. Узнайте, что стоит за событиями нашего времени!
    Погрузиться в научную дискуссию – вывести из запоя в стационаре санкт петербург

  14. Круглосуточный режим работы в клинике «Северный Вектор» обусловлен спецификой течения зависимостей, при которых ухудшение состояния может происходить внезапно. Наркологическая клиника в Ростове-на-Дону обеспечивает постоянную готовность медицинского персонала к приёму пациентов, что позволяет сократить время между возникновением симптомов и началом лечения. Такой подход снижает риск осложнений и повышает клиническую безопасность.
    Получить дополнительные сведения – http://narkologicheskaya-klinika-v-rostove19.ru

  15. Наиболее частыми основаниями для выбора такого формата становятся длительный запой, тяжелое течение похмельного синдрома, выраженный тремор, отсутствие сна, тревога, слабость, обезвоживание и жалобы на сердцебиение. Дополнительное значение имеют хронические заболевания сердца, сосудов, печени и нервной системы, на фоне которых выход из запоя может переноситься тяжелее.
    Получить дополнительную информацию – нарколог вывод из запоя в стационаре

  16. Наркологическая клиника в Краснодаре рассматривается как специализированное медицинское пространство, где лечение зависимостей выстраивается с приоритетом анонимности и круглосуточной доступности помощи. В клинике «Формула Трезвости» терапия организована таким образом, чтобы пациент мог получить медицинскую поддержку в любое время суток без риска разглашения персональной информации. Такой формат особенно важен при острых интоксикациях и тяжёлых абстинентных состояниях, требующих немедленного врачебного вмешательства и постоянного контроля.
    Получить дополнительные сведения – частная наркологическая клиника в краснодаре

  17. Домашний формат выбирают в тех случаях, когда человеку тяжело добраться до медицинского учреждения, он ослаблен после нескольких дней употребления спиртного или родственникам важно быстрее получить врачебную оценку состояния. После осмотра определяют, допустима ли помощь на дому, требуется ли капельница, возможен ли вывод из запоя в домашних условиях или нужен другой объем наблюдения. Если эпизоды повторяются, обсуждение обычно выходит за рамки снятия острых симптомов и затрагивает дальнейшую помощь при алкоголизме. Уже на этапе первого обращения часто уточняют, можно ли вызвать врача срочно, доступна ли круглосуточная помощь и в каких случаях состояние требует наблюдения в стационаре.
    Узнать больше – http://www.domen.ru

  18. Выездная служба «ВладЗдоровье» работает круглосуточно. После приёма заявки оператор передаёт информацию дежурному врачу, который выезжает к пациенту в течение 30 минут. Услуга включает медицинский осмотр, диагностику, детоксикационные мероприятия и рекомендации по дальнейшему лечению. Все процедуры проводятся на дому, что особенно удобно для пациентов, желающих сохранить конфиденциальность.
    Углубиться в тему – неотложная наркологическая помощь владимир

  19. Наркологическая клиника в Ростове-на-Дону рассматривается как специализированное медицинское учреждение, где лечение зависимостей выстраивается с учётом необходимости анонимности и круглосуточной доступности помощи. В клинике «Северный Вектор» работа организована таким образом, чтобы пациент мог обратиться за лечением в любое время суток без риска раскрытия персональной информации. Такой формат особенно важен при острых состояниях, требующих немедленного врачебного вмешательства и медицинского контроля.
    Исследовать вопрос подробнее – http://

  20. Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
    ca rosario central читайте подробнее про ставки и букмекеров на bkradar.com

  21. Выбор между домашней помощью и стационарным лечением определяется не удобством, а медицинской целесообразностью. В условиях клиники исключаются внешние триггеры, обеспечивается изоляция от источников алкоголя и создается контролируемая среда, где терапевтические решения принимаются на основе объективных показателей. Такой подход критически важен для предотвращения осложнений, минимизации дискомфорта абстиненции и формирования устойчивой базы для дальнейшей противорецидивной работы.
    Получить больше информации – https://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-20.ru/

  22. Эта обзорная заметка содержит ключевые моменты и факты по актуальным вопросам. Она поможет читателям быстро ориентироваться в теме и узнать о самых важных аспектах сегодня. Получите краткий курс по современной информации и оставайтесь в курсе событий!
    Ознакомиться с деталями – вызвать врача нарколога на дом

  23. Attractive section of content. I just stumbled upon your web site and in accession capital to assert that I acquire actually enjoyed account your blog posts. Anyway I’ll be subscribing to your augment and even I achievement you access consistently fast.
    Watch sexual porno video xxx sex adults site

  24. В «ВладЗдоровье» применяется комплексный подход, сочетающий медикаментозное лечение, психотерапию и реабилитацию. Врач-нарколог подбирает препараты индивидуально, с учётом анамнеза, переносимости компонентов и текущего состояния организма. Психотерапевтический блок включает когнитивно-поведенческую терапию, мотивационные интервью, семейную терапию и работу с посттравматическими реакциями.
    Ознакомиться с деталями – вызов наркологической помощи владимир

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注