Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват вызовов функций, Способы перехвата 
:(
    Опции темы
Chingachguk
Дата 23.4.2002, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Нет, не прочел, и, думаю, не прочту ;)

Там написано: DLL - разделяемый ресурс. Если все дружно читают(вызывают) его, то все OK. А если кто-то пишет в него ? Тогда NT(UNIX, etc) создают копию именно для этого приложения. А 95 не создают(там так написано).
Так что вот ;(


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TAPAKAH
Дата 25.4.2002, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.3.2002

Репутация: нет
Всего: нет



Не знаю ! По поводу того что win95 использует таки уже загруженные библиотеки для разных процессов такую инфу я нашёл, а вот то что нельзя код изменить .. не було такого ...
Лады .. остановимся на том что через пару дней я поставлю себе win95 и сам усё опробую. Сомнительно всё это! Возможно то о чём ты написал .. справедливо только для kernel32 ????

А вот по поводу НТ в моём случае 2000 я был абсолютно уверен что он каждый раз подгружает длл в память процесса .. по мере необходимости...
(это конечно более ресурсоёмко зато на порядок надёжней..)
И уверенность моя была основана .. на просмотре размера программ.

В общем .. поставлю 95 и всё станет ясно ..
PM MAIL   Вверх
Chingachguk
Дата 26.4.2002, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Насчет того, что кернел выделен - я проверил. Ты же из user32 функции хватал - и я попробовал ... Не пошло. И еще откуда-то - та же лажа.

А копированием занимается исчо и юникс.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TAPAKAH
Дата 26.4.2002, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.3.2002

Репутация: нет
Всего: нет



В общем я просто предположил из за того что в 95 иногда в коде системных длл встречаются например вот такие вещи if module='kernel32'
так что я надеюсь это обойти.. Ну через пару дней скажу чего получилось :)
PM MAIL   Вверх
TAPAKAH
Дата 10.5.2002, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.3.2002

Репутация: нет
Всего: нет



Тут Vit Написал про подведение итогов :)
Подвожу!
В 95/98 функция VirtualProtectEx не заработала!
Итак функция перехвата действительно работает только под платформы написанные на базе НТ. WIN2000 Professional,Server- проверено, остальные не проверялись,но большое подозрение что работать будет.

Алгоритм работы ещё раз и просто :
Есть некий адрес. При выполнении кода по этому адресу .. нам надо выполнить свой код => берём и вставляем вместо того кода jmp а исходный (частично - 5 байт или больше) куда нибудь копируем. В результате что мы получим :
Мы получим много если .. попробуем их оценить:
1. Если сумма длин инструкции (нашей функции) меньше 5 байт то есть вероятность что после изменения случится беда :). Но не переживайте .. вероятность того что она будет меньше 5 байт чрезвычайно мала. Подробности лучше узнать у Чингачгука .. как выглядит функция размером меньше 5 байт. (то есть если у вас эта функция была перехвачена 1 раз .. то с большой вероятностью она будет перехвачена снова .. так как размер у неё постоянен, конечно в рамках одной ОС :) )
Если вам очень хочется на крайний случай можно провести анализ кода (этих 5 байт на предмет ret ов) - динамически. Так что эта ошибка вполне  может быть отсеяна.
2. Теперь вернёмся к оригинальному коду функции который мы перехватили.
Если мы её всё же будем вызывать .. то опять же существует вероятность того что в её первых 5 байтах используются локальные смещения .. которые при переносе несомненно будут сылаться не туда куда надо .. но тут уже проще :) либо упадёт сразу .. либо не упадёт никогда.
3. Во всём остальном вещь работоспособная и что главное применима .. ко всему вашему адресному пространству... то бишь все функции из различных библиотек можно перехватить.
4. К примеру мне очень понравилось перехватывать метод TDataset.Open
и выводить в лог запросы (что-то типа мониторинга обращения приложения к базе данных).

Ну вот и всё .. !

 P.S.
   Этим пользоваться можно
   Но только крайне осторожно! :)
