Форум: "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