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

Вниз

Тонкости перехвата 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.013 c
2-1211463953
student_iz_muroma
2008-05-22 17:45
2008.06.15
Архивация базы


2-1211546124
StiTch
2008-05-23 16:35
2008.06.15
Мемо


6-1188497289
IOs
2007-08-30 22:08
2008.06.15
TGUID для IInternetProtocolEx


15-1209924570
axis_of_evil
2008-05-04 22:09
2008.06.15
проблема с outlook


15-1209529452
@!!ex
2008-04-30 08:24
2008.06.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский