А вы автоматизируете отладку?

Ещё в группе «Фишинг и песочница»
- ⚡Фейковые новости — В С Ё
⚡Фейковые новости — В С Ё Специалисты PT ESC обнаружили связанную между собой сеть новостных сайтов,…
- Группа киберразведки PT ESC представила обзор кибератак за II квартал 2026 года ✍️
Группа киберразведки PT ESC представила обзор кибератак за II квартал 2026 года ✍️ В отчете проанализирована…
- Гражданин, обновитесь 🫵
Гражданин, обновитесь 🫵 Недавно к нам в песочницу залетел семпл mir-pay.apk. На первый взгляд — ничего…
- NetMedved: летняя кампания против российских организаций
NetMedved: летняя кампания против российских организаций 🐻👍 Группа киберразведки PT ESC зафиксировала новую волну активности хакерской…
- АИ-95 с вредоносной присадкой ⛽️
АИ-95 с вредоносной присадкой ⛽️ В середине июня командой Threat Intelligence было обнаружено сразу несколько ресурсов,…
Команде экспертов PT Sandbox в работе часто приходится отлаживать различные компоненты ядра Windows, и без ядерного отладчика здесь не обойтись. Чем чаще мы этим занимаемся, тем больше желание оптимизировать этот процесс.
Часто при отладке хочется посмотреть изменение переменных, аргументов, различных значений рантайма. Этого можно добиться условными брейк-пойнтами и командами. Много лет назад в WinDbg появилась поддержка новой модели данных. Командой
dx можно объявлять свои переменные, структуры, вызывать JavaScript-функции и делать LINQ-запросы.Например, мы хотим зажурналировать все открытые файлы процессом
explorer.exe:0: kd> dx @$explorer = "explorer.exe"
0: kd> bp /w "@$curprocess.Name.ToLower().StartsWith(@$explorer)" nt!NtCreateFile "dx ((_OBJECT_ATTRIBUTES*)@r8)->ObjectName->Buffer; gc"
Code language: PowerShell (powershell)Если же условия или логика перехвата более сложная, без скрипта не обойтись. Рассмотрим пример.
Допустим, мы хотим поймать и сохранить шеллкод, внедряемый в удаленный процесс. Для этого потребуется перехватить функцию
NtWriteVirtualMemory, проверить, принадлежит ли описатель текущему процессу, и в противном случае сохранить регион памяти на диск. Как это выглядит в скрипте:"use strict";
function WriteMemoryCallback()
{
if (host.currentThread.Registers.User.rcx == -1)
{
return;
}
let address = host.currentThread.Registers.User.rdx;
let buffer = host.currentThread.Registers.User.r8;
let length = host.currentThread.Registers.User.r9;
let filename = ${host.currentProcess.Name}-${buffer.toString(16)}.dmp;
let file = host.namespace.Debugger.Utility.FileSystem.TempDirectory.CreateFile(
filename, 'CreateNew');
file.WriteBytes(host.memory.readMemoryValues(buffer, length, 1));
host.diagnostics.debugLog(`dumped ${length} bytes to ${filename}\n`);
file.Close();
}
function initializeScript()
{
return [new host.apiVersionSupport(1, 9)];
}
function invokeScript()
{
let bp = host.namespace.Debugger.Utility.Control.SetBreakpointAtOffset("NtWriteVirtualMemory", 0, "nt");
bp.Command = `dx @$scriptContents.WriteMemoryCallback(); gc`;
}
Code language: JavaScript (javascript)Иногда может не хватать набора API JavaScript-движка — с помощью
ExecuteCommand можно вызвать любую команду отладчика, например чтобы удалить брейк-пойнт или поставить его по конкретному адресу:let exec = host.namespace.Debugger.Utility.Control.ExecuteCommand;
let command = `dx @$scriptContents.BreakPointCallback(); gc`;
exec("bc *");
exec(`bp 0xfffffc024d546a88 "${command}"`);
Code language: JavaScript (javascript)Также JavaScript позволяет дополнять модель данных отладчика, например добавлять инфу о секциях загруженных DLL или дополнительную команду, аналогичную
!handle, !address и т. п.Допустим, мы хотим перечислить коллбэки на создание процесса, потока и загрузку DLL. Для этого нужно создать команду, например
!callbacks:const log = x => host.diagnostics.debugLog(x + '\n');
const u64 = x => host.memory.readMemoryValues(x, 1, 8)[0];
const exec = x => host.namespace.Debugger.Utility.Control.ExecuteCommand(x);
function ParseCallbacks(Symbol, Size)
{
log([+] ${Symbol}:);
let base = host.getModuleSymbolAddress("nt", Symbol);
if (base == null)
return;
for (let i = 0; i < Size; i++)
{
let entry = u64(base.add(i * 8));
if (entry.compareTo(0) != 0)
{
entry = entry.bitwiseAnd(-16);
let callback = u64(entry.add(8));
log(\t${exec(.printf "%y", ${callback}).First()});
}
}
}
function CallbackEnumerator()
{
ParseCallbacks("PspCreateProcessNotifyRoutine", 64);
ParseCallbacks("PspCreateThreadNotifyRoutine", 64);
ParseCallbacks("PspLoadImageNotifyRoutine", 8);
}
function initializeScript()
{
return [new host.apiVersionSupport(1, 7),
new host.functionAlias(CallbackEnumerator, "callbacks")];
}
Code language: JavaScript (javascript)Результат на скрине. Современный WinDbg позволяет сильно автоматизировать процесс реверса, и у опытного аналитика наверняка есть комплект часто используемых скриптов.
#avlab #sandboxteam #tips
@ptescalator
Ещё в группе «Фишинг и песочница»
- ⚡Фейковые новости — В С Ё
⚡Фейковые новости — В С Ё Специалисты PT ESC обнаружили связанную между собой сеть новостных сайтов,…
- Группа киберразведки PT ESC представила обзор кибератак за II квартал 2026 года ✍️
Группа киберразведки PT ESC представила обзор кибератак за II квартал 2026 года ✍️ В отчете проанализирована…
- Гражданин, обновитесь 🫵
Гражданин, обновитесь 🫵 Недавно к нам в песочницу залетел семпл mir-pay.apk. На первый взгляд — ничего…
- NetMedved: летняя кампания против российских организаций
NetMedved: летняя кампания против российских организаций 🐻👍 Группа киберразведки PT ESC зафиксировала новую волну активности хакерской…
- АИ-95 с вредоносной присадкой ⛽️
АИ-95 с вредоносной присадкой ⛽️ В середине июня командой Threat Intelligence было обнаружено сразу несколько ресурсов,…







