Форум: "Прочее";
Текущий архив: 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