Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Это опять я со своим надоедливым вопросом перехвата функций API [WinXP]


Страницы:   1 2

Elen ©   (2006-05-25 17:00:00) 

Ув. Мастера!
Это опять я со своим надоедливым вопросом перехвата функций API.

Дело в том что у меня получилось внедрить свою стороннюю процедуру в Микросос Ворд, которая лежит в созданной мной ДЛЛке. Эта процедура великолепно выполняется (там прописана одна комадна windows.beep). Эта процедура уселась на место CreateFileA для пробы и Ворд ее удачно проглотил (Хотя и глюкнул, но я знаю почему и это сейчас  не важно)

Так вот, у меня теперь осталась одна проблема - узнать какие функции API мне нужно перехватывать при скажем "Сохранить Как".
Перехват GetSaveFileNameA не удался (Ворд по-прежнему выдает нагора свое стандартное окно которое я хочу заменить) значит я делаю вывод - при выборе этого пункта меню вызывается другая процедура

Собственно вопрос : есть ли возможность (какие нибудь программы) отследить какая функция привязана к данной кнопке или хотя бы ее адресс в памяти?
и если кто точно знает какая процедура вызывается при выполнении команды "Сохранить Как"


Elen   (2006-05-29 07:48:00) [1]


> n0name Всё таки дизасм должен тебе помочь.

Вот вырвано из Ворда с помощью IDA Pro

Imports from comdlg32.dll
010012B0                 extrn GetSaveFileNameW:dword ; DATA XREF: sub_
010012B0                                         ; sub_1002919+126\x19r
010012B0                                         ; Create a Save common dialog box
010012B4                 extrn GetOpenFileNameW:dword ; DATA XREF: sub_
010012B4                                         ; Create an Open common dialog box
010012B8                 extrn ReplaceTextW:dword ; DATA XREF: sub_1002919+
010012B8                                         ; Create a system-defined modeless
010012B8                                         ; dialog box for text-replace
010012BC                 extrn GetFileTitleW:dword ; DATA XREF: sub_1001C5B+
010012BC                                         ; sub_1005B6C+286\x19r
010012BC                                         ; Extract FileName from FullName
010012C0                 extrn CommDlgExtendedError:dword ; DATA XREF: sub_

Правильно ли я понимаю что вызовы этих функций тут описаны статически
если да то имеет ли смысл их вызывать динамически? (не думаю)


> GrayFace © Да мусора в exe-шках всегда полно. Например, мог быть класс с виртуальным методом, вызывающим эту функцию.

Плохо


> Сергей М. ©  Ты движешься в неверном направлении.

Это уже понятно, но на ошибках учатся.
Кстати для Офиса и Акада можно написать макросы и шаблоны (попробую еще сюда порыть...)


> GrayFace ©> или популярной InjectDLL (Думаю знаете о чем идет речь)?
Вообще-то нет.

Это выдрано из Hook_full.chm (автор MS Rem)


> По поводу примера мышинного хука.

Уже все получилось! (из ДЛЛ)


GrayFace   (2006-05-27 11:49:00) [2]

> Elen ©   (26.05.06 14:05) [8]
>
> > Это не стандартный диалог, а специальный оффисовский
>
> Дизасемблировав Ворд можно найти функцию GetSaveFileName,
>  которую мне подсказали. Я ее перехватываю но Ворд не вызывает
> ее вообще.
> Зачем она тогда там?

Да мусора в exe-шках всегда полно. Например, мог быть класс с виртуальным методом, вызывающим эту функцию.

> > GrayFace ©
> Поставить хук на GetMessage
>
> Как предпочтительнее ставить хук через SetWindowsHook
> или популярной InjectDLL (Думаю знаете о чем идет речь)?

Вообще-то нет. Я знаю только Рихтеровские методы, detours и еще есть одна своя задумка. Но предпочтительнее SetWindowsHookEx, т.к. сам хук будет полезен - с Вордом, по-моему, проще всего разобраться ловя сообщения.

