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

Вниз

Перехват   Найти похожие ветки 

 
Creator ©   (2004-03-10 13:07) [0]

каким образом можно перехватить вызов финкции из kernel, и параметры ?


 
Digitman ©   (2004-03-10 13:21) [1]

изменив соотв.эл-ты таблиц импорта/экспорта того процесса, в котором предполагаются факты вызова эксп.ф-ций библ-ки kernel32.dll


 
YuRock ©   (2004-03-10 13:51) [2]

Изменить то можно, но если заранее знаешь, на что менять. И параметры тогда самому придумывать надо будет. А вот какие они (параметры) были на самом деле?...
Хотелось бы узнать (динамически)...


 
Digitman ©   (2004-03-10 14:03) [3]


> YuRock


это ты мне ?
я давно и с успехом делаю это


 
Никто ©   (2004-03-10 14:04) [4]

http://www.delphimaster.ru/articles/Dapi/index.html


 
YuRock ©   (2004-03-10 14:24) [5]

> Digitman ©   (10.03.04 14:03) [3]
> я давно и с успехом делаю это

Что "это"?
Просто хотелось бы узнать: что даст замена адреса "оригинальной" ф-ции на "новую", если надо "перехватить вызов" этой "оригинальной", причем с параметрами?

Какие параметры в "новой" надобно прописать? Я не просто так спрашиваю - просто я не знаю - если Вам не трудно - поделитесь.


 
Digitman ©   (2004-03-10 14:36) [6]


> YuRock ©   (10.03.04 14:24) [5]


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

если экспорт документирован, то в док-ции есть и прототипы

пример - перехват kernel32.LoadLibrary():

type
 TLoadLibrary = function(LibFileName: PChar): THandle; stdcall;

var
 pLoadLibrary: TLoadLibrary;
..

function NewLoadLibrary (LibFileName: PChar): THandle; stdcall;
begin
 Result := pLoadLibrary(LibFileName);
 if lstrcmpi(LibFileName, PChar(SomeLib)) = 0 then // анализ параметра
   begin
     ...
   end;
end;

function SetApiHook(hModule: THandle; ProcName: PChar; ProcAddr: Pointer): Pointer;
begin
 Result := GetProcAddress(hModule, ProcName);
 if Assigned(Result) and not SetProcAddress(hModule, ProcName, ProcAddr) then Result := nil;
end;

procedure SetApiHooks(const Active: Boolean);
begin
 if Active then
   begin
       pLoadLibrary := SetApiHook(hKERNEL32, "LoadLibraryA", @NewLoadLibrary);
   end
 else
   begin
       SetApiHook(hKERNEL32, "LoadLibraryA", @pLoadLibrary);
   end;
end;

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


 
Kerk ©   (2004-03-10 14:41) [7]

http://rootkit.host.sk/knowhow/hookingen.txt


 
YuRock ©   (2004-03-10 14:51) [8]

> Digitman ©   (10.03.04 14:36) [6]

Ну так тут вопросов нет! Вопрос именно в
TLoadLibrary = function(LibFileName: PChar): THandle; stdcall;

Для LoadLibrary понятно - параметр определили именно Вы!

А как быть с, например, ф-цией "kernel32.BuildCommDCBAndTimeoutsW"? Как с ее параметрами быть?

Т.е. в [2] и [4] я спрашивал: как динамически узнать о параметрах ф-ции? Ведь ProcAddr, к-рый Вы передаете в SetProcAddress, желательно долен быть аресом функции, объявленной с хотябы таким же "размером" параметров, что и функция, которую мы меняем. А как узнать этот "размер"?

Вот, что я спрашиваю


 
Digitman ©   (2004-03-10 15:04) [9]


> параметр определили именно Вы


не я его определил, а Майкрософт ... в своей документации ... равно как и для BuildCommDCBAndTimeoutsW()


> как динамически узнать о параметрах ф-ции


практически - никак. imho, такая постановка задачи - не более чем блажь.

уверен - нет таких оправдывающих себя практических задач, когда требуется перехват без разбору всего чего ни попадя из заданной библ-ки, с последующим ран-тайм анализом, чего же там на самом деле и с какими параметрами было вызвано

как правило, если ожидается вызов таких-то док.точек входа, для каждой из них используется соотв.прототип в описании процедуры, куда будет передано управление в рез-те перехвата


 
YuRock ©   (2004-03-10 15:09) [10]

> Digitman ©   (10.03.04 15:04) [9]
> как правило, если ожидается вызов таких-то док.точек входа, для каждой из них используется соотв.прототип в описании процедуры

В теме я ничего похожего не нашел...


 
Digitman ©   (2004-03-10 15:10) [11]


> YuRock ©   (10.03.04 14:51) [8]


хотя, зная заведомо соглашение о вызове и среду разработки вызываемого модуля, размер можно и определить ... точно так же, как это. к примеру, делает любой мало-мальски серьезный дизассемблер  ... например, IDA Pro .. но о ран-тайме здесь говорить не приходится .. дизассемблер лишь позволит восстановить корректный с т.з. адресации и соглашения о вызове прототип эксп.ф-ции для того чтобы использовать этот прототип за неимением штатной док-ции к модулю


 
Digitman ©   (2004-03-10 15:11) [12]


> В теме я ничего похожего не нашел


в какой "теме" ?


 
YuRock ©   (2004-03-10 16:00) [13]

> Digitman ©   (10.03.04 15:10) [11]

На счет динамически:

