Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата
 Прога InfranView - при попытке чтения записи файла падает с грохотом - но это пока меня не очень огорчает. 

меня бы огорчило...
Возьмите 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 сервер?

Автор: GremlinProg 28.7.2009, 11:37
Цитата(shara @  27.7.2009,  23:11 Найти цитируемый пост)
Реализовал перехват API-функций путем затирания первых байт родной функции командой перехода на подменяющую(свою) функцию.

Цитата(shara @  27.7.2009,  23:11 Найти цитируемый пост)
Прога InfranView - при попытке чтения записи файла падает с грохотом

такой способ перехвата подразумевает эксклюзивный доступ к функции,
т.е., к ней нельзя обращаться сразу из нескольких потоков

Добавлено через 5 минут и 33 секунды
еще есть набор функций файл-мэппинга, которыми можно спокойно обойти Read/WriteFile

Автор: azesmcar 28.7.2009, 12:29
shara

Почему бы не использовать detours.lib для перехвата WinAPI?

Автор: xvr 28.7.2009, 16:41
Цитата(jonie @ 28.7.2009,  11:20)
xvr какая разница, если это inproc сервер?

Это зависит от способа перехвата. Вполне возможен перехват, при котором можно модифицировать адреса (или саму) в PLT, а не сами функции. Тогда будет разница, если для exe PLT модифицировали, а для dll - нет

Автор: shara 28.7.2009, 23:50
xvr
Цитата(xvr @  28.7.2009,  09:58 Найти цитируемый пост)
перехват ReadFile & WriteFile нужно делать не в exe'нике Word'а, а в dll COM сервера, отвечающего за IStorage (Ole32.dll)


а можно уточнить в самом общем виде, как это делается?

Цитата(GremlinProg @  28.7.2009,  10:37 Найти цитируемый пост)
такой способ перехвата подразумевает эксклюзивный доступ к функции,
т.е., к ней нельзя обращаться сразу из нескольких потоков

есть такое... пока буду уповать на то, что файлы не будут одновременно сохраняться в двух или более потоках

Добавлено через 9 минут и 25 секунд
azesmcar
а detours.lib сможет "надуть" ворд? если перехватывать нужные API?

Автор: azesmcar 29.7.2009, 07:02
Цитата(shara @  28.7.2009,  23:50 Найти цитируемый пост)
а detours.lib сможет "надуть" ворд? если перехватывать нужные API?

Я использовал, ни одна программа не сдувалась.
http://research.microsoft.com/en-us/projects/detours/

Автор: xvr 29.7.2009, 12:04
Цитата(shara @ 28.7.2009,  23:50)
xvr
Цитата(xvr @  28.7.2009,  09:58 Найти цитируемый пост)
перехват ReadFile & WriteFile нужно делать не в exe'нике Word'а, а в dll COM сервера, отвечающего за IStorage (Ole32.dll)


а можно уточнить в самом общем виде, как это делается?

В 'общем виде' лучше использовать detours.lib  smile 

В подробностях - нужно найти модуль, экспортирующий нужные функции (например через TooHelp API) и парсить его таблицу импорта. По найденным адресам патчить код.

Либо можно позвать LoadLibrary на нужный модуль (он вернет handle на уже загруженную библиотеку), а затем GetProcAddress. Дополнительно можно проверить, что если то, что вернул GetProcAddress состоит из jmp куда то, то пройти по этому адресу. После чего патчить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)