Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехватить вызов функции из DLL


Страницы:   1 2

Новичоккк ©   (2006-03-07 09:56:00) 

Есть программа со своей DLL'кой. Возможно ли перехватить вызов одной функции, экспортируемой этой библиотекой? Всего в ней более 9000 экспортов, так что оттрансилировать врядли получиться...


Сергей М.   (2006-03-09 08:17:00) [1]


> Ну а как же её перехватить?


> непонятно что


Вот именно - "непонятно что".
Каков тайный смысл перехватывать "непонятно что" ?
Если тебе известны параметры ф-ции, тип результата и соглашение о ее вызове, то ты уже можешь описать прототип и написать свою ф-цию, соответствующую этому прототипу. Но известным все это становится отнюдь не в ран-тайм, а на этапе проектирования - либо на основании официальной инф-ции производителя модуля либо по результятам анализа дизассемблированного кода модуля.


Eraser   (2006-03-08 00:29:00) [2]


> Новичоккк  

перехват метода сам по себе осуществить, я бы сказал, проще чем API ф-ии.. по крайней мере если этот метод вызывается с соглашением stdcall, что хар-но для методов интерфейсов. Но вот с объектными методами сложнее.
Вся сложность в том, чтобы найти этот метод в таблице методов класса/объекта.


n0name   (2006-03-07 20:44:00) [3]

Посмтри как она называется в таблице импорта, например, pe tools можешь использовать.
>>Можно ли по этому узнать какие параметры у функции?
FBlowFish::InitializeBlowfish(uchar * const,short) - вот и ответ :)


Новичоккк   (2006-03-07 16:59:00) [4]

Ну а как же её перехватить?
Я к тому, что когда перехватывал обращения к своей DLL'ке, то имя функции мне было известно и я писал 'MyTestFunc'. А тут непонятно что... Если писать "InitializeBlowfish" - функция не найдена.


Сергей М.   (2006-03-07 16:26:00) [5]


> Можно ли по этому узнать какие параметры у функции?


В общем случае нельзя.
И вообще - эта задача совершенно из другой оперы.


Новичоккк   (2006-03-07 13:44:00) [6]

Нужная мне функция вызывается вот так (вызывается другой DLL'кой):


> .text:10418652 call ds:?InitializeBlowfish@FBlowFish@@QAEFQAEF@Z
> ; FBlowFish::InitializeBlowfish(uchar * const,short)


Новичоккк   (2006-03-07 12:57:00) [7]

Да конечно сам виноват. Но зато в эти моменты поднимается трудоспособность =) Так бы не получалось, несколько часов поковырялся и надоело бы. А теперь приходится вертеться.
...
У меня получилось =) Написал программу с библиотекой. Написал программу перехватчит с DLL для внедрения. Работает!
Но одно дело своя программа (я знаю как она работает, какую вызывает функцию и какие у этой функции параметры). Теперь попробую в боевых условиях реализовать подобное.

Можно ли по этому узнать какие параметры у функции?
?InitializeBlowfish@FBlowFish@@QAEFQAEF@Z


Сергей М.   (2006-03-07 12:02:00) [8]


> Я наивно полагал, что с этим проблем не возникнет и можно
> будет с легкостью найти множество готовых решений


Они и есть, эти "решения". И немало их.
Но применять их нужно с умом и полным пониманием дела.
Иначе грош цена твоему коду !


> сроки поджимают


Это, согласись, твои проблемы - никто тебя не тянул за язык, когда ты дал согласие на реализацию логики, в коей на тот момент не понимал ни шиша)


Сергей М.   (2006-03-07 11:59:00) [9]


> Мне не подходит второй вариант


Значит, остается 1-й.


> Почему не работает функция AttachDllToProcess с чужими процессами


А мне почем знать ?
Мало ли что у нее в потрохах творится ..
Мало ли вообще всякого хлама на просторах Сети)

Отладчик в зубы - и вперед !
На то он и отладчик.


Новичоккк   (2006-03-07 11:59:00) [10]


> Читать такого рода спецлитературу, разумеется, есть смысл
> и нужно при определенном уровне знаний и с определенной
> целью, но никак не с целью поиска знакомых букв. Надеюсь,
>  это не вызывает сомнений ?

Само собой разумеется. Просто это дело не одного дня. А в данном случае сроки поджимают. Я наивно полагал, что с этим проблем не возникнет и можно будет с легкостью найти множество готовых решений.


Хинт   (2006-03-07 11:56:00) [11]

Понятно. Мне не подходит второй вариант (загрузки "ручками"). Я так понимаю это подходит только для кода на ASM при чем с относительными переходами (иначе настраивать все адреса)...

Почему не работает функция AttachDllToProcess с чужими процессами (код приведен выше)? Позвращает False (хоть PID правильный и библиотека на месте)


Новичоккк   (2006-03-07 11:56:00) [12]