PM MAIL   Вверх
TAPAKAH
Дата 10.5.2002, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 27.3.2002

Репутация: нет
Всего: нет



А вот исходники .. для них необходима правда ещё библиотека disasmf которая и нужна собственно для вычисления длины инструкции ..
Если на форуме найдётся место то выложу.
2 Vit! Можно куда-нить скинуть ???


const
 DisAsm  = 'disasmf.dll';

// Рабочий вариант.. использует jmp, возвращает указатель на оригинальную функцию
function HookFunction(FuncModule : String; FuncName : String; NewProc : PDWORD) :
PDWORD;
//
function UnAssembleMem(offset: DWORD): DWORD; stdcall;

implementation

function UnAssembleMem; external DisAsm name '_UnAssembleMem@4';

function HookFunction(FuncModule : String; FuncName : String; NewProc : PDWORD) :
PDWORD;
const
 JmpLen =5;
var
 ptr : pointer;
 ptr_proc : PDWORD;
 OldProtectAPI : Cardinal;
 CodeLen : integer;
 InstructionLen : integer;
begin
 Result:=nil;
 ptr_proc:=GetProcAddress(GetModuleHandle(PChar(FuncModule)),PChar(FuncName));
 if not Assigned(ptr_proc) then
   Exit;
 // Определяем минимальный размер кода (больший чем размер инструкции jmp (e9)-
5 байт)
 CodeLen:=0;
 while CodeLen<JmpLen do
   begin
     InstructionLen:=UnAssembleMem(DWORD(ptr_proc)+CodeLen);
     if InstructionLen<=0 then raise Exception.Create('Это какая то неправильная
инструкция :) по аддресу : '+IntToStr(DWORD(ptr_proc)+CodeLen));
     Inc(CodeLen,InstructionLen);
   end;
 // Создаём новую функцию в которую запоминаем первые CodeLen байт + jmp на
остальной код измененной функции
 ptr:=AllocMem(CodeLen+JmpLen);
 CopyMemory(ptr,ptr_proc,CodeLen);
 PBYTE(DWORD(ptr)+CodeLen)^:=$e9;
 PDWORD(DWORD(ptr)+CodeLen+1)^:=DWORD(DWORD(ptr_proc)-DWORD(ptr)-JmpLen);
 // Меняем оригинальную функцию : вставляем jmp на хук
 if(not VirtualProtectEx(GetCurrentProcess(),ptr_proc, CodeLen,
         PAGE_EXECUTE_READWRITE, OldProtectAPI)) then
   begin
     RaiseLastWin32Error;
   end;  
 PBYTE(ptr_proc)^:=$e9;
 PDWORD(DWORD(ptr_proc)+1)^:=DWORD(NewProc)-DWORD(ptr_proc)-JmpLen;
 // Забиваем оставшуюся неиспользуемую часть кода NOP ами .. для выравнивания
кода
 FillMemory(Pointer(DWORD(ptr_proc)+JmpLen),CodeLen-JmpLen,90);
 Result:=ptr;
end;

А вот пример :)

var
OriginalLoadString : function (hInstance: HINST; uID: UINT; lpBuffer: PChar;
nBufferMax: Integer): Integer; stdcall;

function MyLoadString(hInstance: HINST; uID: UINT; lpBuffer: PChar; nBufferMax:
Integer): Integer; stdcall;
begin
Result:=OriginalLoadString(hInstance,uID,lpBuffer,nBufferMax);
StrCopy(lpBuffer,'Опа');
Result:=3;
end;

begin
@OriginalLoadString:=HookFunction('user32.dll','LoadStringA',@MyLoadString);
end;
PM MAIL   Вверх
Vit
Дата 10.5.2002, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Ну если очень большие исходники то можно мне на почту, если на форум влазят - то на форум. Мой ящик: [email protected], если письмо больше 20 метров то использовать [email protected].

В ближайшее время перенесу это в FAQ, спасибо за отклик.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.