Я решил пойти по самому простому пути и сыграть на том что в стандартном виндосовском "диспетчере задачь" нельзя убить одновременно 2 приложения.Пытаюсь сделать так что бы программа запускала свою копию которая бы следила сколько её копий запущенно и в случае когда она одна остается запустить ещё раз свою копию. Пытаюсь делать вот так Code: void __fastcall TForm1::FormCreate(TObject *Sender) { char fnm[400]; GetModuleFileName(NULL,fnm,400); SetLastError(0); CreateEvent(NULL, FALSE, FALSE, TEXT("ProgName_started")); if (GetLastError() != ERROR_ALREADY_EXISTS) { ShellExecute(Form1->Handle,NULL,fnm,NULL,NULL,SW_HIDE); } Form1->Hide(); if (GetLastError() == ERROR_ALREADY_EXISTS) { for(;;) { Sleep(300); SetLastError(0); CreateEvent(NULL, FALSE, FALSE, TEXT("ProgName_started")); if (GetLastError() != ERROR_ALREADY_EXISTS) { ShellExecute(Form1->Handle,NULL,fnm,NULL,NULL,SW_HIDE); break; } } Form1->Show(); } } Но не получается уследить за изменением количества запущенных копий программы. Может кто то что посоветует? ЗЫ:не откажусь от примера с иньектом потока в системный процесс,который в случае чего будет перезапускать программу.
NtQuerySystemInformation или ToolHelp тебе в помощь ... хотя имхо удобнее просто засплайсить TerminateProcess , KillProcess и им подобные
taskkill /im process.exe /f грохнет все process.exe довольно быстро. процесс может неуспеть зареспавниться )
Это такой аккардеон ,что на него орут проактивки большинства антивирей ЗЫ:я так и непонял как отследить то что кол-во запущенных копий стало меньше 2х?
_nic Тебе Jes выше сказал что используются ToolHelp функции http://msdn.microsoft.com/en-us/library/ms851517.aspx
Вот что у меня в итоге получилось Code: TForm1 *Form1; PROCESS_INFORMATION pi; STARTUPINFO si; void thr(void *Pvoid) { char fnm[400]; DWORD code; for(;;) { Sleep(300); GetExitCodeProcess(pi.hProcess,&code); if(code!=STILL_ACTIVE) { MessageBox(0,"!!!","!!!!",MB_OK); GetModuleFileName(NULL,fnm,400); memset((void*)&pi,NULL,sizeof(pi)); memset((void*)&si,NULL,sizeof(si)); CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); memset(fnm,NULL,400); } } } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { char fnm[400]; GetModuleFileName(NULL,fnm,400); si.cb=sizeof(si); si.lpReserved=NULL; si.lpDesktop=NULL; si.lpTitle=NULL, si.dwFlags=STARTF_FORCEONFEEDBACK; si.cbReserved2=0; si.lpReserved2=NULL; HANDLE mut=CreateMutex(0,1,"emokillll"); WaitForSingleObject(mut,-1); CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); _beginthread(thr,0,0); } ЗЫ: если экзе потом обозвать svchost'ом то манипуляция taskkill /im process.exe /f обламывается ,правда палевный способ
анхук sst (отключение проактивки) -> инжект (базозависимый: в удаленном процессе выделяем память по адресу == базе нашего exe - чтоб все импорты были корректны и заливаем весь образ, и просто создаем поток на указанной EP) -> восстановление sst (восстановление проактивки). трабл в том что такие вещи на билдере не пишутся, просто потому что как только внедришься таким методом - вся твоя событийная vcl перестанет работать (OnFormCreate, OnSocketReceive и тд). Изза чего? Изза того что запустится только та функция, которую ты указал как точку входа. Остальных потоков естественно не будет существовать, а передавть управление на OEP в билдере я не пробовал тк давно забил на рапид дев системы =) по поводу анхука - исходники например sdtrestore есть на rootkit.com - но это уже древний паблик. но для обучения вполне сойдет.
такие вещи как загрузка драйвера или иное внедрение кода в ядро (а сие необходимо для доступа к SST) очень осторожно надо делать ибо защитный софт относится к этому крайне предубежденно.. поэтому всегда есть путь, отличный от ядра ..это конечно если ТС хочет обеспечить незаметность программы
да вот моя темка http://forum.antichat.ru/showthread.php?p=983799#post983799 тотже вариант хочю сделать только на делфи елси можно, кто хорошо расбирается помогите плиз.