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

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

syelogd.exe /q C:UsersxxxDesktoplog.txt 
withdll.exe /d:traceapi.dll C:Program FilesGoogleGoogle Talkgoogletalk.exe

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

20101221060413329 2912 50.60: traceapi: 001 GetCurrentThreadId()

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

4 ответов


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

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

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

Deviare API Hook Design

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

Если вам нужно написать код в целевой процесс, используя Deviare API Hook можно использовать Deviare Пользовательские Крючки. Эта функция позволяет перехватывать API и асинхронно обрабатывать обрабатываемые параметры.


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

существует также подробное описание того, как это работает на сайте.

alt text

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


прежде всего, я бы очень посоветовал, что если вы хотите выполнить API-подключение, я бы пошел с easyhook:http://easyhook.codeplex.com/ (с открытым исходным кодом). Это очень хорошая и простая структура api-подключения.

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

EDIT: просто добавьте еще одно приложение. http://www.rohitab.com/ похоже на WinAPIOVerride32, но он поддерживает 64bit, и он действительно улучшился, так как я написал этот ответ. Я должен отметить, что в некоторых случаях он пропустил вызовы API, которые я нашел в WinAPIOverride32, но его все еще довольно хорошо. К сожалению, источник не опубликован.

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

надеюсь, что это помогает! :-)


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

вы также можете попробовать другие инструменты, такие как Контролировать Процесс и Инструментарий Производительности Windows как пояснил здесь.