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

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

Выгрузка WinApi перехватчика [D7, WinXP]


Страницы:   1 2 3 4 5 6 7 8 9

KygECHuK ©   (2008-08-26 10:33:00) 

занимаюсь автоматизированным тестированием, оформил плагин для перехвата отрисовки текста. он подменяет адресса к функциям в таблице импорта, в моём случае это textOut в GDI32.dll. Всё работает хорошо, вот только что при выгрузке перхватчика с некоторойй вероятностью появлятся ошибка доступа к памяти...

Возможно кто нибудь занимался подомной проблематикой и может что нибудь посоветовать...


KygECHuK   (2008-09-01 15:13:00) [81]


> А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте
> этого трэда пытаешься установить хук ?


Не я не изаращенец.... имхо... :)

Вот ставлю хук... ну в DLLEntryPoint на DLL_PROCESS_ATTACH инициализирую прехват.

предвосхищая ворпрос, сразу скажу, что HookHandle лежит в расшареном файле.


Сергей М.   (2008-09-01 15:01:00) [82]

А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте этого трэда пытаешься установить хук ?


KygECHuK   (2008-09-01 14:51:00) [83]

Вот



function CallBack(nCode: Integer; wprm: WParam;
 lprm: LParam): LResult;
begin
 result := CallNextHookEx(Modulescope.sm_pInstance.HookHandle, nCode, wprm, lprm);
end;



и всё


Сергей М.   (2008-09-01 14:49:00) [84]

Показывай тело колбэка ..


KygECHuK   (2008-09-01 14:43:00) [85]


> Ты пример из [81] имеешь ввиду ?

нет, там всё понятно...
я уже внес изменения в свой код, и вот тут такое...

вот код:

function TRemThreadInjector.DoInjectModuleIntoGUI(process: TExeModuleInstance): boolean;
var
 szLibFile        : TShortCharArr;
 Found            : boolean;
 ModuleInstance   : TModuleInstance;
 i                : Integer;
 Tid              : Cardinal;
begin
 Result := FALSE;

if (nil = Process) then
   exit;

GetModuleFileNameA(
 ModuleFromAddress(@sm_CritSecInjector),
 szLibFile,
 MAX_PATH
 );

Found := FALSE;
for i := 0 to Process.GetModuleCount() - 1 do
begin
 ModuleInstance := Process.GetModuleByIndex(i);
 if (0 = AnsiStrIComp(ModuleInstance.FullName, szLibFile)) then
 begin
  Found := TRUE;
  break;
 end; // if
end; // for
if (Found) then
 exit;
 // Получаем идентификатор потока целевого окна
 Tid := GetWindowThreadProcessId(TModuleScope(m_ModeleScope).TargWindow);

 // Устанавливаем ловушку
 TModuleScope(m_ModeleScope).HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @CallBack,  HInstance, TID);

 // Псылаем характерное сообщение
 if  TModuleScope(m_ModeleScope).HookHandle  <>  0  then
   PostThreadMessage(tid,  0,  0,  0);
end;


Сергей М.   (2008-09-01 14:32:00) [86]

Ты пример из [81] имеешь ввиду ?
Тогда да, так и должно.


KygECHuK   (2008-09-01 14:20:00) [87]

Эт снова я...
Чё то странное - библиотека почти сразу выгружется ?
Т.е вызывается DLLEntryPoint с параметром DLL_PROCESS_DETACH. Оно так должно работать?


Сергей М.   (2008-08-28 15:11:00) [88]


> Leonid Troyanovsky ©   (28.08.08 15:05) [87]
>
>


Ага, вижу tid параметром.
А глаз искал переменную)


Сергей М.   (2008-08-28 15:09:00) [89]


> Нет Здесь 0


Здесь он вообще хз чему равен - декларация и иниц-ия этой переменной напрочь отсутствует.

Тем не менее имей ввиду - для внедрения хук-модуля в конкретный целевой процесс указание потока этого процесса обязательно.


Leonid Troyanovsky   (2008-08-28 15:05:00) [90]


> Сергей М. ©   (28.08.08 14:48) [85]

> А в примере он = 0

GetWindowThreadProcessID(ahwnd,  nil)

--
Regards, LVT.


KygECHuK   (2008-08-28 14:53:00) [91]


> Да. если при вызове указан id этого потока.А в примере он
> = 0


"SetWindowsHookEx(WH_GETMESSAGE,  Answer,  Hinstance,  tid)"
Нет Здесь 0


Сергей М.   (2008-08-28 14:48:00) [92]


> Leonid Troyanovsky ©   (28.08.08 14:29) [84]


> Хук цепляется на определенный поток


Да. если при вызове указан id этого потока.
А в примере он = 0

dwThreadId

Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads.


Leonid Troyanovsky   (2008-08-28 14:29:00) [93]


> Сергей М. ©   (28.08.08 14:16) [83]

> В примере - глобальный хук, и хук-модуль будет внедряться
> во все процессы,

Почему во все?
Хук цепляется на определенный поток.

--
Regards, LVT.


Сергей М.   (2008-08-28 14:16:00) [94]


> KygECHuK ©   (28.08.08 13:44) [82]


Не наступи на грабли)

В примере - глобальный хук, и хук-модуль будет внедряться во всепроцессы, обращающиеся к очередям сообщений своих окон


KygECHuK   (2008-08-28 13:44:00) [95]


> Leonid Troyanovsky ©   (28.08.08 13:05) [81]

Спасибо за пример


Leonid Troyanovsky   (2008-08-28 13:05:00) [96]


> KygECHuK ©   (28.08.08 11:22) [80]

http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N109

--
Regards, LVT.


KygECHuK   (2008-08-28 11:22:00) [97]


> Ну вроде того)Только вот события не "посылают", они происходят
> или возникают.


Ну вызываем событие...
Так или иначе СПАСИБО за терпение.
Надо опробывать ваш совет


Сергей М.   (2008-08-28 10:58:00) [98]


> я правильно понял?


Ну вроде того)
Только вот события не "посылают", они происходятили возникают.


KygECHuK   (2008-08-28 10:37:00) [99]


> Нет, она тоже не сразу произойдет, только при первом событии
> подписки.


Т.е.

ставим WindowsHookEx
посылаем событие подписки  
//библиотека загружена

снимаем UnhookWindowsHookEx
посылаем событие подписки  
// библиотека выгружена

я правильно понял?


Сергей М.   (2008-08-28 10:18:00) [100]


> выгрузка, получается, вызовом  UnhookWindowsHookEx ?


Нет, она тоже не сразу произойдет, только при первом событии подписки.


> код библиотеки в при инциализации и финализации менять не
> надо?


Смотря что за код у тебя там.


> тело CallBack процедуры можно оставить пустым?


Пустым нельзя. Цепочку хуков оборвешь тем самым.
см. CallNextHookEx


Страницы:   1 2 3 4 5 6 7 8 9

Наверх

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