2016-03-19 8 views
-1

Что я хотел бы сделать, так это установить условную точку останова для всех функций из nt, называемых указанным модулем.Установка условной точки останова для всех функций, называемых модулем? (WINDBG x64)

Моя цель при этом состоит в том, чтобы написать callstack каждый раз, когда X-модуль вызывает функцию x nt, тем самым позволяя «отображать» то, что происходит внутри закодированного кода.

После взлома точки входа я установил точку останова на функцию x nt. После возобновления моей точки останова хит, и CallStack выглядит как функция

нт!

moduleIspecified! 0x123

....

Моя идея была тогда, что я мог бы использовать это, чтобы написать код для условной точки останова, что-то вроде: «IF caller - это x модуль, а модуль вызывает функцию внутри y модуля. THEN log callstack.».

Стоит отметить, что часы и трассировка не поддерживаются в режиме ядра x64. Его также стоит упомянуть, что я решил использовать этот подход, потому что я не мог определить вызовы, статически анализируя его, и анализ его путем шага также невозможен.

А также: был бы лучший/идеальный подход для достижения этого?

С уважением

ответ

1

Вы не можете сделать это точно, но есть несколько альтернатив, вы могли бы рассмотреть.

Прежде всего - почему бы просто не использовать Sysinternals' Process Monitor или, возможно, Rohitab's API Monitor?

Если вы намереваетесь делать это самостоятельно, первые проблемы, с которыми вы сталкиваетесь, это то, что существует небольшое ограничение на количество точек останова, которое может установить отладчик ядра (32 - это последнее число, которое я помню). Это ограничение связано не с хостом, а с WinDbg/kd, а скорее с компонентом отладчика ядра на целевом компьютере. Вы можете видеть это в WRK. Но даже если бы вы могли, это было бы чрезвычайно медленным.

Первый вариант у вас есть это, но точка останова в syscall/sysenter рутина (nt!KiFastCallEntry, nt!KisystemCall64, или то, что сегодня), и поместить ваши команды. Как я уже сказал, это будет чрезвычайно медленный. Вы можете попробовать сами, если не верите мне (даже без умного состояния, просто введите любую команду там, даже просто простую gc, не говоря уже о .echo ...).

Вторая альтернатива, о которой я могу думать, это написать драйвер, который перехватывает интересующие вас системные вызовы (или рутину syscall). Это экономит ваше путешествие между ведущими и целевыми машинами. Обратите внимание, что вам все равно необходимо подключить отладчик, чтобы отключить KPP (PatchGuard) или использовать 32-разрядную машину. И это, вероятно, сложнее, чем использование ProcMon, API Monitor или, возможно, xperf/WPT.

Я бы предложил использовать простые и очевидные вещи (ProcMon/API Monitor), прежде чем переходить к слишком сложным.

 Смежные вопросы

  • Нет связанных вопросов^_^