помогите скрыть процесс в диспетчере задач с помощью Delphi 7

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by dimarik-dima, 29 Apr 2009.

  1. dimarik-dima

    dimarik-dima Banned

    Joined:
    24 Jan 2009
    Messages:
    59
    Likes Received:
    3
    Reputations:
    0
    когда писал программу сталкнулся с такой проблеммой со скрытием процесса в диспетчере задач windows xp!!! подскажите плиз какой модуль надо подключить и что нужно написать чтобы диспетчер процесс неотображал
     
  2. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Статья всеми уважаемого Рема по инжекту, скрытию, раскрытию:
    http://wasm.ru/article.php?article=apihook_1
    Прога для скрытия + сорцы на делфи:
    http://wasm.ru/pub/21/files/prochide.rar
     
  3. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Ты много раз вм прот и фиму без фантомки распаковывал? Очень помогало раньше прятать ольку.
    А рема ты когда последний раз видал? я в районе 2006-начале 2007. Статья действительно старая, но инжект некогда не потеряет актуальность
     
  4. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Если речь идет действительно о троянах, то я даже спорить не стану, все верно. Просто я сразу начал думать в другую сторону, т.к. сам реверсер и сокрытие процесса у меня подразумевается с отладкой/анти-отладкой =)
     
  5. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Если прятать процесса - это ппц палится и выясняется банальным перебором PID'ов процессов и попыткой их открытия и сравнение результата с реально отображаемым процессами, так что такое ленивый даже спалит. Другая сторона - скрыть процесс именно для стандартного диспетчера задач. Есть гдето DLL которая это делает.
    С теоретической реализации - это банальное слежения за окнами и если найдено окно диспечера задача, то находится поле отображения процесса (типа листбокс) и постоянно оно преезписывается (чаще чем стандартно) и от туда выкидывается имя своего процесса.

    <offtop>
    Если я не ошибаюсь то Ms-Rem погиб в автокатастрофе
    </offtop>
     
  6. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Санке предоставлял фотки, якобы с могилы Рема(только он с ним был знаком в реале). Но как в последствии оказалось, это не правда, Рем жив, просто он вырос что-ли... и ушел.

    з.ы.: все, молчу,молчу, больше ничего не буду говорить по этому поводу. холивары тут не нужны.
     
  7. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Бред.((((
     
  8. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    <тут был бажный кодес. ну его... )>
     
    #8 desTiny, 30 Apr 2009
    Last edited: 30 Apr 2009
  9. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 desTiny А ты незабывай что есть скрытые процессы, а есть зомби.
    Зомби в смысле - завершенные процессы, но еще неубитые виндой хз по каким причинам. Отличить зомби от скрытого процесса можно через запрос списка модулей процесса(EnumProcessModules) Если список не может быть получен, значит это зомби, в противном случае - скрытый процесс.
    Это связано скоре всего с тем, что данные о модулях хранятся в PEB, а т.к. юзермодная часть уже уничтожена (и PEB отсутствует) то запрос проваливается.
     
    #9 slesh, 30 Apr 2009
    Last edited: 30 Apr 2009
  10. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    да я и не забываю... просто я к тому, что совысем тупой перебор не поможет. но среди этих процессов есть и вполне легальные)
     
  11. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    400
    Likes Received:
    153
    Reputations:
    48
    у рема в phunter всё это было реализовано :)
     
    1 person likes this.
  12. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а теперь - в том коде есть несколько (много) багов
    вот (вроде) правильный (+ добавил получение SeDebugPrivilege):
    Code:
    #define MPID 0xFFFF+1
    #define SHOW_ALL
    #define SEDEBUG
    
    #if defined(WIN32) && !defined(_WIN32)
    #define _WIN32
    #endif
    #define _WIN32_WINNT 0x0500
    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
    #include <winbase.h>
    #include <psapi.h>
    #pragma comment(lib,"Psapi.lib")
    
    #ifndef STATUS_INFO_LENGTH_MISMATCH
    #define STATUS_INFO_LENGTH_MISMATCH	((NTSTATUS)0xC0000004L)
    #endif
    #define NtQuerySystemInformation _NtQuerySystemInformation
    #include <winternl.h>
    #undef NtQuerySystemInformation
    
    #define SystemHandleInformation 16
    
    typedef LONG KPRIORITY;
    typedef struct {
    		 int index;
    		 bool hidden;
    		 HANDLE handle;
    		 TCHAR Name[MAX_PATH];
    	} Process;
    Process List[MPID];
    SYSTEM_PROCESS_INFORMATION SystemPrInfo[MPID];
    
    typedef struct {
        ULONG NextEntryOffset;
        ULONG NumberOfThreads;
        LARGE_INTEGER SpareLi1;
        LARGE_INTEGER SpareLi2;
        LARGE_INTEGER SpareLi3;
        LARGE_INTEGER CreateTime;
        LARGE_INTEGER UserTime;
        LARGE_INTEGER KernelTime;
        UNICODE_STRING ImageName;
        KPRIORITY BasePriority;
        HANDLE UniqueProcessId;
        HANDLE InheritedFromUniqueProcessId;
        ULONG HandleCount;
        ULONG SessionId;
        ULONG SpareUl3;
        SIZE_T PeakVirtualSize;
        SIZE_T VirtualSize;
        ULONG PageFaultCount;
        ULONG PeakWorkingSetSize;
        ULONG WorkingSetSize;
        SIZE_T QuotaPeakPagedPoolUsage;
        SIZE_T QuotaPagedPoolUsage;
        SIZE_T QuotaPeakNonPagedPoolUsage;
        SIZE_T QuotaNonPagedPoolUsage;
        SIZE_T PagefileUsage;
        SIZE_T PeakPagefileUsage;
        SIZE_T PrivatePageCount;
        LARGE_INTEGER ReadOperationCount;
        LARGE_INTEGER WriteOperationCount;
        LARGE_INTEGER OtherOperationCount;
        LARGE_INTEGER ReadTransferCount;
        LARGE_INTEGER WriteTransferCount;
        LARGE_INTEGER OtherTransferCount;
    } MORE_SYSTEM_PROCESS_INFORMATION;
    
    typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO {
        USHORT UniqueProcessId;
        USHORT CreatorBackTraceIndex;
        UCHAR ObjectTypeIndex;
        UCHAR HandleAttributes;
        USHORT HandleValue;
        PVOID Object;
        ULONG GrantedAccess;
    } SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
    
    typedef struct _SYSTEM_HANDLE_INFORMATION {
        ULONG NumberOfHandles;
        SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[ 1 ];
    } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
    
    typedef NTSTATUS (WINAPI* NTQUERYSYSTEMINFORMATION)(DWORD, PVOID, DWORD, DWORD*); 
    NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;
    static DWORD find(int* xt)
    {	int k = 0;
    	SIZE_T RequiredLength;
    	NTSTATUS s;
    	MORE_SYSTEM_PROCESS_INFORMATION *ProcTable,*Proc;
    	RequiredLength=64*1024;
    	ProcTable = (MORE_SYSTEM_PROCESS_INFORMATION *)VirtualAlloc(NULL,RequiredLength,MEM_COMMIT,PAGE_READWRITE);
    	if (ProcTable == NULL) return -1;
    
    	while ((s=NtQuerySystemInformation(SystemProcessInformation,
    			ProcTable,
    			(ULONG)RequiredLength,NULL))
    			== STATUS_INFO_LENGTH_MISMATCH)
    	{
    		RequiredLength += 16*1024;
    	    VirtualFree(ProcTable,0,MEM_RELEASE);
            ProcTable = (MORE_SYSTEM_PROCESS_INFORMATION *)VirtualAlloc (NULL,RequiredLength,
    			MEM_COMMIT,PAGE_READWRITE);
    	    if (ProcTable == NULL) return -1;
    	}
    	
    	Proc=ProcTable;
    	do {
    		k++;
    		RtlCopyMemory(List[(DWORD)Proc->UniqueProcessId].Name,Proc->ImageName.Buffer,Proc->ImageName.MaximumLength);
    	    if(!List[(DWORD)Proc->UniqueProcessId].hidden){
    			(*xt)++;
    			printf("strange one: %.4X ", (DWORD)Proc->UniqueProcessId);
    			_putts(List[(DWORD)Proc->UniqueProcessId].Name);
    		}
    	    List[(DWORD)Proc->UniqueProcessId].hidden = false ;
    		Proc=(MORE_SYSTEM_PROCESS_INFORMATION *)((char *)Proc+Proc->NextEntryOffset);
    	} while (Proc->NextEntryOffset);
    
    	VirtualFree (ProcTable,0,MEM_RELEASE);
    
      return k;
    }
    
    void Enum2(){
    	int f1 = 0, f2 = 0, xt = 0, z = 0;
    	HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll"));
    	NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(
            hNtDll, "NtQuerySystemInformation");
    	for(int i = 0; i < MPID; i+=4){
    		HANDLE p = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, false, i);
    		HMODULE a; DWORD b=0;
    		if (p&&(EnumProcessModules(p,&a,0,&b)||(b>0))||i==4){
    	    	List[i].handle = p;
    			GetModuleFileNameExW(p, 0, List[i].Name, MAX_PATH);
    			CloseHandle(p);
    			List[i].hidden = true;
    			f1++;
    		}else{
    			if(p){
    				List[i].handle = (HANDLE)-1;
    				List[i].hidden = true;
    				z++;
    			}
    		}
    		
    	}
    	f2 = find(&xt);
    
    	/**/
    	int cpid = GetCurrentProcessId();
    	//f1 -- : current
    	f1--;
    	f2--;
    	/**/
    
    #ifdef SHOW_ALL
    	for (int i = 0; i<MPID; i+=4)
    		if(List[i].handle && List[i].handle!=(HANDLE)-1 && i != cpid){
    			printf("%.4X - ",i);
    			if (List[i].hidden)
    				printf("(warning! hidden one!) ");
    			_putts(List[i].Name);			
    		}
    	printf("Zombies:\n");
    	int k = 0;
    	for (int i = 0; i<MPID; i+=4)
    		if(List[i].handle==(HANDLE)-1){
    			printf("%X",i);
    			if (++k!=z) printf(", ");
    		}
    	printf("\n\n------------\n");	
    	printf("all: %d + %d\nvisible: %d\nzombies: %d\n",f1, xt, f2, z);
    #endif	
    	int i;
    	scanf("%c", &i);
    }
    
    bool SetDebugPrivileges() {
    	LUID Luid;
    	TOKEN_PRIVILEGES tpToken;
    	HANDLE hToken;
    
    	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) {
    		return false;
    	}
    
    	if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid)) {
    		CloseHandle (hToken);
    		return false;
    	}
    
    	tpToken.PrivilegeCount = 1;
    	tpToken.Privileges[0].Luid = Luid;
    	tpToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    	if (!AdjustTokenPrivileges(hToken, false, &tpToken, NULL, NULL, NULL)) {
    		CloseHandle(hToken);
    		return false;
    	}
    
    	CloseHandle(hToken);
    	return true;
    
    }
    
    int main(){
    #ifdef SEDEBUG
    	SetDebugPrivileges();
    #endif
    	Enum2();
    	return 0;
    }
    thx 2 slesh

    >>у рема в phunter всё это было реализовано
    Да тут нетрудно реализутся-то ) другое дело, что во время кодинга можно какие-то забавные вещи узнать.. вот например, оказалось, что во время загрузки программы (то есть при исследуемый pid = CurrentPid), в имени модуля лежит не имя экзешника, а полный путь..
     
    #12 desTiny, 30 Apr 2009
    Last edited: 30 Apr 2009
    1 person likes this.
  13. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    <offtop>Тема прикольно развилась ) Начали за здравие закончили заупакой (только в нашем случае наоборот)</offtop>

    А вообще для скрытия попробуйте заюзать код DLL из Delphi World - "Ныкаем программу от Ctrl Alt Del в WinXP"
    Покрайней мере 6 каспер молчит на такое )
     
  14. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    да.. точно.. сабж ведь есть) Вообще такая либа вроде работает (не знаю, может я что-нть лишнее вырезал, когда код выбирал - но вряд ли)
    http://pastebin.com/f4b4169cf
     
    #14 desTiny, 30 Apr 2009
    Last edited: 30 Apr 2009
  15. dimarik-dima

    dimarik-dima Banned

    Joined:
    24 Jan 2009
    Messages:
    59
    Likes Received:
    3
    Reputations:
    0
    :cool: desTiny!!! slesh!!! Большое спасибо за внимание и за полезную информацию!!! кстати очень помогло!!! Конечно хотелось бы и узнать побольше про скрытые процессы и зомби!!!