Форум: "WinAPI";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];
ВнизЗагрузка DLL в чужой процесс Найти похожие ветки
← →
paul_shmakov (2002-01-08 12:16) [5]динамические:
1. см. выше Wizard (06.01.02 14:52). недостатки метода - mydll.dll грузиться во все неконсольные процессы.
2. с помощью хуков. создается библиотека (inject.dll), из которой экспортируется функция (InjectMyDll), которая устанавливает глобальную ловушку на посылку любого сообщения. В этой же dll находиться функция-обработчик хука. Далее, процесс-загрузчик (loader.exe) подгружает inject.dll, вызывает InjectMyDll, та, в свою очередь, сразу же посылает главному окну
program.exe сообщение SendMessage(hWnd, WM_NULL, 0, 0) для того, чтобы program.exe первым подгрузил inject.dll. после того, как inject.dll загрузилась, вызывается код функции-обработчика хука. Эта функция и должна вызвать LoadLibrary("mydll.dll"). После того ловушку сразу снимаем, чтобы inject.dll не грузилась во все работающие процессы.
почему нельзя сразу было грузить mydll.dll вместо inject.dll? Потому что inject.dll выгрузиться виндами после снятия ловушки. Это самый простой способ.
этот способ не работает на консольных приложениях.
3. загрузка с помощью удаленного потока. в адресном пространстве процесса program.exe выделяем память (pMem = VirtualAllocEx), копируем в нее название нашей dll, т.е. строку "mydll.dll". Далее вызываем функцию CreateRemoteThread(..,..,.., @LoadLibraryA, pMem, .., ..). Т.е. создаем поток в чужом процессе, передавая в качестве функции потока адрес LoadLibrary, а в качксве параметра - адрес строки "mydll.dll". поток запускается, вызывается LoadLibrary и подгружается наша dll. очень удобный и простой метод. единственный недостаток - не работает под win9x.
4. более сложный метод. можно загрузить program.exe для отладки (флаг DEBUG_ONLY_THIS_PROCESS в CreateProcess). Тогда вашему процессу будет выдаваться куча уведомлений о том, что происходит в отлаживаемом процессе. Одно из таких уведомлений приходит, когда загрузчик windows загрузил процесс и все импортируемые им библиотеки, и процесс готов выполнить свою первую команду. вот в этот-то момент и можно вручную (программно) выделить в этом процессе себе память, записать туда название вашей dll, машинные инструкции для загрузки вашей dll и переход на оригинальную точку входа, после этого подправить структуру CONTEXT (исправить в ней регистр eip для того, чтобы он указывал на начало вашего "патча"), установить этот новый контекст (SetThreadContext) и запустить program.exe на дальнейшее выполнение. метод сложный, но универсальный. работает для любых приложений на всех операционках.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c