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

Вниз

Правка заголовков модулей в ВАП   Найти похожие ветки 

 
Пит   (2009-09-05 15:19) [0]

В свое время вроде по Рихтеру я писал правку модулей импорта с целью перехвата WinApi функций. Получилось так:

procedure ModifyAllImportSectionInCurrentProcess(CaleeModuleName: PChar;
 CurrentProc, NewProc: Pointer);
var
 HSnapShot: THandle;
 me: TModuleEntry32;
begin
 if CurrentProc = nil then exit;
 HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId);
 try
   me.dwSize := sizeof(TModuleEntry32);
   if Module32First(HSnapShot, me) then
    repeat
      ModifyImportSection(me.hModule, CaleeModuleName, CurrentProc, NewProc);
    until ( not Module32Next(HSnapShot, me) );
 finally
   closehandle(HSnapShot);
 end;
end;

procedure ModifyImportSection(InstanceModule: HModule;
 CalleeModuleName: PChar; CurrentProc: Pointer; NewProc: Pointer);
var
 PImportDsc: PImageImportDescriptor;
 PThunk: PImageThunkData ;
 Size: ULONG;
 OldProtect: cardinal;
begin
 if InstanceModule = HInstance then exit;
 PImportDsc := ImageDirectoryEntryToData( Pointer(InstanceModule), True,
   IMAGE_DIRECTORY_ENTRY_IMPORT, Size );
 if PImportDsc = nil then exit;
 while PImportDsc^.Name <> 0 do
   begin
     if lstrcmpi( PChar(InstanceModule + PImportDsc^.Name), CalleeModuleName )=0 then
       begin
         PThunk := PImageThunkData( InstanceModule + DWORD(PImportDsc^.FirstThunk) ) ;
         while DWORD(PThunk^.Thunk.thFunction) <> 0 do
           begin
             if Pointer( PThunk^.Thunk.thFunction) = CurrentProc then
               begin
                 VirtualProtect(PThunk^.Thunk.thFunction, SizeOf(PThunk^.Thunk.thFunction),
                   PAGE_EXECUTE_READWRITE, OldProtect);
                 WriteProcessMemory(GetCurrentProcess, @PThunk^.Thunk.thFunction, @NewProc,
                   SizeOf(NewProc), Size);
                 VirtualProtect(PThunk^.Thunk.thFunction, SizeOf(PThunk^.Thunk.thFunction),
                   OldProtect, OldProtect);
               end;
             inc(PThunk);
           end;
       end;
     inc(PImportDsc);
   end;
end;


CaleeModuleName - это имя DLL, в которой содержится перехватываемая функция.

Вызов происходит так:

PtrCurProc := GetProcAddress(GetModuleHandle( PChar(CaleeModuleName) ), PChar(FunctionName) );
ModifyAllImportSectionInCurrentProcess(PChar(CaleeModuleName), PtrCurProc, PtrNewFunc);


CaleeModuleName - например "wininet.dll"
FunctionName - например "InternetConnectA"
PtrNewFunc - адрес hook функции

Вроде из под дельфи (отладка) локально тестирую данную DLL, нормально она переправляет все. Загруженная DLL вполе хорошо перехватывает импортируемую тестовым EXE"шником функцию InternetConnectA.

Но если начать внедрять эту DLL везде с помощью хука... После внедрения в тот же Explorer он начинает дико тормозить, со временем выдает AV и умирает.

Писалось очень давно, я ни черта не помню что там к чему... Может, кто в теме подскажет что из этого сумбурного рассказа...


 
Пит   (2009-09-05 15:34) [1]

Насчет тормозов Explorer - это мой косяк, я просто там в отладочных целях вставил beep, он не пищал с одной стороны, но Explorer из-за этого тормозил (так и должно быть), но вот почему при этом explorer выдавал AV - странно.

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


 
Пит   (2009-09-05 15:56) [2]

Еще меня немного обманул тот факт, что оказывается при хуке WH_GETMESSAGE код записанный в событии FormCreate выполняется до того, как хук успеет сработать.

Иными словами, судя по всему, Delphi строит окно и вызывает FormCreate до того, как извлечет хотя бы одно первое сообщение из основного потока (с помощью GetMessage... или точнее там вроде PeekMessage).


 
Пит   (2009-09-05 15:57) [3]

Explorer, кстати, все таки падает со временем... Значит, в коде правки секций все таки ошибка? Или Explorer какие-то защитные средства применяет...

Система: Windows XP SP3


 
Юрий Зотов ©   (2009-09-05 16:04) [4]

> Пит   (05.09.09 15:56) [2]

> судя по всему, Delphi строит окно и вызывает FormCreate до того, как
> извлечет хотя бы одно первое сообщение из основного потока

Дык... а разве это не очевидно? Даже если просто посмотреть в код DPR, то увидим, что сначала идет Application.CreateForm (срабатывает конструктор, загружается DFM и возбуждается OnCreate), а уж потом идет Applicaton.Run (запуск цикла выборки сообщений).

А как может быть иначе? Даже в случае неглавной формы - если она еще не создана, то кому адресовать сообщение?


 
Пит   (2009-09-05 16:11) [5]


> Даже если просто посмотреть в код DPR, то увидим, что сначала
> идет Application.CreateForm (срабатывает конструктор, загружается
> DFM и возбуждается OnCreate), а уж потом идет Applicaton.
> Run

Да, дядь Юр, вы как всегда правы ))
Просто не думал об этом. В тестовом примере запихнул строчку тестовую в FormCreate - и соответственно хук не срабатывал. Я и строил различные версии, пока не выяснилось то, что выяснилось )

Так что код рабочий чуть более, чем никак. Остается вопрос нафига падает Explorer и есть ли таки ошибки в коде.


 
Пит   (2009-09-15 20:05) [6]

Удалено модератором
Примечание: Создание пустых сообщений



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

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

Наверх





Память: 0.47 MB
Время: 0.005 c
15-1253046603
Юрий
2009-09-16 00:30
2009.11.15
С днем рождения ! 16 сентября 2009 среда


15-1253478606
Юрий
2009-09-21 00:30
2009.11.15
С днем рождения ! 21 сентября 2009 понедельник


2-1254422362
Anatoly Podgoretsky
2009-10-01 22:39
2009.11.15
AV при сложение AnsiString и UnicodeString в D2010


15-1253260563
usver
2009-09-18 11:56
2009.11.15
АСУС


3-1229339778
matt
2008-12-15 14:16
2009.11.15
Дерево, набор данных и оптимизация





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский