Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

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

 
Новичоккк   (2006-03-07 09:56) [0]

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


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

Глобально для всех процессов в системе или локально для какого-то одного интересующего процесса ?


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

Только для одного процесса


 
Сергей М. ©   (2006-03-07 10:11) [3]


> Только для одного процесса


Как этим процессом осуществляется импорт целевой библ-ки - статически или динамически ?


 
Новичоккк   (2006-03-07 10:14) [4]

Подгружается сразу при запуске процесса


 
Сергей М. ©   (2006-03-07 10:24) [5]


> Подгружается сразу при запуске процесса


Мне это ни о чем не говорит.

Это "сразу" можно расценивать и как результат дейсвий системного загрузчика и как выполнение вызова LoadLibrary() в первых же строках кода приложения.

Кр.того, даже если библ-ка фигурирует в IAT модуля приложения, не исключены явные последующие вызовы LoadLibrary() и GetProcAddress() со стороны кодовых потоков процесса этого приложения.

В общем случае следует тем или иным подходящим способом (глоб.хук, CreateRemoteThread) внедрить в ВАП процесса интересующего приложения код, который модифицирует соотв.элементы IAT модуля приложения и EAT модуля библ-ки


 
Новичоккк   (2006-03-07 10:30) [6]

Нда. Тяжеловато для меня... Вот нашел модуль AdvapiHook.

SizeOfCode(Code: pointer) - определение полного размера команды
по указателю Code.

SizeOfProc(Proc: pointer) - определение размера участка кода до
первой комманды RET.

InjectString(Process: dword; Text: PChar - внедрение строки в процесс

InjectThread(Process: dword; Thread: pointer; Info: pointer;
                     InfoLen: dword; Results: boolean) - внедрение нити в процесс

InjectDll(Process: dword; ModulePath: PChar) - Внедрение Dll в процесс

InjectThisDll(Process: dword) - Внедрение текущей Dll в процесс (если вызвано из Dll)

InjectDllEx(Process: dword; Src: pointer) -  Внедрение Dll в процесс методом
инжекции кода и настройки образа Dll в памяти.

InjectThisDllEx - Внедрение в процесс образа текущей Dll (если вызвано из Dll)

InjectExe(Process: dword; Data: pointer) - Внедрение образа Exe файла в чужое адресное
пространство и запуск его точки входа.

UnhookCode(OldProc: pointer) - Снятие перехвата установленного по HookCode

DisableSFC - Отключение System Fle Protection на лету.

GetProcAddressEx(Process: dword; lpModuleName,
                         lpProcName: pchar; dwProcLen: dword) - Получение адреса API в чужом адресном пространстве.

StopProcess(ProcessId: dword) - Остановка всех нитей процесса.

RunProcess(ProcessId: dword) - Запуск процесса остановленного StopProcess.

SearchProcessThread(ProcessId: dword) - поиск первой попавшейся нити заданного процесса .

StopThreads() - Остановка всех нитей текущего процесса кроме вызывающей.

RunThreads() - Запуск нитей остановленных StopThreads.

EnablePrivilegeEx(Process: dword; lpPrivilegeName: PChar) - Включение заданой привилегии для процесса.

EnablePrivilege(lpPrivilegeName: PChar) - включение заданной привилегии для текущего процесса.  

EnableDebugPrivilegeEx(Process: dword) - Включение привилегии SeDebugPrivilege для процесса.

EnableDebugPrivilege() - Включение привилегии SeDebugPrivilege для текущего процесса.

GetProcessId(pName: PChar) - Получение Id процесса по его имени.

GetInfoTable(ATableType:dword) - Получение буффера с системной информацией.

OpenProcessEx(dwProcessId: DWORD) - получение хэндла процесса альтернативным методом.

CreateZombieProcess(lpCommandLine: pchar;
                            var lpProcessInformation: TProcessInformation;
                            ModulePath: PChar) - создание процесса "зомби", в контексте которого будет выполняться наша DLL.

InjectDllAlt(Process: dword; ModulePath: PChar) - Внедрение DLL альтернативным способом (без CreateRemoteThread).

DebugKillProcess(ProcessId: dword) - убивание процесса отладочным методом

Достаточно ли этих средств для реализации? На что обратить внимание?


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

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

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


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


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


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

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

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

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


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

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


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

Перехватить 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:31) [11]

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

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


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

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


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


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


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

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

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


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

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

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


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


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


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


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

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

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


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


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

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


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


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


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


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


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

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


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


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


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


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


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


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

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

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


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

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


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


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


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


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


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

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


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

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


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


> Новичоккк  

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


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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.026 c
15-1146232207
ruslan333
2006-04-28 17:50
2006.05.28
Проблема с запуском ISAPI-приложения


2-1147460349
News
2006-05-12 22:59
2006.05.28
Объекты


10-1120033112
supervk
2005-06-29 12:18
2006.05.28
Позиция текста в TWordDocument или TWordApplication


3-1144058948
barakuda
2006-04-03 14:09
2006.05.28
Отчет руками


2-1147364078
appendix
2006-05-11 20:14
2006.05.28
иероглифы