Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват API функций работающих с файлами, реализовал, но есть нюансы.... 
:(
    Опции темы
shara
Дата 27.7.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Доброго времени суток 
Реализовал перехват API-функций путем затирания первых байт родной функции командой перехода на подменяющую(свою) функцию. Протестил - все работает нормально.
Код подменяющий АПИ-функции реализовал библиотечкой и насильно гружу ее в уже запущенную прогу. на обычном Блокноте эта технология работает отлично - никаких сбоев, когда Блокнот пытается сохранить файл, я  нужным мне способом модифицирую сохраняемый файл и только после этого пишу его на диск. тестил на Paint`е - немного тормозит но все же работает так как нужно. Прога InfranView - при попытке чтения записи файла падает с грохотом - но это пока меня не очень огорчает. В вот в MS Word 2007 эффект от моей библиотеки сводится к нулю. Хотя Библиотека загружается корректно, и перехвачиваемые мною функции работы с файлами вызываются(т.е. Ворд их реально использует), НО файл сохраняется в не модифицированном виде. 
собсно вопрос:
я перехватываю API функции: CreateFileA, CreateFileW, ReadFile, WriteFile, CloseHahdle и этого явно не достаточно чтобы заставить Ворд сейвить то что мне нужно...   может кто подскажет, как можно обойти сей нюанс. Буду рад любому совету.

Спасибо  


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
jonie
Дата 28.7.2009, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата
 Прога InfranView - при попытке чтения записи файла падает с грохотом - но это пока меня не очень огорчает. 

меня бы огорчило...
Возьмите OllyDBG и посмотрите что там ворд делает.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 28.7.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



В порядке предположения - Word использует для чтения/записи своих файлов Ole Storage, так что перехват ReadFile & WriteFile нужно делать не в exe'нике Word'а, а в dll COM сервера, отвечающего за IStorage (Ole32.dll)


Это сообщение отредактировал(а) xvr - 28.7.2009, 10:58
PM MAIL   Вверх
jonie
Дата 28.7.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



xvr какая разница, если это inproc сервер?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GremlinProg
Дата 28.7.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

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

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

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

Это сообщение отредактировал(а) GremlinProg - 28.7.2009, 11:40


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
azesmcar
Дата 28.7.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



shara

Почему бы не использовать detours.lib для перехвата WinAPI?
PM   Вверх
xvr
Дата 28.7.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

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

PM MAIL   Вверх
shara
Дата 28.7.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



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?



--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
azesmcar
Дата 29.7.2009, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



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

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

Это сообщение отредактировал(а) azesmcar - 29.7.2009, 07:02
PM   Вверх
xvr
Дата 29.7.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(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 куда то, то пройти по этому адресу. После чего патчить.


Это сообщение отредактировал(а) xvr - 29.7.2009, 12:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.