По поводу примера мышинного хука.
1) Есть два типа хуков - System only и Thread or system. Все существующие хуки первого типа можно ставить из приложения, а чтобы глобально ставить хуки второго типа нужна dll.
2) Не забывай, что hhook должен лежать в MMF, разделяемой экземплярами dll'ки. Иначе на виндах ниже 2000 не будут вызываться другие хуки.


n0name   (2006-05-26 18:51:00) [3]


> собираюсь доставать Soft Ice.

OllyDbg проще.

Всё таки дизасм должен тебе помочь.


Сергей М.   (2006-05-26 16:59:00) [4]


> Elen ©   (26.05.06 16:51) [20]


Ты движешься в неверном направлении.


Elen   (2006-05-26 16:51:00) [5]


> Сергей М.

У меня появилась альтернативная мысль вставить в приложения свой пункт меню, но некоторые проги меню содержат в ToolBoxе. Только АвтоКАД клюнул на замену в системном его меню нужного мне пункта.


> Суть одна и та же: либо адрес т.входа вычисляется единожды (стат.импорт, это требует мод-ции IAT) и затем используется всеми потоками процесса, либо всякий поток процесса волен получить тот самый адрес т.входа в ран-тайм, вызвав GetProcAddr(это требует мод-ции EAT)


Все эти проги кроме Ворда и АвтоКАДа судя по моим экспериментам вычисляют адреса функций статически


Сергей М.   (2006-05-26 16:40:00) [6]


> Elen ©   (26.05.06 16:17) [18]
> еще меня парит


Суть одна и та же: либо адрес т.входа вычисляется единожды (стат.импорт, это требует мод-ции IAT) и затем используется всеми потоками процесса, либо всякий поток процесса волен получить тот самый адрес т.входа в ран-тайм, вызвав GetProcAddr(это требует мод-ции EAT)


Elen   (2006-05-26 16:17:00) [7]


> Тебя-то "парит" конкретная - MSWORD.EXE !

еще меня парит : AutoCAD + MDT6, Spot light, Kompas, MS Office. Документация наших юзерей в основном создается именно в этих пакетах. Остальные проги меня интересуют постольку-поскольку

> Вот и исследуй ее - КАК она (ее потоки !) получает точку входа в интересующую ф-цию ..

Исследую c помошью IDA Pro и собираюсь доставать Soft Ice.


Elen   (2006-05-26 16:13:00) [8]


>Не обязательно. Но в случае вызова его не из DLL он будет работать только с окнами твоего приложения.

Все это решено. Спасибо!


Игорь Шевченко   (2006-05-26 15:54:00) [9]

Elen ©   (26.05.06 15:11) [13]


> А что этот вид хука обязательно должен вызываться из DLL?


Не обязательно. Но в случае вызова его не из DLL он будет работать только с окнами твоего приложения.


Сергей М.   (2006-05-26 15:53:00) [10]


> Elen ©   (26.05.06 15:20) [14]


> в другой программе


Да мало ли какие "другие программы" существуют !

Тебя-то "парит" конкретная- MSWORD.EXE !

Вот и исследуй ее - КАК она (ее потоки !) получает точку входа в интересующую ф-цию ..

Не все так просто, барышня, как тебе кажется ..


Elen   (2006-05-26 15:20:00) [11]


>Одни для твоей цели годятся, другие не годятся.

То что ты перехватила CreateFile() вовсе не говорит о том что и любые иные вызовы ты столь же успешно перехватишь при той самой конкретно выбранной тобой технологии.

Это да, но в другой программе, где используется TSaveDialog перехват получается (причем я уже знаю точно, что он работает как раз через GetSaveFileName).

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


Elen   (2006-05-26 15:11:00) [12]


>Где в твоем примере DLL ?

А что этот вид хука обязательно должен вызываться из DLL?
Кстати, какие хуки можно хватать без DLL?


Игорь Шевченко   (2006-05-26 14:53:00) [13]

Elen ©   (26.05.06 14:27) [10]

"hMod

Identifies the DLL containing the hook procedure pointed to by the lpfn parameter. "

