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