Показать сообщение отдельно

  #14  
Старый 30.04.2009, 22:33
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
С нами: 10139366

Репутация: 1502


По умолчанию

а теперь - в том коде есть несколько (много) багов
вот (вроде) правильный (+ добавил получение SeDebugPrivilege):
Код:
#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), в имени модуля лежит не имя экзешника, а полный путь..
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ

Последний раз редактировалось desTiny; 30.04.2009 в 22:38..
 
Ответить с цитированием