1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Помощь нужна с ZwReadFile

Тема в разделе "WASM.NT.KERNEL", создана пользователем FoxB, 15 июл 2019.

  1. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    Да какие извраты - просто создать акк прямо из встроенной в магазин менюшки, а потом войти в эту учётку.
    Можно даже совершить вход облегчённым способом - только для UWP-приложений, чтобы это никак не повлияло на остальную систему (в менюшке есть соответствующий пункт).
    Очень советую довести до конца и всё-таки попробовать UWP'шный WinDbg. Очень вкусная штука!
    --- Сообщение объединено, 21 июл 2019 ---
    Кстати, TTD, насколько знаю, добавили в какой-то из инсайдерских билдов визуалки. Правда, хоть у меня и инсайдерская, TTD там видел только для шарпа... Возможно, он как-то включается и настраивается для плюсов - но как?..
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.545
    HoShiMin,

    > попробовать UWP'шный WinDbg. Очень вкусная штука!

    Виндебаг в принципе штука стрёмная и лишний раз его не юзают. Я даже не помню когда последний раз его запускал, только что бы крэш дампы смотреть. Тем более он нужен довольно в редких случаях, для специфической отладки - поиска ошибок в левом софте или если с осью что то не так. Обычно при написании драйверов он и вовсе не нужен. Ну это у тех кто знает что пишет, если как тс делать это комментами, то конечно его придётся не закрывать даже.
     
  3. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    Блина-малина, когда пишу драйвера, я как раз его не закрываю =(
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.545
    HoShiMin,

    Значит что ты делаешь много ошибок и нет средств их диагностики, только отладка.
     
  5. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    На самом деле, даже в случае простых опечаток экономит кучу времени. Забыл где-то присвоить нулевому указателю адрес, через сотню строчек всплыло. Запустил - хлоп! - сразу встали на нужной строчке, по трейсу вернулись обратно, нашли указатель -> PROFIT. Чего зря время на бсоды тратить?
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.545
    HoShiMin,

    Поймёшь со временем. У тебя пока довольно в этом деле малый опыт.
     
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.339
    HoShiMin, а вы пробовали совмещать VirtualKD и виртуалбокс? Я разбираюсь, и что-то не получается; хотя делаю по инструкции
    Мб что виртуалбокс новый, а виртуалкд старый.
     
  8. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    VirtualKD пробовал только с VMware. Но встречный вопрос: почему именно такой выбор? Почему нужен именно VirtualKD, а не использовать, например, KDNET?
     
    Последнее редактирование: 3 май 2021
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.339
    Читал, что это очень удобная вещь, упрощающая дебаг. Тут и так все очень сложно. Ну если не пойдет, то попробую обычную отладку через СОМ порт.. А по ссылке (KDNET) - я верно понимаю, что он только для вин8 и выше? Я пробую дебажить ХР и семерку.

    И еще - подскажите, как вообще правильно отладить загрузку винды? Ну т.e например я хочу поставить брекпойнт на логине пользователя в систему. Реально ли это, в какую сторону копать? В идеале - хочу пошагово посмотреть, как загружается ОС, какие драйвера стартуют , в какой последовательности.
     
  10. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    Сам по себе он ничего не упрощает - это лишь замена виртуального COM-порта на что-то более быстрое. Из недостатков - он патчит систему и иногда подвисает.

    Да, но это не проблема: ставь десятку и отлаживай как белый человек. KDNET очень быстрый и легко настраивается.

    А по поводу отладки загрузки, KD опционально может вызывать int3 при подключении отладчика.
    Запускаем WinDbg, запускаем виртуалку, KD к нам коннектится и останавливается - как видишь, на ранних фазах запуска, где-то в KiSystemStartup. А дальше ставь нужные брейкпоинты.

    upload_2021-5-3_19-55-41.png
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.545
    HoShiMin,

    > на ранних фазах запуска, где-то в KiSystemStartup

    Ничего что для M0rg0t, это сложно может быть такое объяснение ?
     
    M0rg0t нравится это.
  12. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    Ну можно в чём-то более привычном:

    upload_2021-5-3_20-51-1.png
     
    M0rg0t нравится это.
  13. MaKaKa

    MaKaKa New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2020
    Сообщения:
    27
    Есть две версии VritualKd. Собственно, от sysprogs и форк VirtualKd Redux. Последний обновляется вроде как и баги исправляются. На крайняк можно отправить Issue разработчику. А так, если KDNET поддерживается, то лучше использовать его, как ранее заметил HoShiMin. У меня с ним были какие-то проблемы, вылетала ошибка, что железо не поддерживает или типа того.
     
    M0rg0t нравится это.
  14. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.339
    MaKaKa, да, и в самом деле, эта версия работает (а официальная нет); правда тут (если вдруг кто будет гуглить) нужно добавить сертификат в доверенные (иначе не загружает длл). Хз, не опасно ли это делать, просто потестил.

    Indy_, это все очень сложно, и видимо придется отложить до лучших времен.

    HoShiMin, я просто хотел начать с ХР или семерки (или даже вин2к) чтобы лучше понять процесс загрузки ОС. Вообще, что можно почитать на эту тему? У меня что-то вообще ничего не получается.
    Допустим, хочу посмотреть какой драйвер когда грузится, пишу
    Почему так? Далее, такие ошибки есть
    Код (Text):
    1. BGHELP: Can't use symbol server for ntdll.pdb - no header information available
    2. DBGHELP: ntdll.pdb - file not found
    3. *** WARNING: Unable to verify timestamp for ntdll.dll
    4. DBGHELP: ntdll - no symbols loaded
    Может нужно как-то настраивать символы и на таргет-машине? Или мс не поддерживает уже старые ОС и символы от них?

    Как вот мне дотрейсить до входа в систему? Когда-то 1 товарищ отсюда писал, что нужно ставить бряк на msv1_0.dll!LsaApLogonUserEx2, однако ничего не работает (и вообще неясно, откуда эта инфа)
    Или надо реверсить винлогон?
     
  15. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    На целевой машине, кроме включения ядерного отладчика, ничего настраивать не надо.
    Все символы WinDbg подгрузит сам (и для XP тоже).

    Если ты находишься в контексте процесса ядра, то у тебя нет ntdll (как и юзермодного адресного пространства).
    Если надо поставить бряк в каком-то конкретном процессе, то сначала надо переключиться на него.
    Посмотреть текущий контекст можно командой "!process", которая выведет информацию о текущем процессе и его потоках.
    Чтобы посмотреть список всех процессов, набери "!process 0 0".

    Например, в списке процессов тебя заинтересовал процесс WinInit:

    PROCESS ffffdf829aee4080
    SessionId: 0 Cid: 02c0 Peb: bc151d3000 ParentCid: 0270
    DirBase: 173257002 ObjectTable: ffffb08d50bf8e40 HandleCount: 180.
    Image: wininit.exe


    Переключаешься на процесс:
    Код (Text):
    1.  
    2. kd> !process /i ffffdf829aee4080
    3. kd> g
    4.  
    Подгружаешь символы, если они не подгрузились сами:
    Код (Text):
    1.  
    2. kd> .reload
    3.  
    На этом этапе ты уже можешь ставить брейкпоинты на юзермодные функции:
    Код (Text):
    1.  
    2. kd> bp ntdll!NtProtectVirtualMemory
    3.  
    Если надо найти конкретный поток, то смотришь список потоков:
    Код (Text):
    1.  
    2. kd> !process ffffdf829aee4080 0x6
    3.  
    Флажок 0x6 - показать потоки с их стактрейсами.

    Например, заинтересовал этот:

    THREAD ffffdf829aee5080 Cid 02c0.02c4 Teb: 000000bc151d4000 Win32Thread: ffffdf829a5fd460 WAIT: (UserRequest) UserMode Non-Alertable
    ffffdf829ac8e5e0 NotificationEvent
    Not impersonating
    DeviceMap ffffb08d4d436660
    Owning Process ffffdf829aee4080 Image: wininit.exe
    Attached Process N/A Image: N/A
    Wait Start TickCount 562 Ticks: 1683 (0:00:00:26.296)
    Context Switch Count 323 IdealProcessor: 0
    UserTime 00:00:00.000
    KernelTime 00:00:00.046
    Win32 Start Address wininit!WinMainCRTStartup (0x00007ff76f283e30)
    Stack Init fffff1827c709c90 Current fffff1827c7096a0
    Base fffff1827c70a000 Limit fffff1827c704000 Call 0000000000000000
    Priority 15 BasePriority 15 PriorityDecrement 0 IoPriority 2 PagePriority 5
    Kernel stack not resident.
    Child-SP RetAddr : Args to Child : Call Site
    fffff182`7c7096e0 fffff807`10665850 : 00000000`fffffffe 00000000`0000000d 00000000`00000040 00000000`00000101 : nt!KiSwapContext+0x76
    fffff182`7c709820 fffff807`10664d7f : ffffdf82`9a5fe000 ffffdf82`9aee5ad0 fffff182`7c7099e0 ffffdf82`9aee5080 : nt!KiSwapThread+0x500
    fffff182`7c7098d0 fffff807`10664623 : 00000000`00000000 fffff807`00000000 00000000`00000000 ffffdf82`9aee51c0 : nt!KiCommitThreadWait+0x14f
    fffff182`7c709970 fffff807`10a2cb01 : ffffdf82`9ac8e5e0 00000000`00000006 fffff182`7c709a01 000000bc`14f6fb00 : nt!KeWaitForSingleObject+0x233
    fffff182`7c709a60 fffff807`10a2cbaa : ffffdf82`9aee5080 00000000`00000000 00000000`00000000 00000000`00000001 : nt!ObWaitForSingleObject+0x91
    fffff182`7c709ac0 fffff807`108075b5 : ffffdf82`9aee5000 000000bc`00000000 00000000`00000000 00000000`00000000 : nt!NtWaitForSingleObject+0x6a
    fffff182`7c709b00 00007ffb`bc16cc94 : 00007ffb`b9bba34e 000000bc`14f6fbe0 0000ab8f`4a7634bd 00007ff7`6f2e0170 : nt!KiSystemServiceCopyEnd+0x25 (TrapFrame @ fffff182`7c709b00)
    000000bc`14f6fb58 00007ffb`b9bba34e : 000000bc`14f6fbe0 0000ab8f`4a7634bd 00007ff7`6f2e0170 00007ffb`bc120679 : ntdll!NtWaitForSingleObject+0x14
    000000bc`14f6fb60 00007ff7`6f2ab208 : 00007ff7`6f2e0170 00000000`00000150 00000000`00000000 00000000`000000f8 : KERNELBASE!WaitForSingleObjectEx+0x8e
    000000bc`14f6fc00 00007ff7`6f283db6 : 00000000`0000000a 00000000`00000000 00000000`00000000 00000000`00000000 : wininit!WinMain+0x1134
    000000bc`14f6fd30 00007ffb`ba997034 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : wininit!__scrt_common_main_seh+0x106
    000000bc`14f6fd70 00007ffb`bc122651 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x14
    000000bc`14f6fda0 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21


    Переключаешься на поток:
    Код (Text):
    1.  
    2. kd> .thread ffffdf829aee5080
    3.  
    Например, интересует тебя девятый фрейм (wininit!WinMain+0x1134) - переключаешься в него:
    Код (Text):
    1.  
    2. kd> .frame 9
    3.  
    ...и получаешь контекст в этом фрейме.

    Примерно так отладка и происходит.

    Если же надо отлаживать что-то в ядре, то для ядра алиас "nt":
    Код (Text):
    1.  
    2. kd> bp nt!ZwLoadDriver
    3.  
    -----------------

    Все команды, которые я здесь использовал, описаны в документации и во встроенной справке к WinDbg:
    Getting Started with WinDbg (User-Mode) - Windows drivers | Microsoft Docs
    Getting Started with WinDbg (Kernel-Mode) - Windows drivers | Microsoft Docs

    Также рекомендую шпаргалки:
    Common WinDbg Commands (Thematically Grouped)
    repnz/windbg-cheat-sheet: My personal cheat sheet for using WinDbg for kernel debugging (github.com)

    Я использую WinDbg Preview из Microsoft Store - он с современным удобным интерфейсом, что тоже сильно упростит отладку в сравнении с классическим WinDbg.
    Например, он поддерживает JavaScript:
    JavaScript Debugger Example Scripts - Windows drivers | Microsoft Docs
     
    Последнее редактирование: 4 май 2021
    M0rg0t нравится это.
  16. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.339
    HoShiMin, еще раз спасибо, это все очень сложно, надо постепенно изучать. Почему может быть такая ошибка?

    Код (Text):
    1. kd> !process 0 0
    2. **** NT ACTIVE PROCESS DUMP ****
    3. Error in reading nt!_EPROCESS at 00000000
    4.  
    5.  
    6. kd> !process
    7. Failed to get VadRoot
    8. PROCESS 80559e20  SessionId: none  Cid: 0000    Peb: 00000000  ParentCid: 0000
    после перезапуска windbg пропадает иногда
     
  17. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    А что за система на виртуалке? И это появляется после каких-то действий или коннектишься к отладчику - и сразу ошибки?
     
  18. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.339
    HoShiMin, ХР sp2 вроде; коннект , идет загрузка (лого ХР) и вот такая ошибка
    мб потому что ОС древняя?
     
  19. HoShiMin

    HoShiMin Active Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    861
    Адрес:
    Россия, Нижний Новгород
    Всё может быть.
    Если остановить систему не во время запуска, а где-нибудь на рабочем столе, !process продолжит фэйлиться?
    И всё же, какой сакральный смысл в исследовании столь старых систем?
    Почему просто не взять десятку? С ней точно проблем не будет.
     
  20. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.339
    Я ничего не понимаю в этой загрузке ОС, мб в старой минималистичной ХР будет проще разобраться, чем в десятке (с миллионом новых процессов)
    тем более, по ХР есть книга Руссиновича (по загрузке) , а по десятке хз что читать.