можно попробовань, например, генерировать код библиотеки (например, на Паскале), на основе анализа "push"ей"/"pop"ов" в коде ф-ции попытаться создать параметры, затем линковать библиотеку с помощью запуска, например, dcc32.exe, подключать полученную dll, и необходимые для замены функции менять на те, что получились в нашей dll.

Хотя, конечно, такой способ только разве-что ради шутки использовать.

> Digitman ©   (10.03.04 15:11) [12]
> в какой "теме" ?

В " Перехват [D6] Creator ©   (10.03.04 13:07) каким образом можно перехватить вызов финкции из kernel, и параметры ?"


 
Digitman ©   (2004-03-10 16:08) [14]


> YuRock ©   (10.03.04 16:00) [13]


в теме, думаю, подразумевается только экспорт
а экспорт весь документирован, и к каждой точке входа можно найти прототип с описанием логики/параметров/результата


> На счет динамически


хоть убей, не пойму, зачем это может понадобиться на практике, даже если не "ради шутки"


 
Игорь Шевченко ©   (2004-03-10 16:14) [15]

И недокументированные тоже:

 TNtGdiGetDIBitsInternalProc = function (
                p1,p2,p3,p4,p5,p6,p7,p8,p9 : Integer) : Integer; stdcall;


var
 NtGdiGetDIBitsInternalHook : TInterceptData;

function HookedNtGdiGetDIBitsInternal (p1,
                    p2,p3,p4,p5,p6,p7,p8,p9 : Integer) : Integer; stdcall;
var
 Callee : LongInt;
 OldProc : TNtGdiGetDIBitsInternalProc;
 CallString : String;
begin
 asm
   push dword ptr [ebp+4]
   pop  Callee
 end;
 Inc(Level);
 CallString := Format(
    "NtGdiGetDIBitsInternal;(0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x, 0x%.8x);[%s]",
                      [p1,p2,p3,p4,p5,p6,p7,p8,p9,
                       DecodeAddress(Callee)]);
 with NtGdiGetDIBitsInternalHook do begin
   Move(SaveCode, ProcAddress^, SizeOf(SaveCode));
   @OldProc := ProcAddress;
   Result := OldProc(p1,p2,p3,p4,p5,p6,p7,p8,p9);
   Move(Hook, ProcAddress^, SizeOf(Hook));
 end;
 writeln(LogF, Level, ";",Format("%s;returns 0x%.8x", [CallString,
          Result]));
 Dec(Level);
end;


 
Digitman ©   (2004-03-10 16:17) [16]


> Игорь Шевченко ©   (10.03.04 16:14) [15]


Игорь, ну поскольку прототип у тебя в том или ином виде имеется, и он корректен при использовании в ран-тайм, уже можно считать, что ф-ция "документирована") ... хотя бы для тебя)


 
Игорь Шевченко ©   (2004-03-10 16:20) [17]

Digitman ©   (10.03.04 16:17)

А прототип по числу байт прибавляемых к стеку в команде ret определялся. Фэнь Юань надоумил так перехватывать.


 
Digitman ©   (2004-03-10 16:23) [18]


> Игорь Шевченко ©   (10.03.04 16:20) [17]


дык это не новость


 
YuRock ©   (2004-03-10 16:27) [19]

> Digitman ©   (10.03.04 16:08) [14]
> экспорт весь документирован

В kernel - может быть (и то по моему, только начиная с NT)
А как на счет ntdll.__eFTST? Какие у нее параметры? И таких примеров 84 миллиона.

> не пойму, зачем это может понадобиться на практике

Мне пришлось в свое (не лучшее) время попрограммировать на таком г..., как CA-Visual Objects - а в нем ни компилятора ни линкера с командной строки нет, а среда - еще хуже чем язык (к слову - Clipper), возможности и.т.п.

Так вот, проекты там можно было хранить в базе данных неизвестного формата, которую постоянно намертво валила IDE.
Слава богу, что добрые разработчики дали интерфейс библиотек, с помощью которых можно было сделать свою IDE, компилить и т.д.

Да только всего около трети ф-ций они описали, а с остальными приходилось поступать так:
1. Догадываешься, как примерно должна называться ф-ция;
2. Находишь ее;
3. Подбираешь параметры (и количество, и назначение).

Так что иногда нужно бывает определить параметры ф-ций, когда кто-то забыл или специально не дал описания.


 
Digitman ©   (2004-03-10 16:38) [20]


> YuRock ©   (10.03.04 16:27) [19]
> А как на счет ntdll.__eFTST? Какие у нее параметры?


так все таки речь идет о конкретном эксп.вызове ?
ну и здесь та же самая ситуация ! нет док.прототипа ? IDA Pro в зубы, 15 минут позора - и прототип готов ! Вот проблема-то) ..

И точно так же с любой другой "темной лошадкой" ..



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

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

Наверх




Память: 0.53 MB
Время: 0.025 c
6-1073819730
PInokio
2004-01-11 14:15
2004.03.28
Цикл для ClientSocket plz Help


7-1072891285
case
2003-12-31 20:21
2004.03.28
COM-Port 125KBaud KAK?


6-1073631783
INTAARI
2004-01-09 10:03
2004.03.28
Всегда ли доставляются данные по UDP???


9-1049571866
DJ GRAFIKI
2003-04-05 23:44
2004.03.28
Подскажите как установить заголовочные файлы directx 9 на Делфи 7


6-1073721833
shur2005
2004-01-10 11:03
2004.03.28
Порты