Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2013, 19:04   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Загрузить библиотеку в внешний процесс - только инжект?

В соседних ветках уже касался этого вопроса,но хотелось бы уточнить еще раз. Если мне надо вызвать функцию LoadLibrary для внешнего процесса, возможно ли это сделать без инжектирования кода внутрь этого процесса?
Сначала я думал что CreateProcess или OpenProcess могут помочь, но получается что все команды будут относиться к моему загрузчику,а не внешнему процессу?
Ну например: proga1.exe вызывает CreateProcess proga2.exe
Далее proga1.exe вызывает LoadLibrary или VirtualAlloc - на процесс proga2.exe это будет влиять или нет?
calypso вне форума Ответить с цитированием
Старый 22.02.2013, 19:09   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

процессы не связаны, инжектировать короткий кусок кода:
http://wm-help.net/books-online/book...-16.html#h22t4
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.02.2013, 20:16   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Что то я туплю опять.А зачем инжектировать? Если я вызову CreateProcess,а затем CreateRemoteThread(hProcessRemote, NULL, 0, LoadLibraryW, L"C \\MyLib.dll" , 0, NULL); из моего приложения-загрузчика, не будет работать?
И таким же образом можно любую функцию вызвать,скажем VirtualAlloc?

Последний раз редактировалось calypso; 22.02.2013 в 20:19.
calypso вне форума Ответить с цитированием
Старый 22.02.2013, 20:32   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Не, не будет - "MyLib.dll" строка будет в вашем процессе.
Строго говоря, нет гарантии, что адрес LoadLibrary будет один и тот же во всех процессах (хотя для kernel32 это обычно так).

Через CreateRemoteThread сможете вызывать только функции с одним аргументом - VirtualAlloc к ним не относиться.
waleri вне форума Ответить с цитированием
Старый 22.02.2013, 20:45   #5
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Ну тогда значит получается CreateRemoteThread будет выполнять роль функции InjectDLL ,а уже в DLLMain MyLib.dll нужно прописать код с VirtualAlloc,LoadLibrary,GetModuleH andle,GetProcAddress и т.д.

Кстати не пойму,у Рихтера книжка Windows via C++ ничем не отличается от Windows Для профессионалов? Что то по моему там целые главы одинаковые
calypso вне форума Ответить с цитированием
Старый 22.02.2013, 20:51   #6
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

И ещё вопрос: у меня CreateProcess создается с параметров CREATE_SUSPEND ,т.е. загружаются не все библиотеки.Я создам в нем свой поток,выполню код из инжектированной DLL,а потом как продолжить нормальную загрузку процесса? Или система сделает это автоматически
calypso вне форума Ответить с цитированием
Старый 22.02.2013, 22:13   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Надо сделать ResumeThread первого потока процесса - возвращается из CreateProcess()

А вот насчет загрузки DLL это еще вопрос... если DLL процесса еще не загружены, как будет вызываться LoadLibrary?
waleri вне форума Ответить с цитированием
Старый 23.02.2013, 13:04   #8
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Ну да, с CREATE_SUSPENDED вероятно не получится - процесс ещё не проинициализирован. А есть ещё способы приостановить его загрузку чтобы загрузился минимальный набор библиотек,но уже с kernel32?
calypso вне форума Ответить с цитированием
Старый 23.02.2013, 13:49   #9
SnX
Форумчанин
 
Регистрация: 30.10.2009
Сообщений: 114
По умолчанию

Цитата:
Ну да, с CREATE_SUSPENDED вероятно не получится - процесс ещё не проинициализирован.
Все там получится, все библиотеки к этому времени уже загружены.
Различных статей по этой теме огромное множество, так что стоит поискать и почитать, все вопросы сразу отпадут.
SnX вне форума Ответить с цитированием
Старый 25.02.2013, 12:56   #10
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Код:
void __fastcall TForm14::Button1Click(TObject *Sender)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
ZeroMemory(&pi,sizeof(pi));

//Открываем файл дампа (создаем процесс) с минимальным набором модулей
CreateProcess(L"E:\\Games\\Liberation\\dump.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
int oshibka=GetLastError();
ShowMessage(IntToStr(oshibka));

//Открываем процесс в памяти (получаем его хэндл)
HANDLE dumphand=OpenProcess(PROCESS_ALL_ACCESS,TRUE,pi.dwProcessId);

//Получаем адрес в памяти функции LoadLibraryW в модуле KERNEL32
PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW");

//Создаем поток в чужом процессе (инжектирование DLL)
CreateRemoteThread(dumphand,NULL,0,pfnThreadRtn,(void*)L"E:\\Games\\Liberation\\VMManager.dll",0,NULL);
ResumeThread((void*)pi.dwThreadId);
}
CreateRemoteThread Выдает ошибку что нет доступа
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AppInit_DLLs и инжект в определенный процесс nls Win Api 2 01.02.2013 09:17
Hibernate. Java. Загрузить список только из одного поля таблицы KBI Java Базы данных (JDBC, JPA, Hibernate) 1 26.07.2012 19:32
Загрузить библиотеку вместе сразу вместе с программой Anekdot Общие вопросы Delphi 4 26.01.2010 23:14
Загрузить процесс в память, но не допустить запуска Crivel Общие вопросы Delphi 8 28.05.2009 11:17
Как загрузить свою DLL в атакуемый процесс, который не знает о ее существовании - Создание хуков KleoY Win Api 18 30.03.2009 14:31