![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Нет, не прочел, и, думаю, не прочту
Там написано: DLL - разделяемый ресурс. Если все дружно читают(вызывают) его, то все OK. А если кто-то пишет в него ? Тогда NT(UNIX, etc) создают копию именно для этого приложения. А 95 не создают(там так написано). Так что вот ;( -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| TAPAKAH |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 27.3.2002 Репутация: нет Всего: нет |
Не знаю ! По поводу того что win95 использует таки уже загруженные библиотеки для разных процессов такую инфу я нашёл, а вот то что нельзя код изменить .. не було такого ...
Лады .. остановимся на том что через пару дней я поставлю себе win95 и сам усё опробую. Сомнительно всё это! Возможно то о чём ты написал .. справедливо только для kernel32 ???? А вот по поводу НТ в моём случае 2000 я был абсолютно уверен что он каждый раз подгружает длл в память процесса .. по мере необходимости... (это конечно более ресурсоёмко зато на порядок надёжней..) И уверенность моя была основана .. на просмотре размера программ. В общем .. поставлю 95 и всё станет ясно .. |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Насчет того, что кернел выделен - я проверил. Ты же из user32 функции хватал - и я попробовал ... Не пошло. И еще откуда-то - та же лажа.
А копированием занимается исчо и юникс. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| TAPAKAH |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 27.3.2002 Репутация: нет Всего: нет |
В общем я просто предположил из за того что в 95 иногда в коде системных длл встречаются например вот такие вещи if module='kernel32'
так что я надеюсь это обойти.. Ну через пару дней скажу чего получилось :) |
|||
|
||||
| TAPAKAH |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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. Этим пользоваться можно Но только крайне осторожно! :) |
|||
|
||||
| TAPAKAH |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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; |
|||
|
||||
| Vit |
|
|||
![]() 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 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |