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

Вниз

Тонкости перехвата API   Найти похожие ветки 

 
oxffff ©   (2008-05-04 14:54) [40]


> Rouse_ ©   (04.05.08 12:53) [39]
>
> > Изменения в EAT придеться делать для Kernel32, а как это
>
> > скажется на работу других процессов.
>
> Никак не скажется, они об этом даже не узнают ибо:
>
> > я не знаю точно сколько копий kernel32 храниться в памяти:
>
> >  одна на всех или по одной на каждый процесс
>
> образ маппится в ВАП твого процесса
>
> > как написать драйвер файловой системы
>
> а это уже из серии "из пушки по воробьям"...


Ничего не мешает мапить разные ВАП на одно ФП.
А именно мапить кодовые сегменты PE образа.


 
Rouse_ ©   (2008-05-04 15:00) [41]


> Ничего не мешает мапить разные ВАП на одно ФП.

Ну тонкостей я уже не помню, но вроде как всеже не кусок ВАП мапится на образ а наоборот, хотя могу и ошибаться...


 
oxffff ©   (2008-05-04 16:07) [42]


> Rouse_ ©   (04.05.08 15:00) [41]


Ничего не мешает кодовую часть PE образа сделать разделяемой для системых DLL, т.е. избежать дублирования кода DLL в физической памяти и файле подкачки, хотя бы для системых библиотек.
И например запретить выгрузку из памяти, аля nonpaged pool, чтобы не создавать нагрузки на другие процессы при переключении.
Хотя это смахивает больше на режим ядра. :)


 
Игорь Шевченко ©   (2008-05-04 16:19) [43]

Я для своего процесса использую следующий метод:
(на примере функций из User и Gdi)

type
 TGetWindowRectProc = function (Wnd: HWND; Rect: PRect): Integer; stdcall;

type
 TInterceptHookData = packed record
   JmpOpCode : Byte;
   JmpAddress : Pointer;
   RetOpCode : Byte;
 end;
 TInterceptData = packed record
   Hook : TInterceptHookData;
   SaveCode : array[0..5] of Byte;
   ProcAddress : Pointer;
   Protection : DWORD;
 end;

procedure InitInterceptData (var InterceptData : TInterceptData;
  HookProc : Pointer);
begin
 with InterceptData.Hook do
 begin
   JmpOpCode := $68;
   JmpAddress := HookProc;
   RetOpCode := $C3;
 end;
end;

function InitInterceptDataEx (var InterceptData : TInterceptData;
  HookProc: Pointer; const AModuleName, AProcName: string): Boolean;
begin
 InitInterceptData(InterceptData, HookProc);
 InterceptData.ProcAddress := GetProcAddress(
   GetModuleHandle(PChar(AModuleName)), PChar(AProcName));
 Result := InterceptData.ProcAddress <> nil;
 if Result then begin
   VirtualProtect(InterceptData.ProcAddress, SizeOf(InterceptData.SaveCode),
      PAGE_EXECUTE_WRITECOPY, InterceptData.Protection);
   Move(InterceptData.ProcAddress^, InterceptData.SaveCode,
      SizeOf(InterceptData.SaveCode));
   Move(InterceptData.Hook, InterceptData.ProcAddress^,
      SizeOf(InterceptData.Hook));
 end;
end;

procedure DoneInterceptData (const InterceptData: TInterceptData);
var
 Dummy : DWORD;
begin
 with InterceptData do
   if Assigned(ProcAddress) then
   begin
     VirtualProtect(ProcAddress, SizeOf(SaveCode), PAGE_EXECUTE_WRITECOPY, Dummy);
     Move(SaveCode, ProcAddress^, SizeOf(SaveCode));
     VirtualProtect(ProcAddress, SizeOf(SaveCode), Protection, Dummy);
   end;
end;

Сам перехватчик (вполне конкретная функция)

var
 GetWindowRectHook: TInterceptData;

function HookedGetWindowRect (Wnd: HWND; Rect: PRect): Integer; stdcall;
var
 Callee: LongInt;
 OldProc: TGetWindowRectProc;
 CallString: string;
begin
 asm
   push dword ptr [ebp+4]
   pop  Callee
 end;
 Inc(Level);
 CallString := Format("GetWindowRect;(%s,%s);[%s]",
   [DecodeWindowHandle(Wnd),DecodeRectPtr(Rect), DecodeAddress(Callee)]);
 with GetWindowRectHook do
 begin
   Move(SaveCode, ProcAddress^, SizeOf(SaveCode));
   @OldProc := ProcAddress;
   Result := OldProc(Wnd,Rect);
   Move(Hook, ProcAddress^, SizeOf(Hook));
 end;
 if LogOpened then
   writeln(LogF, Level, ";",Format("%s;returns %s (%s)", [CallString,
     DecodeBool(Result), DecodeRectPtr(Rect)]));
 Dec(Level);
end;

initialization
 if EnableHooks and (Win32Platform = VER_PLATFORM_WIN32_NT) then
 begin
   InitInterceptDataEx(GetWindowRectHook, @HookedGetWindowRect,
     "user32.dll", "GetWindowRect");
   .....
 end;
finalization
 if EnableHooks and (Win32Platform = VER_PLATFORM_WIN32_NT) then
 begin
   DoneInterceptData(GetWindowRectHook);
   ...
 end;
end.

Пользуюсь уже много лет, а именно 6, в однопоточных приложениях


 
Сергей М. ©   (2008-05-04 17:15) [44]


> Дмитрий С   (02.05.08 20:26) [32]


Модифицировать нужно IAT каждого из модулей в ВАП твоего (т.е. текущего) процесса, ибо любой из этих модулей может вызвать интересующую тебя ф-цию, взяв адрес ее точки входа из своей собственной IAT.

Кр.того, получение адреса интересующей тебя ф-ции возможно и вызовом ф-ции kernel32.GetProcAddress, которая обращается к EAT модуля, экспортирующего перехватываемую тобой ф-цию. Значит, требуется либо модифицировать соотв.элемент EAT либо модифицировать IAT модуля kernel32 с целью перехвата т.входа в GetProcAddress, чтобы отслеживать запросы адреса перехватываемой тобой ф-ции и возвращать результатом нужный тебе адрес.



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

Текущий архив: 2008.06.15;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.011 c
2-1211279284
StiTch
2008-05-20 14:28
2008.06.15
Вкладки


2-1211278254
Xmen
2008-05-20 14:10
2008.06.15
Сворачивание в трей


2-1211283647
Сергей
2008-05-20 15:40
2008.06.15
Код


2-1211134654
{RASkov}
2008-05-18 22:17
2008.06.15
Использование неустановленного шрифта


15-1210046715
Xmen
2008-05-06 08:05
2008.06.15
выбор среду Delphi для написания программы