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