Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Перехват API функций работающих с файлами |
Автор: shara 27.7.2009, 21:11 |
Доброго времени суток Реализовал перехват API-функций путем затирания первых байт родной функции командой перехода на подменяющую(свою) функцию. Протестил - все работает нормально. Код подменяющий АПИ-функции реализовал библиотечкой и насильно гружу ее в уже запущенную прогу. на обычном Блокноте эта технология работает отлично - никаких сбоев, когда Блокнот пытается сохранить файл, я нужным мне способом модифицирую сохраняемый файл и только после этого пишу его на диск. тестил на Paint`е - немного тормозит но все же работает так как нужно. Прога InfranView - при попытке чтения записи файла падает с грохотом - но это пока меня не очень огорчает. В вот в MS Word 2007 эффект от моей библиотеки сводится к нулю. Хотя Библиотека загружается корректно, и перехвачиваемые мною функции работы с файлами вызываются(т.е. Ворд их реально использует), НО файл сохраняется в не модифицированном виде. собсно вопрос: я перехватываю API функции: CreateFileA, CreateFileW, ReadFile, WriteFile, CloseHahdle и этого явно не достаточно чтобы заставить Ворд сейвить то что мне нужно... может кто подскажет, как можно обойти сей нюанс. Буду рад любому совету. Спасибо |
Автор: jonie 28.7.2009, 06:56 | ||
Возьмите OllyDBG и посмотрите что там ворд делает. |
Автор: xvr 28.7.2009, 10:58 |
В порядке предположения - Word использует для чтения/записи своих файлов Ole Storage, так что перехват ReadFile & WriteFile нужно делать не в exe'нике Word'а, а в dll COM сервера, отвечающего за IStorage (Ole32.dll) |
Автор: jonie 28.7.2009, 11:20 |
xvr какая разница, если это inproc сервер? |
Автор: azesmcar 28.7.2009, 12:29 |
shara Почему бы не использовать detours.lib для перехвата WinAPI? |
Автор: xvr 28.7.2009, 16:41 | ||
Это зависит от способа перехвата. Вполне возможен перехват, при котором можно модифицировать адреса (или саму) в PLT, а не сами функции. Тогда будет разница, если для exe PLT модифицировали, а для dll - нет |
Автор: shara 28.7.2009, 23:50 | ||||
xvr,
а можно уточнить в самом общем виде, как это делается?
есть такое... пока буду уповать на то, что файлы не будут одновременно сохраняться в двух или более потоках Добавлено через 9 минут и 25 секунд azesmcar, а detours.lib сможет "надуть" ворд? если перехватывать нужные API? |
Автор: azesmcar 29.7.2009, 07:02 |
Я использовал, ни одна программа не сдувалась. http://research.microsoft.com/en-us/projects/detours/ |
Автор: xvr 29.7.2009, 12:04 | ||||
В 'общем виде' лучше использовать detours.lib ![]() В подробностях - нужно найти модуль, экспортирующий нужные функции (например через TooHelp API) и парсить его таблицу импорта. По найденным адресам патчить код. Либо можно позвать LoadLibrary на нужный модуль (он вернет handle на уже загруженную библиотеку), а затем GetProcAddress. Дополнительно можно проверить, что если то, что вернул GetProcAddress состоит из jmp куда то, то пройти по этому адресу. После чего патчить. |