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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.03 c
7-1070382483
NavigatorV
2003-12-02 19:28
2004.03.28
Выход из Windows


3-1077528020
Bless
2004-02-23 12:20
2004.03.28
Цифровые поля в LookupComboBox


6-1074529259
Opryshok
2004-01-19 19:20
2004.03.28
Парсинг HTML документа.


1-1079069880
scorpi
2004-03-12 08:38
2004.03.28
Определения типа


1-1078414325
SkullNet
2004-03-04 18:32
2004.03.28
Цвета в StringGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский