Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.15;
Скачать: CL | DM;

Вниз

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

 
Пит   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
1-1225170396
Lennyt
2008-10-28 08:06
2009.11.15
Delphi Учётные записи Ms Outlook


15-1252614613
Юрий
2009-09-11 00:30
2009.11.15
С днем рождения ! 11 сентября 2009 пятница


2-1254488105
Me
2009-10-02 16:55
2009.11.15
Как отключить возможность записи в константы?


8-1199890749
AlexanderMS
2008-01-09 17:59
2009.11.15
Воспроизвести WAV из части файла.


2-1254382883
Aleks
2009-10-01 11:41
2009.11.15
MonthCalendar и UpDown