Предлагаемый мною способ основан на методах, называемым внедрением dll. Основан на информации из книги Дж. Рихтера "Создание эффективных WIN32-приложений". По ссылке соответствующая глава в электронном виде. http://rosigma.com/96.aspx
Кратко о решении. Решение состоит их 2х частей - программы и библиотеки dll. Сначало необходимо получить идентификатор интересующего процесса. Его можно посмотреть, например, в Task Manager, попробовать найти процесс по окну и т.д. Программа подобно менеджеру приложений выводит список процессов, и ждет ввода id.
Записываем в реестр (можно было бы, например, в файл записывать) данные для dll - имя процесса и времена ожидания и блокировки.
Затем необходимо выполнить действия от имени интересующего процесса. Для этого было бы хорошо заставить процесс загрузить нашу dll. В windows можно запустить поток в адресном пространстве другого процесса, с помощью функции CreateRemoteThread.
Формат функции потока совпадает с форматом функции LoadLibrary (кроме типа аргемента, но это не важно, посколько используется указатель). Этим мы и воспользуемся.
Кроме того необходимо расположить данные в памяти процесса (у каждого процесса память своя). Это делается с помощью функций VirtualAllocEx и WriteProcessMemory. В выделенную память копируем путь до dll.
Затем запускам в удаленном процессе поток, фактически вызывая от имени процесса LoadLibrary().
Таким способом можно загрузить dll в уже работающий процесс. Загрузить dll в создаваемый процесс (приложение) можно, записав его в реесте по следующему ключу HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows AppInit_DLLs
Плохо, что загружаться такая dll будет во все приложения с графическим интерфейсом Поэтому необходима поверка что мы было загружено искомое приложение.
Теперь про dll. При загрузке dll вызывается функция DllMain - аналог main для обычных приложений. Из неё мы проверяем имя процесса и время. Если мы ожидаем процесс, то запускаем поток, который будет ждать необходимое время, а потом вызовет exit(0) и завершит процесс. Если время блокировки, то сразу вызываем exit(0).
Метод работает с перезагрузкой приложения (пока ждем завершения, будем ждать в пределах таймаута) и перезагрузкой компьютера.
И ещё насчёт файлов файл InjectExe.cpp - надо скомпилировать как exe файл InjectDll.cpp - необходимо скомпилировать как dll
Файлы скачай,выместила тут.Ссылка "скачать" вверху
|