Как работает Microsoft Detours и как его использовать для получения трассировки стека? - PullRequest
21 голосов
/ 22 декабря 2010

Я новичок в Microsoft Detours. Я установил его, чтобы отслеживать системные вызовы процесса. Я запускаю следующие команды, полученные из Интернета

syelogd.exe /q C:\Users\xxx\Desktop\log.txt 
withdll.exe /d:traceapi.dll C:\Program Files\Google\Google Talk\googletalk.exe

Я получаю файл журнала. Проблема в том, что я не до конца понимаю, что здесь происходит. Как работают обходные пути? Как он отслеживает системные вызовы? Также я не знаю, как прочитать вывод в log.txt. Вот одна строка в log.txt

20101221060413329 2912 50.60: traceapi: 001 GetCurrentThreadId()

Наконец, я хочу получить трассировку стека процесса. Как я могу получить это?

Ответы [ 4 ]

25 голосов
/ 27 декабря 2010

Обход позволяет перехватить любую функцию.Он помещает jmp в адрес, который вы указываете, создавая батут для вашего кода.Наконец, вы вызываете старую функцию, если хотите это сделать.Чтобы использовать Detours, вы должны внедрить свой код в процесс, который вы хотите перехватить.

Чтобы упростить этот процесс, вы можете использовать Deviare API Hook , который выполняет весь процесс инъекции, и вы можете использовать перехватприложения из любого языка программирования, поддерживающего технологию COM, включая .NET, Delphi, C ++, Python и т. д. После загрузки пакета вы найдете в нем несколько примеров.Существует консоль с именем DeviareCSharpConsole, которая позволяет перехватывать любой API-интерфейс любого процесса, показывающего полную информацию трассировки стека.

Это способ зацепка Deviare API , но вам нужно это сделать, если выхотите создать приложение, которое перехватывает другой процесс:

Deviare API Hook Design

В целевом процессе должен быть создан агент для перехвата API-интерфейсов, которые вы хотите.Для перехвата этих API вы можете использовать Detours, но вам нужно кодировать персонал IPC, который не включен в эту библиотеку.

Если вам нужно написать код внутри целевого процесса, используя Deviare API Hook , выможно использовать Deviare Custom Hooks .Эта функция позволяет перехватывать API и обрабатывать обработанные параметры асинхронно.

22 голосов
/ 31 декабря 2010

Вместо обходных путей (которые бесплатны только для 32-разрядных систем) или easyhook (например, маленький битный грязный код) вы можете попробовать mhook 2.4 что очень аккуратный код и BSD-лицензированы.Работает на x86 и x64, обрабатывает IP-относительный код и т. Д.

Также есть подробное описание того, как это работает на сайте.

alt text

Что касаетсяобратная трассировка стека, вы можете использовать CaptureStackBackTrace () из kernel32, или, если вы хотите получить фантазию, используйте StackWalk64 () из dbghelp.

16 голосов
/ 25 декабря 2010

Прежде всего, я бы НАСТОЯТЕЛЬНО посоветовал, что если вы хотите выполнить перехват API, я бы выбрал easyhook: http://easyhook.codeplex.com/ (с открытым исходным кодом).Это ОЧЕНЬ хороший и простой фреймворк для подключения API.

О том, как получить трассировку стека, я точно не помню, как это сделать, но посмотрите WinAPIOverride32: http://jacquelin.potier.free.fr/winapioverride32/ (открытьисточник).Он делает именно это, и это с открытым исходным кодом.Кроме того, если вам нужны следы для исследований, WinAPIOverride32 - отличное приложение, которое можно использовать для изучения работы приложений.

РЕДАКТИРОВАТЬ: просто добавьте еще одно приложение.http://www.rohitab.com/ похоже на WinAPIOVerride32, но поддерживает 64-битную версию и действительно улучшилось с тех пор, как я написал этот ответ.Я должен отметить, что в некоторых случаях он пропускал вызовы API, которые я нашел в WinAPIOverride32, но это все еще довольно хорошо.К сожалению, источник не опубликован.

О том, как работает API-перехват, ну, это длинное объяснение, я бы указал вам на эту статью: http://www.codeproject.com/KB/system/hooksys.aspx Это дает довольно хорошее объяснение того, как оно работает.сделано под капотом (кроме того, что там написано, есть и другие методы, но, тем не менее, это очень хорошая статья).

Надеюсь, это поможет!: -)

3 голосов
/ 27 декабря 2010

Если вам разрешено использовать что-то отличное от Detours, вы можете установить отладчик, такой как WinDbg, и присоединить его к процессу , чтобы получить стек вызовов.

Вы также можете попробовать другие инструменты, такие как Process Monitor и Инструментарий производительности Windows , как описано здесь .

...