Неубиваемая программа

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 26 Nov 2008.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я решил пойти по самому простому пути и сыграть на том что в стандартном виндосовском "диспетчере задачь" нельзя убить одновременно 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();
    }
    }
    
    Но не получается уследить за изменением количества запущенных копий программы.
    Может кто то что посоветует?
    ЗЫ:не откажусь от примера с иньектом потока в системный процесс,который в случае чего будет перезапускать программу.
     
  2. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    NtQuerySystemInformation или ToolHelp тебе в помощь ...

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

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    сплайс палитсо проактивкаме =\
     
  4. Pernat1y

    Pernat1y Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    479
    Likes Received:
    79
    Reputations:
    7
    taskkill /im process.exe /f
    грохнет все process.exe довольно быстро. процесс может неуспеть зареспавниться )
     
  5. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Кстате NtQuerySystemInformation и есть ToolHelp функции все вместе взятые.
     
    1 person likes this.
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    p.s. назови ее smss к примеру или winlogon (ее это исполняемый файл)
    хорошая защита от дурака...
     
  7. LEE_ROY

    LEE_ROY Elder - Старейшина

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    тогда ТС при запуске прога пусть удалит taskkill из системы ;)
     
  8. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Это такой аккардеон ,что на него орут проактивки большинства антивирей :(
    ЗЫ:я так и непонял как отследить то что кол-во запущенных копий стало меньше 2х?
     
    #8 _nic, 26 Nov 2008
    Last edited: 26 Nov 2008
  9. _antony

    _antony Elder - Старейшина

    Joined:
    16 Jul 2008
    Messages:
    80
    Likes Received:
    43
    Reputations:
    0
    почему бы просто не перехватить NtTerminateProcess ?
     
  10. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    _nic Тебе Jes выше сказал что используются ToolHelp функции
    http://msdn.microsoft.com/en-us/library/ms851517.aspx
     
  11. Dian

    Dian Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    57
    Likes Received:
    11
    Reputations:
    4
    Уследить можно mutex'ом
     
  12. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Вот что у меня в итоге получилось
    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 обламывается ,правда палевный способ
     
  13. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,297
    Reputations:
    327
    анхук sst (отключение проактивки) -> инжект (базозависимый: в удаленном процессе выделяем память по адресу == базе нашего exe - чтоб все импорты были корректны и заливаем весь образ, и просто создаем поток на указанной EP) -> восстановление sst (восстановление проактивки).

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

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

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    такие вещи как загрузка драйвера или иное внедрение кода в ядро (а сие необходимо для доступа к SST) очень осторожно надо делать ибо защитный софт относится к этому крайне предубежденно..
    поэтому всегда есть путь, отличный от ядра
    ..это конечно если ТС хочет обеспечить незаметность программы
     
  15. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,297
    Reputations:
    327
    ~~
     
    #15 sn0w, 1 Dec 2008
    Last edited: 1 Dec 2008
    2 people like this.
  16. th13fnano

    th13fnano New Member

    Joined:
    8 Dec 2008
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    да вот моя темка http://forum.antichat.ru/showthread.php?p=983799#post983799 тотже вариант хочю сделать только на делфи елси можно, кто хорошо расбирается помогите плиз.
     
Loading...
Similar Threads - Неубиваемая программа
  1. Peja
    Replies:
    0
    Views:
    2,538