ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

утилиты - icmprange, mbrscan
  #1  
Старый 22.12.2008, 22:22
Аватар для bons
bons
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме:
1777055

Репутация: 347
По умолчанию утилиты - icmprange, mbrscan

написал недавно пару консольных утилит для Windows на языке C, решил выложить, может будут кому-то полезны.

icmprange

Утилита предназначена для посылки ICMP-запросов диапазону IP-адресов. То есть это примерно то же что и запуск nmap с ключом -sP. Вывод ведется по мере поступления ICMP-ответов поэтому неотсортирован

Пример использования:
Код:
icmprange 192.168.0.1-254 1000
где 1000 - таймаут в миллисекундах

Использовать можно например там где нет надобности или возможности применить более мощные инструменты

Исходный код:
Код:
#include <windows.h>
#include <winsock.h>
#include <stdio.h>

//Прототипы структур
typedef struct _REQUESTINFO {
	void* replyBuf;
	int ReplySize;
	UINT addr;
} REQUESTINFO,*PREQUESTINFO;

typedef struct _IPRANGE {
	BYTE Beg[4];
	BYTE End[4];
} IPRANGE,*PIPRANGE;

//Прототипы функций
typedef DWORD (WINAPI *ICMPPARSEREPLIES)(
  void* ReplyBuffer,
  DWORD ReplySize
);

typedef DWORD (WINAPI * ICMPSENDECHO2)(
	HANDLE IcmpHandle,
	HANDLE Event,
	PVOID ApcRoutine,
	PVOID ApcContext,
	UINT DestinationAddress,
	LPVOID RequestData,
	WORD RequestSize,
	PVOID RequestOptions,
	LPVOID ReplyBuffer,
	DWORD ReplySize,
	DWORD Timeout
);

typedef HANDLE (WINAPI * ICMPCREATEFILE)(void);

typedef BOOL (WINAPI * ICMPCLOSEHANDLE)(
	HANDLE IcmpHandle
);

//Глобальные переменные
UINT nTotalRequests;
ICMPPARSEREPLIES PIcmpParseReplies;
ICMPSENDECHO2 PIcmpSendEcho2;
ICMPCREATEFILE PIcmpCreateFile;
ICMPCLOSEHANDLE PIcmpCloseHandle;

/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Распознать диапазон в виде строки
PIPRANGE ParceRangeString(char* cpStr, UINT* nAddresses)
{
	UINT i, j, dwLen, b, e, n;
	PCHAR pM;
	PCHAR cpValues[4];
	PIPRANGE range;
	char buf[64];
	
	dwLen = strlen(cpStr);
	if(dwLen == 0)return NULL;	
	range = malloc(sizeof(IPRANGE));
	
	cpValues[0] = cpStr; j=1; n=1;
	for(i=0; i<dwLen; i++)
		if(cpStr[i] == '.')
		{
			if(j == 4)
			{
				free(range);
				return NULL;
			}
			cpValues[j++]=cpStr+i+1;
			cpStr[i]=0;
		}
	
	if(j<4)
	{
		free(range);
		return NULL;
	}
	
	for(j=0;j<4;j++)
	{
		if((pM = strchr(cpValues[j],'-'))==NULL)
			b = e = atol(cpValues[j]);
		else
		{
			*(pM++)=0;
			b=atol(cpValues[j]);
			e=atol(pM);
		}
		
		if((b>255)||(e>255))
		{
			free(range);
			return NULL;
		}

		if(b>e)
		{
			free(range);
			return NULL;
		}
		range->Beg[j]=b;
		range->End[j]=e;
		n = n*(e-b+1);
	}
	if(nAddresses)*nAddresses = n;
	return range;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Вызывается системой после ICMP-запроса
void WINAPI IcmpCallback (PREQUESTINFO info)
{
	UINT net_addr = htonl(info->addr);
	UINT resp = PIcmpParseReplies(info->replyBuf, info->ReplySize);
	
	if(resp)printf("%s\n", inet_ntoa(*(struct in_addr*)&net_addr));
	free(info->replyBuf);
	free(info);
	nTotalRequests--;
	return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Послать ICMP-запрос по заданному адресу
PREQUESTINFO SendPing(PVOID hICMP, UINT addr, UINT timeout)
{
	PREQUESTINFO info = malloc(sizeof(REQUESTINFO));
	UINT dwRet, iErr, addr2;

	info->addr = addr;
	info->ReplySize = 40;
	
	addr = htonl(addr);
	dwRet = 0;
	while(!dwRet)
	{
		info->replyBuf = malloc(info->ReplySize);
		dwRet = PIcmpSendEcho2(hICMP, NULL, IcmpCallback, info, addr, NULL, 0, NULL, info->replyBuf, info->ReplySize, timeout);
		if(!dwRet)
		{
			iErr = GetLastError();
			if(iErr == ERROR_INSUFFICIENT_BUFFER)
			{
				free(info->replyBuf);
				info->ReplySize = info->ReplySize*2;
				if(info->ReplySize > 65535)
				{
					free(info);
					return NULL;
				}
				continue;
			}
			if(iErr == ERROR_IO_PENDING)return info;
			
			free(info);
			return NULL;
		}
	}
	return NULL;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//ICMP-сканирование заданного диапазона с заданным таймаутом
void PingRange(PIPRANGE range, UINT timeout)
{
	int i0, i1, i2, i3;
	UINT addr=0, i=0;
	PVOID hICMP = PIcmpCreateFile();
	
	for(i0=range->Beg[0];i0<=range->End[0];i0++)
	{
		((UCHAR*)&addr)[3]=i0;
		for(i1=range->Beg[1];i1<=range->End[1];i1++)
		{
			((UCHAR*)&addr)[2]=i1;
			for(i2=range->Beg[2];i2<=range->End[2];i2++)
			{
				((UCHAR*)&addr)[1]=i2;
				for(i3=range->Beg[3];i3<=range->End[3];i3++)
				{
					((UCHAR*)&addr)[0]=i3;
					if(SendPing(hICMP, addr, timeout))i++;
				}
			}
		}
	}
	nTotalRequests = i;
	while(nTotalRequests>0)
	{
		SleepEx(INFINITE, TRUE);
	}
	PIcmpCloseHandle(hICMP);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int main(int argc, char** argv)
{
	UINT nAddresses, timeout = 1000;
	PIPRANGE iprange;
	WSADATA GInitData;
	HANDLE hLib;
	
	WSAStartup(0x0202, &GInitData);
	if(argc < 2)
	{
		printf(" Usage: icmpscan ip_range [timeout]\n");
		printf(" Example: icmpscan 192.168.0.1-254 5000\n");
		return -1;
	}
	if(argc == 3)
	{
		timeout = atol(argv[2]);
		if(!timeout)timeout = 1000;
	}
	hLib = LoadLibrary("Iphlpapi.dll");
	if(!hLib)
	{
		printf("Iphlpapi.dll not found\n");
		return -1;
	}
	PIcmpParseReplies	= (ICMPPARSEREPLIES)GetProcAddress(hLib, "IcmpParseReplies");
	PIcmpSendEcho2		= (ICMPSENDECHO2)GetProcAddress(hLib, "IcmpSendEcho2");
	PIcmpCreateFile		= (ICMPCREATEFILE)GetProcAddress(hLib, "IcmpCreateFile");
	PIcmpCloseHandle	= (ICMPCLOSEHANDLE)GetProcAddress(hLib, "IcmpCloseHandle");
	
	if(!PIcmpParseReplies || !PIcmpSendEcho2 || !PIcmpCloseHandle || !PIcmpCreateFile)
	{
		printf("Needed functions not available\n");
		return -1;
	}
	
	iprange = ParceRangeString(argv[1], &nAddresses);
	printf("Scan %u addresses, timeout %u ms:\n", nAddresses, timeout);
	if(!iprange)
	{
		printf("Invalid parameter\n");
		return -1;
	}
	PingRange(iprange, timeout);
	free(iprange);

	WSACleanup();
	return 0;
}

mbrscan

Утилита сканирует структуры MBR жестких дисков локального компьютера.
Пример вывода утилиты:
Код:
# MBR reader starts
HDD  Disc  Boot  Addr        Size        FS            SN          mb/gb
------------------------------------------------------------------------
HDD0  C:    +    0000003F    03A9A172    (07)NTFS      A47B02F6    29 GB
HDD0  D:    -    03A9A1F0    0EF7E8D1    (07)NTFS      32CC0564    119 GB
Код можно использовать например для расширения функционала руткита - поиск скрытых разделов, исследование жесткого диска

исходный код:

Код:
#include <stdio.h>
#include <windows.h>

char FAT[]="\x01\x04\x06\x0D\x0E";

typedef struct _HARDINFO 
{
	char nHard;		//номер жесткого диска
	void* hDrive;		//хэндл жесткого диска
	UINT dwSectorSize;	//размер сектора
	UINT bitsPerSector;	//количество разрядов для адресации внутри сектора
	UINT dwExtendedAddr;	//адрес расширенного раздела

} HARDINFO, *PHARDINFO;

/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Узнать диск по серийному номеру
char GetDiscBySN(UINT SN)
{
	UINT VolumeSerialNumber;
	UINT ldrives = GetLogicalDrives();
	char Drive[4]="X:\\";
	int i;
	
	for(i=2;i<25;i++)
		if((ldrives & (1<<i)) != 0)
		{
			Drive[0] = 'A'+i;
			switch(GetDriveType(Drive))
			{
				case DRIVE_CDROM:
				break;
		
				default:
				GetVolumeInformation(Drive,
				 NULL,0,
	                         &VolumeSerialNumber,
	                         NULL,0,NULL,0
	                        );
	                        if(VolumeSerialNumber==SN)
					return Drive[0];
			}
		}
	return 0;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Узнать файловую систему диска по коду файловой системы
char* GetFileSystem(unsigned char code)
{
	int i;
	
	if((code==0x07)||(code==0x17))
		return "NTFS  ";
	if(code==0x82)
		return "ext2  ";
	if(code==0x83)
		return "ext3  ";
	if((code==0x0B)||(code==0x0C))
		return "FAT32 ";
	for(i=0;i<sizeof(FAT);i++)
		if(code==FAT[i])
			return "FAT   ";
	return "?       ";
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Вывести текст ошибки
void AnalyzeError(int iErr, char* comment)
{
	char locBuf[1024];

	FormatMessage(
	  FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,
	  0, iErr, 0, locBuf, sizeof(locBuf), 0
	);
	CharToOem(locBuf, locBuf);
	printf("%s (%u) %s\n", comment, iErr, locBuf);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//сдвинуть указатель
int MovePointer(PHARDINFO inf, UINT secpointer)
{
	UINT iErr;
	UINT HiPointer = secpointer>>(32-inf->bitsPerSector);
	UINT LoPointer = secpointer<<(inf->bitsPerSector);

	UINT bRetValue=SetFilePointer(inf->hDrive,LoPointer,&HiPointer,FILE_BEGIN);
	if(bRetValue == -1)
	{
		iErr=GetLastError();
		if(iErr!=NO_ERROR)
			AnalyzeError(iErr, "# error at SetFilePointer: ");
	}
	return bRetValue;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Читать один сектор с жесткого диска
void* RawRead(PHARDINFO inf)
{
	UINT iErr, SectorSize, nRead, i, n;
	void* buf;
	
	SectorSize = inf->dwSectorSize;
	
	if(!SectorSize)SectorSize = 0x200;
	
	buf = malloc(SectorSize);
	while(!ReadFile(inf->hDrive, buf, SectorSize, &nRead, NULL))
	{
		iErr=GetLastError();
		free(buf);
		if((iErr == ERROR_INVALID_PARAMETER)&&(SectorSize<0x8000))
		{
			SectorSize = SectorSize*2;
			buf = malloc(SectorSize);
			continue;
		}
		AnalyzeError(iErr, "# error at ReadFile: ");
		return NULL;
	};
	if(inf->dwSectorSize != SectorSize)
	{
		i = SectorSize; n = 0;
		while(i = i/2)n++;
		inf->bitsPerSector = n;
		inf->dwSectorSize = SectorSize;
	}
	
	return buf;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*Изъять серийный номер для FAT или NTFS
	abs_addr	- адрес начала логического диска в секторах
	Serial	- адрес 8-байтного буфера для серийного номера
	id		- идентификатор файловой системы
*/
BOOL GetDiscSerial(PHARDINFO inf, UINT abs_addr, UCHAR* Serial, UCHAR id)
{
	char* buf;
	int i;
	
	if(MovePointer(inf, abs_addr) == -1)return FALSE;
	if((buf = RawRead(inf)) == NULL)return FALSE;
	
	switch(id)
	{
		case 0x07:			//NTFS
		memcpy(Serial,buf+72,8);	
		break;
		
		case 0x0E:
		case 0x0C:
		case 0x0B:			//FAT32
		memcpy(Serial,buf+67,4);
		break;
	
		default:
		for(i=0; i<sizeof(FAT); i++)
			if(id == FAT[i])
			{
				memcpy(Serial, buf+39, 4);
				free(buf);
				return TRUE;
			}
		return FALSE;
	}
	free(buf);
	return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
PHARDINFO Init(char n)
{
	char HardDiskName[] = "\\\\.\\PHYSICALDRIVE0";
	void* hDrive;
	UINT iErr, dwSectorSize;
	PHARDINFO inf;
	
	HardDiskName[sizeof(HardDiskName)-2] = n+'0';

	hDrive = CreateFile(
		 HardDiskName,
		 GENERIC_READ,
		 FILE_SHARE_READ | FILE_SHARE_WRITE,
		 NULL, OPEN_EXISTING, 0, NULL
	       );

	if(hDrive == INVALID_HANDLE_VALUE)
	{
		iErr = GetLastError();
		if(iErr == ERROR_FILE_NOT_FOUND)return NULL;
		AnalyzeError(iErr, "# Error at CreateFile: ");
		return NULL;
	}
	
	inf = malloc(sizeof(HARDINFO));
	inf->hDrive = hDrive;
	inf->nHard = n;
	inf->dwSectorSize = 0;

	return inf;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void DeInit(PHARDINFO inf)
{
	CloseHandle(inf->hDrive);
	free(inf);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Вывести список разделов из Partition Table в MBR
UINT ListMBR(PHARDINFO inf, UCHAR* pMBR, UINT dwMBRAddr)
{
	UCHAR* pPart;
	UCHAR id, active;
	UINT ext = 0, secBegin, secLength, mbLength=0, gbLength=0;
	UINT SectorSize, abs_addr, SN4;
	UCHAR SN[8];
	char* cpFS;
	int i;
	
	SectorSize = inf->dwSectorSize;
	pPart = pMBR+0x01BE;
	
	for(i=0; i<4; i++)
	{
		id = pPart[4];
		if(!id)
        	{
			pPart += 0x10;
			continue;
        	}
		secBegin = *(UINT*)&pPart[8];
		secLength = *(UINT*)&pPart[12];
		active = pPart[0];
		if(active)active = '+';
		else active = '-';
		pPart += 0x10;
		mbLength = secLength/(2*1024)*SectorSize/512;
		gbLength = mbLength/1024;
		abs_addr = dwMBRAddr + secBegin;
		
		cpFS = GetFileSystem(id);
		
		if((id == 0x0F)||(id == 0x05))
		{
			ext=secBegin;
			continue;
		}
		memset(SN, 0,sizeof(SN));
		GetDiscSerial(inf, abs_addr, SN, id);
		memcpy(&SN4, SN, 4);
	
		printf("HDD%c  %c:    %c    %08X    %08X    (%02X)%s    %08X    %u %s\n",
		  '0'+inf->nHard,
		  SN4?GetDiscBySN(SN4):'?',
		  active,
		  abs_addr, secLength, id, cpFS,
		  SN4,
		  gbLength?gbLength:mbLength,
		  gbLength?"GB":"MB"
		);
		GetDiscBySN(SN4);
	}
	return ext;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Печатать заголовок
void PrintHead()
{
	printf("# MBR reader starts\n");
	printf("HDD  Disc  Boot  Addr        Size        FS            SN          mb/gb\n");
	printf("------------------------------------------------------------------------\n");
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Проверить сигнатуру
BOOL CheckMBR(UCHAR* pMBR)
{
	BOOL bRetValue=*(USHORT*)(pMBR+0x01FE)==0xAA55;
	if(!bRetValue)printf("# invalid MBR\n");
	return bRetValue;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Пройтись по цепочке MBR
BOOL WalkOnMBR(PHARDINFO inf)
{
	UINT ext, dwNextMBRAddr;
	void* pMBR;
	
	if((pMBR = RawRead(inf)) == NULL)return FALSE;
	if(!CheckMBR(pMBR))
	{
		free(pMBR);
		return FALSE;
	}
	if(ext = ListMBR(inf,pMBR,0))
	{
		inf->dwExtendedAddr = ext;
		ext=0;
		while(1)
		{
			free(pMBR);
			dwNextMBRAddr = ext + inf->dwExtendedAddr;
			if(MovePointer(inf, dwNextMBRAddr) == -1)return FALSE;
			if((pMBR = RawRead(inf)) == NULL)return FALSE;
			if(!CheckMBR(pMBR))
			{
				free(pMBR);
				return FALSE;
			}
			if(!(ext = ListMBR(inf, pMBR, dwNextMBRAddr)))break;
		}
	}
	free(pMBR);
	return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//Точка входа
int main(int argc, char** argv)
{
	PHARDINFO inf;
	UCHAR nHDD = 0;
		
	PrintHead();
	while(inf = Init(nHDD))
	{
		WalkOnMBR(inf);
		DeInit(inf);
		nHDD++;
	}
}
http://slil.ru/26470215
De-v: вещь полезная прикреплю файлы к посту)
Вложения
Тип файла: rar files.rar (8.1 Кб, 10 просмотров)

Последний раз редактировалось De-visible; 22.12.2008 в 23:46..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Live CD для сисадминов xcedz Администрирование 21 13.09.2009 22:46
Live CD (frenzY) CMD *nix 12 05.04.2007 01:03
Полезные утилиты для защиты от вирусов artetch Чужие Статьи 1 18.10.2006 17:03
Icq утилиты vvs777 ICQ 2 15.08.2005 18:20



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