Понятно. Мне не подходит второй вариант (загрузки "ручками"). Я так понимаю это подходит только для кода на ASM при чем с относительными переходами (иначе настраивать все адреса)...

Почему не работает функция AttachDllToProcess с чужими процессами (код приведен выше). Позвращает False (хоть PID правильный и библиотека на месте)


Сергей М.   (2006-03-07 11:56:00) [13]


> бы почитал Рихтера ..я там ничего не пойму


Читать такого рода спецлитературу, разумеется, есть смысл и нужно при определенном уровне знаний и с определенной целью, но никак не с целью поиска знакомых букв. Надеюсь, это не вызывает сомнений ?


Сергей М.   (2006-03-07 11:52:00) [14]


> внедрять DLL придется в любом случае?


Нет, не в любом.

В случае с внедрением DLL ты полагаешься на штатную работу сист.загрузчика, который как ему и положено "разрулит" хотя бы те тонкости, которые связаны с зависимостями загружаемой DLL от других модулей, а так же с настройкой позиционно-зависимого кода загружаемой DLL на конкретный адрес загрузки в ВАП целевого процесса.

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


Новичоккк   (2006-03-07 11:44:00) [15]

По крайней мере внедрять DLL придется в любом случае?
---
С удовольствием бы почитал Рихтера. Только у меня такое ощущение, что я там ничего не пойму =) Ссылочки случайно нет?


Сергей М.   (2006-03-07 11:31:00) [16]

Ты уж как-нибудь определись, какой метод перехвата будешь использовать - то ли метод модификации сегмента кода (1), то ли метод модификации IAT/EAT (2). А то мечешься сам не понимая, что/где/зачем/как происходит при этом ... Не почитать ли тебе по оказии соотв.литературу на эту тему  ? ... Того же Рихтера, к примеру ?

Я бы предпочел (2) - этот метод, imho, проще и надежней чем (1).


Новичоккк   (2006-03-07 11:18:00) [17]

Перехватить MessageBoxA у меня получилось =) Не удивительно, это было в примерах =)

Вот в коде:
EnablePrivilege(SE_DEBUG_NAME);
AttachDllToProcess(GetCurrentProcessId, DirName+'\Lib.dll');

Если вместо GetCurrentProcessId указать PID другого приложения, то DLL не внедряется.

function AttachDllToProcess(pID: integer; LibName: string): boolean;
var
LoadLibraryCode: TLoadLibraryCode;
pCode: Pointer;
begin
pCode:=GetCodeBase(sizeof(LoadLibraryCode), pID);

LoadLibraryCode.LoadLibPushOp:=OPCODE_PUSH;
LoadLibraryCode.LoadLibPushArg:=DWORD(pCode)+DWORD(@LoadLibraryCode.LibName)-DWORD(@LoadLibraryCode);
LoadLibraryCode.LoadLibCallOp:=OPCODE_CALL;
LoadLibraryCode.LoadLibCallArg:=DWORD(pCode)+DWORD(@LoadLibraryCode.LoadLibraryAddress)-DWORD(@LoadLibraryCode);

LoadLibraryCode.ExitThreadPushOp:=OPCODE_PUSH;
LoadLibraryCode.ExitThreadPushArg:=0;
LoadLibraryCode.ExitThreadCallOp:=OPCODE_CALL;
LoadLibraryCode.ExitThreadCallArg:=DWORD(pCode)+DWORD(@LoadLibraryCode.ExitThreadAddress)-DWORD(@LoadLibraryCode);

LoadLibraryCode.LoadLibraryAddress:=DWORD(GetProcAddress(GetModuleHandle('kernel 32.dll'), 'LoadLibraryA'));
LoadLibraryCode.ExitThreadAddress:=DWORD(GetProcAddress(GetModuleHandle('kernel3 2.dll'), 'ExitThread'));
StrCopy(@LoadLibraryCode.LibName, PChar(LibName));

result:=ExCodeInRemoteProcess(@LoadLibraryCode, sizeof(LoadLibraryCode), pCode, pID);
end;


Сергей М.   (2006-03-07 11:11:00) [18]

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


Новичоккк   (2006-03-07 11:05:00) [19]

Функция из HideModule (нашел в кладовке) я так понимаю подходит только для WinAPI?
function DLLInterceptAPI(szProcName, szLibName: PChar; pNewProcAddr: Pointer): Pointer;
функция перехвата API-функций ОС Windows, путём правки таблицы импорта

Параметры:
szProcName - имя перехватываемой процедуры
szLibName - имя библеотеки экспортирующей эту процедуру
pNewProcAddr - указатель на новую процедуру

возврашает адрес оригинальной прцедуры


Сергей М.   (2006-03-07 10:42:00) [20]

Средства для внедрения в чужое АП здесь вроде бы представлены в достаточном "ассортименте".

Но вот средств собственно перехвата что-то не видно..


> Снятие перехвата установленного
> по HookCode


А где собственно HookCode() ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо