![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Это опять я со своим надоедливым вопросом перехвата функций API [WinXP]
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 не стандартно виндовый, у них свой.
> чтобы заставить принудительно всех юзеров заполнять карточку документа ...
решение административных проблем программированием к хорошему не приведет. имхо.