Регулярно мне нужно исследовать файлы дампа, всегда одинаково, и я хотел бы автоматизировать это. Я использую Windbg в качестве инструмента, и я думаю об использовании сценариев Windbg.
Я сделал несколько первых попыток с PYKD, но мне не очень нравятся накладные расходы, поэтому я выбрал стандартный сценарий Windbg, но это становится кошмаром, позвольте мне показать вам, что я хочу сделать:
0:001> kb
# RetAddr : Args to Child : Call Site
00 00007ffc`26272685 : ffffffff`fffffffe 00007ff7`06e563f0 00007ff7`00000000 0000005a`1fb6fd70 : user32!NtUserGetMessage+0xa
01 00007ff7`06d87596 : 00000000`00000008 00007ff7`06e5d048 00000000`00007c1c 0000005a`00000004 : user32!GetMessageW+0x25
02 00007ff7`06d87673 : 0000005a`1f2b3710 00007ff7`06e5c7d0 0000005a`1f2ac270 00000000`00000002 : <Application>!CServiceModule::Run+0x8ee [sourcefile.cpp @ 1905]
03 00007ffc`26875ada : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : <Application>!CServiceModule::ServiceMain+0x63 [sourcefile.cpp @ 1379]
04 00007ffc`26ef13d2 : 00007ffc`26875aa0 0000005a`1f2ac270 00000000`00000000 00000000`00000000 : sechost!ScSvcctrlThreadA+0x3a
05 00007ffc`270454f4 : 00007ffc`26ef13b0 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0x22
06 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x34
0:001> dx Debugger.Sessions[0].Processes[26520].Threads[14812].Stack.Frames[2].SwitchTo();dv /t /v
// The second command "dx ..." happens by clicking on the DML link of the line, corresponding with the line, containing "CServiceModule::Run".
Теперь, как это сделать в скрипте Windbg?
- Запустите команду
kb
и поместите результат в переменную. (Как это сделать? Я уже пытался использовать as
и aS
, но ни один из них не работает)
Если я не могу получить полный результат kb
в одной переменной, попробуйте использовать .foreach
, как в следующем примере:
.foreach ( token { kb} )
{
.printf "TEST\n"
}
=> даже это не работает: kb
имеет около 8 строк результатов, а слово TEST
напечатано 78 раз.
Вместо того, чтобы печатать слово "TEST", выведите переменную token
и посмотрите, как она выглядит.
=> Как это сделать? Я уже пробовал .printf "%msu \n" , ${token}
или @$token
, ... но ничего не работает.
Даже если я получу эту работу: как я могу выполнять строковые манипуляции, преобразование десятичных / шестнадцатеричных чисел, ...?
Не забыть: как мне скомпилировать такой скрипт? В настоящее время я пытаюсь запустить скрипт в Windbg, который иногда выдает ошибки компиляции, но они очень нечитаемы (я добавляю новую строку, вызывающую проблему, но ошибка усложнения (не опечатка) даже не упоминает, что недавно добавленные линия).
Вы можете сказать: просто взгляните на примеры, упомянутые в this URL , но я не могу найти ни одного примера выполнения стандартной команды Windbg и сохранить ее результат в переменная (это первое, что мне нужно сделать).
Если мой скрипт заработает, я могу превратить этот пост в общий «FAQ по скриптингу Windbg» для упомянутых (и недавно добавленных) вопросов.
Редактировать после первого ответа
Я понимаю, что ошибся с командой kb
: фактическая команда, которую мне нужно использовать, - ~* k
, что дает следующий результат:
(Небольшое замечание: у меня есть просто скриншот вместо текстовой копии, чтобы подчеркнуть гиперссылки DML)
Как видите, есть некоторые результаты DML, и я бы хотел "щелкнуть" по строке, содержащей CServiceModule::Run
. Когда я делаю это вручную, кажется, что есть перевод к следующей команде:
dx Debugger.Sessions[0].Processes[26520].Threads[14812].Stack.Frames[2].SwitchTo()
Здесь 26520 - это преобразование HexToDec 6798,
и 14812 - это преобразование HexToDec в 39DC.
(И то, и другое можно получить из скриншота Id: 6798.39dc
)
Так что мне «нужно» манипулирование строками и преобразование HexToDec, чтобы имитировать щелчки DML. Однако, если вы знаете более простой способ сделать это действие «щелчком» в сценарии, я был бы очень благодарен!