Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

Перехватить вызов функции из 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.03 c
2-1146753639
Gelios
2006-05-04 18:40
2006.05.28
ФУНКЦИЯ ПЕРЕВОДА БУКВ РУССКОГО АЛФАВИТА В ВЕРХНИЙ РЕГИСТР


15-1146566557
konrads
2006-05-02 14:42
2006.05.28
UPDATE В2005


15-1146415901
Хозяин
2006-04-30 20:51
2006.05.28
Джорж прикололся


1-1145272894
trank
2006-04-17 15:21
2006.05.28
Метод TCanvas.Draw меняет хэндлы


1-1145231424
vagra
2006-04-17 03:50
2006.05.28
Визуальный редактор форм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский