PDA

Просмотр полной версии : Неубиваемая программа


_nic
26.11.2008, 13:53
Я решил пойти по самому простому пути и сыграть на том что в стандартном виндосовском "диспетчере задачь" нельзя убить одновременно 2 приложения.Пытаюсь сделать так что бы программа запускала свою копию которая бы следила сколько её копий запущенно и в случае когда она одна остается запустить ещё раз свою копию.
Пытаюсь делать вот так

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();
}
}

Но не получается уследить за изменением количества запущенных копий программы.
Может кто то что посоветует?
ЗЫ:не откажусь от примера с иньектом потока в системный процесс,который в случае чего будет перезапускать программу.

Jes
26.11.2008, 15:09
NtQuerySystemInformation или ToolHelp тебе в помощь ...

хотя имхо удобнее просто засплайсить TerminateProcess , KillProcess и им подобные

LEE_ROY
26.11.2008, 15:43
сплайс палитсо проактивкаме =\

Pernat1y
26.11.2008, 17:06
taskkill /im process.exe /f
грохнет все process.exe довольно быстро. процесс может неуспеть зареспавниться )

0verbreaK
26.11.2008, 17:24
Кстате NtQuerySystemInformation и есть ToolHelp функции все вместе взятые.

W!z@rD
26.11.2008, 17:39
p.s. назови ее smss к примеру или winlogon (ее это исполняемый файл)
хорошая защита от дурака...

LEE_ROY
26.11.2008, 17:45
taskkill /im process.exe /f
грохнет все process.exe довольно быстро. процесс может неуспеть зареспавниться )
тогда ТС при запуске прога пусть удалит taskkill из системы ;)

_nic
26.11.2008, 21:16
p.s. назови ее smss к примеру или winlogon (ее это исполняемый файл)
хорошая защита от дурака...
Это такой аккардеон ,что на него орут проактивки большинства антивирей :(
ЗЫ:я так и непонял как отследить то что кол-во запущенных копий стало меньше 2х?

_antony
26.11.2008, 23:19
почему бы просто не перехватить NtTerminateProcess ?

0verbreaK
27.11.2008, 00:40
_nic Тебе Jes выше сказал что используются ToolHelp функции
http://msdn.microsoft.com/en-us/library/ms851517.aspx

Dian
27.11.2008, 04:02
Но не получается уследить за изменением количества запущенных копий программы.
Уследить можно mutex'ом

_nic
30.11.2008, 00:10
Вот что у меня в итоге получилось

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 обламывается ,правда палевный способ

sn0w
01.12.2008, 13:36
анхук sst (отключение проактивки) -> инжект (базозависимый: в удаленном процессе выделяем память по адресу == базе нашего exe - чтоб все импорты были корректны и заливаем весь образ, и просто создаем поток на указанной EP) -> восстановление sst (восстановление проактивки).

трабл в том что такие вещи на билдере не пишутся, просто потому что как только внедришься таким методом - вся твоя событийная vcl перестанет работать (OnFormCreate, OnSocketReceive и тд). Изза чего? Изза того что запустится только та функция, которую ты указал как точку входа. Остальных потоков естественно не будет существовать, а передавть управление на OEP в билдере я не пробовал тк давно забил на рапид дев системы =)

по поводу анхука - исходники например sdtrestore есть на rootkit.com - но это уже древний паблик. но для обучения вполне сойдет.

bons
01.12.2008, 14:05
такие вещи как загрузка драйвера или иное внедрение кода в ядро (а сие необходимо для доступа к SST) очень осторожно надо делать ибо защитный софт относится к этому крайне предубежденно..
поэтому всегда есть путь, отличный от ядра
..это конечно если ТС хочет обеспечить незаметность программы

sn0w
01.12.2008, 14:35
~~

th13fnano
08.12.2008, 20:29
да вот моя темка http://forum.antichat.ru/showthread.php?p=983799#post983799 тотже вариант хочю сделать только на делфи елси можно, кто хорошо расбирается помогите плиз.