вот мой вопрос: В xxx.lib есть статическая библиотека (xxx.lib) и некоторые файлы C, которые вызывают функцию foo()
. Я надеюсь получить уведомление с уведомлением каждый раз, когда вызывается foo()
. Но мне не разрешено изменять какой-либо исходный код, написанный другими.Как перехватить вызов статической библиотеки на языке C?
Я провел несколько дней в Интернете и нашел несколько похожих Q & Так как ни одно из этих предложений не могло действительно решить мою проблему. Я перечислю некоторые из них:
использование
gcc -wrap
: Override a function call in C Слава богу, я использую Microsoft C компилятор и компоновщик, и я не могу найти эквивалентный вариант как-wrap
.Microsoft Detours: Detours перехватывает вызовы C во время выполнения и перенаправляет вызов функции батута. Но Detours доступен только для версии IA32, и он не является открытым исходным кодом.
Я думаю об инъекции инструкции jmp в начале функции
foo()
, чтобы перенаправить ее на мою собственную функцию. Однако это не представляется возможным, когдаfoo()
пуст, какvoid foo() ---> will be compiled into 0xC3 (ret) { but it'll need at least 8 bytes to inject a jmp }
Я нашел технологию под названием Hotpatch на MSDN. В нем говорится, что компоновщик добавит серверные байты заполнения в начале каждой функции. Это здорово, потому что я могу заменить прописные байты командой jmp, чтобы реализовать перехват во время выполнения! Но когда я использую параметр/FUNCTIONPADMIN с линкера, это дает мне предупреждение:
LINK : warning LNK4044: unrecognized option '/FUNCTIONPADMIN'; ignored
Кто-нибудь может сказать мне, как я мог бы сделать «hotpatchable» изображение правильно? Является ли это приемлемым решением для моего вопроса?
Есть ли у меня еще одна надежда на это?
Я не думаю, что это возможно без большого ворчания. Объектные файлы не предназначены для этого. – fuz
Если честно, я бы пошел на вариант 3. Но сначала вам нужно будет найти функцию, которую вы хотите перенаправить, так как экспорта не будет, например, когда у вас есть DLL. Так что да, это можно сделать, но есть много работы. Ссылка, которая может помочь: [Малый учебник] (https://securitycafe.ro/2015/01/28/intercepting-functions-from-statically-linked-libraries/) – inzanez
Да, я видел эту статью. Но это не практично в реальном проекте. Я надеюсь на метод перехвата вызова функции во время выполнения. Интересно, как это делало Detours .... – Sheldon