![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехватить вызов функции из DLL
Новичоккк © (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() ?