Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
Elen ©   (2006-05-25 17:00) [0]

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

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

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

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


 
Игорь Шевченко ©   (2006-05-25 17:09) [1]

ApiMon.Exe с ресурсов MS


 
tesseract ©   (2006-05-25 17:25) [2]

Или Apispy с хакерских. (но там не все определения функций есть)


 
ANB ©   (2006-05-25 20:33) [3]


> какая процедура вызывается при выполнении команды "Сохранить
> Как"

Сначала макрос вызвается на VB. Тот прежде всего (точнее, когда отработает все до этого ему нужное) вызывает диалог SaveDialog. Посмотри реализацию SaveDialog в делфи - он тоже через стандартную функцию умеет работать. Отсель и пляши.

А зачем это нужно то ?


 
Elen ©   (2006-05-26 07:50) [4]


>А зачем это нужно то ?

Хочу заменить стандартный диалог сохранения - открытия для всех программ (MS Office, AutoCAD, kompas, Spot Light ..., которые у нас в производстве применяются) чтобы заставить принудительно всех юзеров заполнять карточку документа для создаваемых файлов по определенным правилам, принятым у нас. Я уже у финиша перехватываемые мною для примера функции успешно работают, но нужно знать какие конкретно перехватывать надо (я так думаю что эта функция одна на всех).
Сейчас успешно перехвачен CreateFileA, но хотелось бы избавится от стандартного диалога открыть - сохранить


 
sniknik ©   (2006-05-26 08:41) [5]

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

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


 
Elen ©   (2006-05-26 08:52) [6]


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

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


 
GrayFace ©   (2006-05-26 12:04) [7]

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

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


 
Elen ©   (2006-05-26 14:05) [8]


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

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

Еще вопрос :


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

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


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


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


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


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


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


 
Elen ©   (2006-05-26 14:27) [10]


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

Как это не перехватываю?, перехватываю, ведь 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:39) [11]


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


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

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

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

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


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

Elen ©   (26.05.06 14:27) [10]

"hMod

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

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


 
Elen ©   (2006-05-26 15:11) [13]


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

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


 
Elen ©   (2006-05-26 15:20) [14]


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

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

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

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


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


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


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


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

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

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

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


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

Elen ©   (26.05.06 15:11) [13]


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


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


 
Elen ©   (2006-05-26 16:13) [17]


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

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


 
Elen ©   (2006-05-26 16:17) [18]


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

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

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

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


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


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


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


 
Elen ©   (2006-05-26 16:51) [20]


> Сергей М.

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


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


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


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


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


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


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


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

OllyDbg проще.

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


 
GrayFace ©   (2006-05-27 11:49) [23]

> 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 не будут вызываться другие хуки.


 
Elen ©   (2006-05-29 07:48) [24]


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

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

Imports from comdlg32.dll
010012B0                 extrn GetSaveFileNameW:dword ; DATA XREF: sub_
010012B0                                         ; sub_1002919+126r
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+286r
010012BC                                         ; Extract FileName from FullName
010012C0                 extrn CommDlgExtendedError:dword ; DATA XREF: sub_

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


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

Плохо


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

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


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

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


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.041 c
15-1158343343
SergP
2006-09-15 22:02
2006.10.08
О настройках эксплорера...


15-1158224442
TakTak
2006-09-14 13:00
2006.10.08
Delphi9 и DSPack


2-1158755581
Dr. Genius
2006-09-20 16:33
2006.10.08
Длина hint’ов


2-1158913906
dest81
2006-09-22 12:31
2006.10.08
Выделение цифр из строки


6-1147707573
dmitrlast
2006-05-15 19:39
2006.10.08
Запуск библиотеки клиентом в локальной сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский