Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Аналог функции RegistredServiceProcess в WindowsXP


Автор: Cyber_Master 22.5.2004, 15:53
В Windows 9x есть функия 'RegistedServiceProcess', скрывающая приложение в диспетчере задач, в Windows XP её нет sad.gif .
Подскажите, есть ли для этой функции аналог в Win XP, если есть, то какой ????

Автор: _hunter 22.5.2004, 16:07
Код
DWORD SetSecurityInfo(
 HANDLE handle,
 SE_OBJECT_TYPE ObjectType,
 SECURITY_INFORMATION SecurityInfo,
 PSID psidOwner,
 PSID psidGroup,
 PACL pDacl,
 PACL pSacl
);

Автор: Cyber_Master 22.5.2004, 16:38
А что она конкрктно делает ? (Здесь попробовать не могу, хочется выяснить сразу всё)... rolleyes.gif

Автор: _hunter 22.5.2004, 16:58
Цитата
The SetSecurityInfo function sets specified security information in the security descriptor of a specified object. The caller identifies the object by a handle.

Цитата
security descriptor
A structure and associated data that contains the security information for a securable object. A security descriptor identifies the object's owner and primary group. It can also contain a DACL that controls access to the object, and a SACL that controls the logging of attempts to access the object.

Автор: Cyber_Master 22.5.2004, 17:04
А что за аргументы ?

Автор: _hunter 22.5.2004, 17:09
а чего бы самому не глянть? smile.gif
http://msdn.microsoft.com/library/en-us/security/security/setsecurityinfo.asp

Автор: Cyber_Master 22.5.2004, 17:12
Спасибо, уже посмотрел и скачал... Буду пробовать. biggrin.gif

Автор: p0s0l 22.5.2004, 19:48
_hunter, а можешь привести пример как с помощью ЭТОГО скрыть задачу ? Просто оригинальный метод будет, если заработает (хотя не представляю как)... smile.gif

Cyber_Master, см. FAQ, там есть ответ.

Автор: _hunter 22.5.2004, 23:05
к сожалению свой привести не могу ( не занимался таким smile.gif )
но вот что написанно в "Клещ для MS Windows":
Цитата
Запрет на прерывание. В системе Win-9x/ME программу необходимо скрыть по "Alt"+"Ctrl"+"Del", а в системах на платформе WinNT можно сделать запрет на прерывание процесса в TaskManager-е. Выглядит это так (корректно работает на всех системах):

Код
type
 funcNT = function (param1 : DWORD; param2 : Byte; param3 : DWORD; param4, param5 : PSID; param6, param7 : PACL): DWORD; stdcall;
 func9x = function (param1, param2: Integer): Integer; stdcall;
var
Ver : TOSVERSIONINFO;
myACL1 : ACL;
_funcNT : funcNT;
_func9x : func9x;
hLib : DWORD;
begin
Ver.dwOSVersionInfoSize:=SizeOf(Ver);
GetVersionEx(Ver);
if Ver.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
 if not InitializeAcl(myACL1, sizeof(ACL), 2) then exit;
 if not IsValidAcl(myACL1) then exit;
 hLib := LoadLibrary('advapi32.dll');
 if hLib>0 then begin
   @_funcNT:=GetProcAddress(hLib, 'SetSecurityInfo');
   _funcNT(GetCurrentProcess, 6, 4, nil, nil, addr(myACL1), nil);
   FreeLibrary(hLib);
 end;
end else begin
 hLib := LoadLibrary('kernel32.dll');
 if hLib>0 then begin
   @_func9x:=GetProcAddress(hLib, 'RegisterServiceProcess');
   _func9x(0,1);
   FreeLibrary(hLib);
 end;
end;
end;

Автор: p0s0l 23.5.2004, 15:18
Может у меня неправильная винда, но не пашет (WinXP) - и видится в списке приложений, и спокойно снимается через Ctrl-Alt-Del... sad.gif

Автор: Guest 25.5.2004, 14:23
Аналогично....

Автор: Akella 28.5.2004, 08:11
После установки на WinXP SP1 скрывать приложения стало еще тяжелее. Хотя нет ничего невозможного. Мы просто ленимся...

Автор: p0s0l 28.5.2004, 11:09
Cyber_Master, тебе надо скрыть из списка процессов или из списка приложений (с панели задач) ?
Если второе, то это просто:
ShowWindow(Application.Handle, SW_HIDE);

Автор: Cyber_Master 20.6.2004, 13:18
Желательно первое... sad.gif . (форма должа быть показана)

p.s. SetSecurityInfo тоже не желает работаль...

Автор: ArXOn 20.6.2004, 13:32
Я тут подумал, а если запретить снимать процесс из Виндоус (Что - то типа 'Это критический системный процесс...').
Если есть мысли по этому поводу, излагайте! smile.gif

Автор: Borland_Delphi_6 20.6.2004, 20:18
У меня где-то был прикольный исходник (кстати, с этого же форума), который путем долгих извращений позволял скрыть даже из списка процессов, но там надо было что-то в реестр еще прописывать... Если кого интересует, могу поискать. Тока напишите в ПМ, скорее всего я про этот топик забуду rolleyes.gif

Автор: _hunter 22.6.2004, 15:51
какие еще мысли?
именно это и делает функция SetSecurityInfo ( по-идее smile.gif ) -- дает / забирает разрешения

Автор: Poseidon 2.1.2006, 19:16
Поднимаю топик т.к. решения так и не нашел.

Дано:
Цитата(Akella @ 28.5.2004, 07:11)
WinXP SP1
и выше...

Нужно:
Цитата(p0s0l @ 28.5.2004, 10:09)
скрыть из списка процессов


Найти: рабочий код.

Есть у кого мысли?

Автор: _hunter 3.1.2006, 12:19
http://www.rsdn.ru/Forum/?mid=21354
http://www.rsdn.ru/Forum/?mid=323267

Автор: Guedda 3.1.2006, 13:47
Интересная, конечно, неразбериха с таким форумом на rsdn, но лучше бы выложить исходники, так как они смогут помочь не только одному человеку. А еще лучше,поместить исходники в DRKB, и это будет очень круто.

Автор: _hunter 3.1.2006, 14:03
ну и выкладывай. в чем проблема?

Автор: Guedda 3.1.2006, 14:16
Так вот я прошу исходники у Borland_Delphi_6 smile

Автор: StayAtHome 3.1.2006, 15:57
DRKB: Как спрятать программу от TaskManager в WindowsXP и 2000
Этот вопрос меня уже достал, он задаётся на всех программистских форумах, поэтому я выкладываю solution. Листинг библиотеки (nthide.dll), которая будет выполнять нужную нам функцию:

Код

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.

Для её использования нужно вызвать функцию HideProcess:
Код

function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL,
где
pid - идентификатор процесса, который нужно спрятать

HideOnlyFromTaskManager - нужно ли прятать процесс только от TaskManager'а, или же от остальных программ, использующих для получения списка процессов функцию NtQuerySystemInformation из ntdll.dll.

Пример использования:
Код

function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall; external 'nthide.dll'; 
//< skipped > 
procedure proc; 
begin 
 HideProcess(GetCurrentProcessId, false); //это спрячет текущий процесс 
end;

Автор Curve
Взято из http://forum.sources.ru

Автор: Alexeis 3.1.2006, 16:26
Довольно жестокий метод. По сути это уже взлом операционки...

Автор: Guedda 3.1.2006, 17:05
А что поделаешь? Сами разработчики ОС виноваты.

Автор: StayAtHome 3.1.2006, 17:51
Цитата(Guedda @ 3.1.2006, 16:05)
А что поделаешь? Сами разработчики ОС виноваты.

В чем?! smile В том что дали пользователю возможность видеть все процессы в его системе? ИМХО так и должно быть.

Автор: Демо 5.1.2006, 17:31
Как известно, для люой гайки найдется хитроумный винт с резьбой.
Поэтому скрыть что-либо совсем невозможно.

Автор: Poseidon 6.1.2006, 01:05
StayAtHome, все бы хорошо, но тот код из DRKB считается Антивирусом Касперского http://www.viruslist.com/ru/search?VN=HackTool.Win32.Hidd.b. А давать заказчику программу, каторую тут же споймает его антивирь - это потом проблем не оберешься. И обьяснения не помогут smile

Автор: StayAtHome 6.1.2006, 01:37
Страннно, я успещно использовал такой код в своем проекте (не трояне!) и Касперский нормально к нему относился. Может у тебя расширенные базы (с контролем adware и т.д.)? Он с такими базами меня даже на reboot.com матерился! %)
Добавлено @ 01:37
Хотя, если подумать логично, хороший антивирус и должен такие вещи ловить -- это ж 90% признак трояна -- прятать себя от пользователя. Тогда уж vxd-драйвер какой пиши....

Автор: bems 6.1.2006, 14:13
Попробуй лечь под чужой процесс, например winlogon

Автор: this 6.1.2006, 18:33
Цитата(bems @ 6.1.2006, 14:13)
Попробуй лечь под чужой процесс, например winlogon

А не подскажешь как?

Автор: bems 6.1.2006, 18:44
http://forum.vingrad.ru/index.php?showtopic=77028
Добавлено @ 18:44
Цитата(this @ 6.1.2006, 18:33)
Цитата(bems @ 6.1.2006,  14:13)
Попробуй лечь под чужой процесс, например winlogon

А не подскажешь как?

Уже подсказал
http://forum.vingrad.ru/index.php?showtopic=77028

Автор: nvbud 13.3.2006, 18:11
Использую nthide.dll. Результат: На вкладке "Процессы" - не видно smile , но зато Видно на вкладке "Приложения"!!! smile

Windows XP SP2

Автор: Snowy 13.3.2006, 18:16
Ну так ты его с таскбара убери.
Иначе какой смысл прятать, если оно у тебя прямо на таскбаре сидит...
ShowWindow(Application.Handle, SW_HIDE);

Автор: nvbud 14.3.2006, 09:17
Спасибо!! Получилось. smile

Автор: Cashey 17.11.2006, 15:26
Цитата(StayAtHome @  3.1.2006,  16:57 Найти цитируемый пост)
Листинг библиотеки (nthide.dll)

NOD не дает даже откомпилировать библиотеку smile

Автор: nvbud 17.11.2006, 17:07
Цитата(Cashey @  17.11.2006,  15:26 Найти цитируемый пост)
NOD не дает даже откомпилировать библиотеку  

А какая у Вас версия Delphi и Nod'а?
У меня стоит NOD32 2.5 и Delphi7 -- всё отлично компилируется! (WinXP)

Автор: Cashey 17.11.2006, 22:10
Дельфя 6-я
Каспер хоть и дает откомпилится, но тут же кричит предупреждение. что делает приведенный модуль (не смотря на всю его привлекательность) неприменимым на практике smile

Автор: RinOSpro 23.1.2008, 23:34
Итак люди покажу как не допустить завершения процесса из Диспетчера задач.  Все не  так сложно как вы думаете все на много на много сложнее smile. Возьмите свой готовый экзешник и переименуйте его в smss.exe smile все диспетчер уже низачто не убьет его  smile.
Также можно переименовать в lsass.exe, csrss.exe, services.exe, winlogon.exe.

Все гениальное просто, ну а если кому хочется по настоящему сделать не убиваемый процесс то добро пожаловать в ring0, да и то нет не убиваемых процессов.

Автор: Rennigth 24.1.2008, 12:41
Цитата(RinOSpro @  23.1.2008,  23:34 Найти цитируемый пост)
Итак люди покажу как не допустить завершения процесса из Диспетчера задач.  Все не  так сложно как вы думаете все на много на много сложнее . Возьмите свой готовый экзешник и переименуйте его в smss.exe  все диспетчер уже низачто не убьет его  .
Также можно переименовать в lsass.exe, csrss.exe, services.exe, winlogon.exe.

o_0 нюню. Я первым делом прибью такой процесс запущенный не от system, local service или network service

Добавлено через 4 минуты и 6 секунд
п.с. тему то поднял четырех летней давности...

Автор: RinOSpro 24.1.2008, 15:58
Цитата

Я первым делом прибью такой процесс запущенный не от system, local service или network service


А кто те сказал что он не от SYSTEM запущен. Примеров сервисов огромное множество, а сервис автоматом запуститься с SYSTEM.
И это скорее защита от ламера. Но уж ни как не от программиста, читай внимательнее
Цитата

нет не убиваемых процессов.

Rennigth так что ты сам ложанулся когда сказал что 
Цитата

Я первым делом прибью такой процесс запущенный не от system, local service или network service
  smile

Автор: RinOSpro 24.1.2008, 16:15
ps Ну если за 4 года небыло простого споссоба... Кстати для споров есть другой раздел  smile лучше бы дал какой нибудь совет.

Автор: E_v_g 25.1.2008, 12:25
Пытаюсь компилировать 
Код

library hide;
, вылазит ошибка: Undeclared identifier: SystemProcessesAndThreadsInforma - вот прям так, без окончания!
Delphi 5

Автор: Rennigth 25.1.2008, 13:36
Цитата(E_v_g @  25.1.2008,  12:25 Найти цитируемый пост)
SystemProcessesAndThreadsInforma

SystemProcessesAndThreadsInformation?

Автор: dumb 25.1.2008, 14:41
видимо, это ограничение на длину имени - 32 символа. либо взять более свежую версию дельфи, либо "обрезать" длинные имена переменных.

Автор: Rennigth 25.1.2008, 19:06
Цитата(dumb @  25.1.2008,  14:41 Найти цитируемый пост)
видимо, это ограничение на длину имени - 32 символа.

 smile а такое было? В каких версиях? Все до пятерки небось?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)