Где в твоем примере DLL ?


Сергей М.   (2006-05-26 14:39:00) [14]


> Как это не перехватываю?, перехватываю, ведь CreateFileA
> и другие все-таки накрываются моим кодом


Существует множество технологий перехвата.

Одни для твоей цели годятся, другие не годятся.

То что ты перехватила CreateFile() вовсе не говорит о том что и любые иные вызовы ты столь же успешно перехватишь при той самой конкретно выбранной тобой технологии.

Простой пример : технология перехвата модификацией IAT. При ее использовании не возможен перехват вызовов, точки входа в которые получены динамически (GetProcAddr), из-за того что данная технология не предусматривает также и необходимую в дан.случае модификацию EAT целевого модуля.


Elen   (2006-05-26 14:27:00) [15]


> Не факт что не перехватываешь. Смотря как работает логика твоего перехвата.
И не факт что не вызывает.

Как это не перехватываю?,перехватываю, ведь CreateFileA и другие все-таки накрываются моим кодом
значит код работает правильно. А вот то что он может как-то обходит вызов этой функции

и кстати вопросик : У меня Mouse hook странно работает :


  function _(code:Integer;w:WPARAM;l:LPARAM):word;stdcall;

var      hook:HHOOK;
 Form1: TForm1;

implementation

{$R *.dfm}
  function _;
begin
beep;
result:=CallNextHookEx(hook,code,w,l) ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hook:=SetWindowsHookEx(WH_MOUSE,@_,HInstance,0);
if hook=0 then Application.MessageBox('no','');
nop;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnhookWindowsHookEx(hook);
end;

end.

Эта часть кода ставит Хук на мышку. Фишка в том что пока я верчу мышкой в своем окне Хук срабатывает. Как только я двигаю мышку за пределы окна (скажем на рабочий стол) хук перестает срабатывать и как бы снимается.
Подскажите пожалуйста где тут загогулина (я предполагаю что это связано с HInstance но как исправить и откуда такой эффект)?


Сергей М.   (2006-05-26 14:16:00) [16]


> GetSaveFileName, которую мне подсказали. Я ее перехватываю
> но Ворд не вызывает ее вообще


Не факт что не перехватываешь. Смотря как работает логика твоего перехвата.
И не факт что не вызывает.


> Как предпочтительнее ставить хук через SetWindowsHook
> или популярной InjectDLL


Да как угодно.
Лишь бы хотя бы на короткое время получить управление в одном из кодовых потоков процесса-"жертвы".


Elen   (2006-05-26 14:05:00) [17]


> Это не стандартный диалог, а специальный оффисовский

Дизасемблировав Ворд можно найти функцию GetSaveFileName, которую мне подсказали. Я ее перехватываю но Ворд не вызывает ее вообще.
Зачем она тогда там?

Еще вопрос :


> GrayFace ©
Поставить хук на GetMessage

Как предпочтительнее ставить хук через SetWindowsHook
или популярной InjectDLL(Думаю знаете о чем идет речь) ?


GrayFace   (2006-05-26 12:04:00) [18]

Это не стандартный диалог, а специальный оффисовский, скорее всего даже чисто Вордовский - в названии класса слово Word. Так что поймать не так то просто. Лучше ставить хук, как я говорил. Класс этого диалога ни с чем нельзя спутать. Затем искать первый видимый RichEdit20W. Удивительно, что кнопки Ok и Отмена не являются окнами, но с этим нет никаких проблем.

P.S. По-моему, лучше было бы все держать в одной теме.


Elen   (2006-05-26 08:52:00) [19]


> решение административных проблем программированием к хорошему не приведет. имхо.

Попытка не пытка (другого варианта не остается)


sniknik   (2006-05-26 08:41:00) [20]

> Хочу заменить стандартный диалог сохранения - открытия для всех программ (MS Office ...
диалог в MS Office не стандартно виндовый, у них свой.

> чтобы заставить принудительно всех юзеров заполнять карточку документа ...
решение административных проблем программированием к хорошему не приведет. имхо.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо