Программа-шпион

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
Проф. Преображенский
Графоман
Сообщения: 20276
Зарегистрирован: 08 ноя 2006, 11:10

Программа-шпион

Сообщение Проф. Преображенский »

Клиенту надо проинсталлировать такую приблуду, чтобы она прозрачно сообщала на некий сервер, куда клиент ходит в интернете. Типа шпиона, только инсталлируется приблуда с согласия клиента и работает в его интересах. Желательно, чтобы была броузер-независима.
Может у кого есть опыт?
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

САМОЕ ПРОСТОЕ, что можно сделать, на мой взгляд, это поместить за клиентом "прозрачный прокси" 127.0.0.1:xxxxx, который и будет писать лог-файл.
Такой прокси может быть легко встроен "в цепочку" прокси в существующей инфраструктуре организации клиента, или будет "от имени браузера клиента" форвардить пакеты на маршрутизатор с NAT, или без него, в зависимости от того, какова эта инфраструктура.

1) Например, пусть в организации клиента используется прокси 192.168.1.254:8080, так что схема обработки хттп такова:
Клиент-> Прокси 192.168.1.254:8080 -> Инет

Тогда прои наличии "прокси-логера" 127.0.0.1:xxxxx схема будет такова:
Клиент-> "прокси-логер" 127.0.0.1:xxxxx -> Прокси 192.168.1.254:8080 -> Инет

2) Пусть в организации схема такова :
Клиент-> NAT (or "direct" routing, что бывает крайне редко) -> Инет
Тогда прои наличии "прокси-логера" 127.0.0.1:xxxxx схема будет такова:
Клиент-> "прокси-логер" 127.0.0.1:xxxxx -> NAT (or "direct" routing, что бывает крайне редко) -> Инет

Достоинство в том, что это не требует, сколь-нибудь серьёзных знаний ни в программировании, ни в сетевых технологиях. Примеров написания простейших прокси достаточно много. Кстати в данном случае ещё проще случай, т.к. число сессий будет невелико, так что можно ограничится написанием "чисто" multi-thread сервера.

Недостаток в том, что это может быть многодельно и может потребовать неоднократного тестирования на разных платформах предполагаемых клиентов. Это так, поскольку в промышленной версии Вам бы пришлось учесть все способы "раздачи" интернет, которые могут встретиться у потенциальных клиентов.

НЕМНОГО СЛОЖНЕЕ, но на круг может быть и знааааааачительно проще - программирование RAW-сокетов.
Единственное осложнение, которое здесь появится - необходимо умение это делать. Так работают сетевые мониторы и сканеры.
В принципе таких спецов достаточно много. То, что я видел в инете - действительно не особо сложно.

КОРОЧЕ - выберите для себя что-то.
Тогда я смогу порыться в ссылках.

Отредактировано: с горяча там про сокс пропостил. это не недо для хттп-прокси :lol: (голова другим сейчас занята. сорри)
Аватара пользователя
Vims
Northern Yeti
Сообщения: 21455
Зарегистрирован: 17 фев 2003, 15:53
Откуда: Magadan - Vancouver
Контактная информация:

Re: Программа-шпион

Сообщение Vims »

runner писал(а): Может у кого есть опыт?
этого добра валом и фри и частично фри и с краком и без ... :D
вам сюда http://www.keyloggers.com/index.html ну а далее по образу и подобию у меня есть самая простая я как то игрался с этим с года два назад где то лежит если надо поищу....
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Логер нажатия клавиш и того, что юзер смотрит в браузере (URL) - это разное.
Что-то с твоём постинге имеет место быть. Конечно, надо начинать с поиска готового софта (может и за деньги), а не с программирования. Кстати, может и промышленный перонал-фаервол, которых в последнее время, как собак, подойдёт. Если ты постил об этом, а не о перехвате клавиатурных нажатий, то я с тобой согласен.

ПС. Если ты не об этом, то всё равно возражать не стану :lol: Боюсь больно пока ешо.
Аватара пользователя
Vims
Northern Yeti
Сообщения: 21455
Зарегистрирован: 17 фев 2003, 15:53
Откуда: Magadan - Vancouver
Контактная информация:

Сообщение Vims »

vg писал(а):
Логер нажатия клавиш и того, что юзер смотрит в браузере (URL) - это разное.
они как правило или почти как правило комбинированы,
те есть делают все, моя делала все :D я перепахал их кучу если это фри то ее заметно когда она стоит и прога предупреждает что все мониториться если платная то она невидимая и сидит скрыто только в процессах видно и можно запаролить лог и инкрипт его.
Xa-xa
Пользователь
Сообщения: 81
Зарегистрирован: 06 июл 2003, 19:35
Контактная информация:

Re: Программа-шпион

Сообщение Xa-xa »

runner писал(а):Клиенту надо проинсталлировать такую приблуду, чтобы она прозрачно сообщала на некий сервер, куда клиент ходит в интернете. Типа шпиона, только инсталлируется приблуда с согласия клиента и работает в его интересах. Желательно, чтобы была броузер-независима.
Может у кого есть опыт?
Какая ОС? Если unix, то нетфильтр Вам поможет ;) Вот хорошая статья из последнего фрака:

Hacking the Linux Kernel Network Stack

Там есть kernel based FTP password sniffer, наверно его несложно в HTTP traffic sniffer переделать ;)

Конкретную же софтину можно искать здесь (packet sniffer)

http://www.rootkit.com
http://www.insecure.org/tools.html

Но ИМХО человек, который себе хочет добровольно руткит поставить -- это извращенец-садо-мазохист ;)
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Да, не густо. :(
Про RAW-сокеты, ещё…
В принципе, основная сложность при построении логгера на RAW-сокетах – необходимость знания RFC 791 (IP), 768, 793 ( UDP, TCP), может ещё и RFC 792, если Вы вдобавок хотите анализировать и ICMP.

Ниже простой код (для W2k и выше), который Вы можете развивать дальше в своих нуждах. Это работающая демонстрация. Не забудьте указать линкеру необходимость использовать ws2_32.lib для сборки. Отлаживать код Вы можете и без доступа к СЕТИ. Например, выполнение на вашем компьютере:

C:\>ping localhost -t -l 100
Pinging XXX [127.0.0.1] with 100 bytes of data:
Reply from 127.0.0.1: bytes=100 time<1ms TTL=128
….

программа выведет на монитор:

From 127.0.0.1 To 127.0.0.1 Protocol: ICMP Len: 128
….


Тестируя программу, не забудьте, что персональный firewall может быть установлен на вашем компьютере. Если это так, то, возможно, что Вы увидите только пакеты, разрешённые Вашим firewall. Если фильтрация отсутствует, то Вы увидите все пакеты, достигающие Вашего интерфейса (в том числе и пакеты, предназначенные другим хостам). Впрочем, это зависит не только от того, имеется в настоящий момент фильтрация, или нет, но и от того, по какой технологии сделан Ваш firewall (на каком уровне OSI он работает). Код ниже переводит сокет в состояние «promiscuous». Вовсе не обязательно слушать чужие пакеты – отфильтруйте их.

Вот, что программа выдаёт, если персональный firewall задействован (в данном случае только пакеты установленных соединений):

From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 727
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 332
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 729
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 333
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 724
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 333
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 730
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 332
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 740
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 333
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 714
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 332
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 715
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 333
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 332
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 40
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 40
From 67.15.36.12 To 192.168.1.161 Protocol: TCP Len: 40
From 192.168.1.161 To 67.15.36.12 Protocol: TCP Len: 40
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 40
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 40
From 66.51.105.119 To 192.168.1.161 Protocol: TCP Len: 40
From 192.168.1.161 To 66.51.105.119 Protocol: TCP Len: 40
From 192.168.1.161 To 67.15.36.12 Protocol: TCP Len: 40


forum.algorithmicus.com (66.51.105.119)

Вот, что программа выдаёт, если персональный firewall отключён:

From 192.168.1.4 To 194.67.45.100 Protocol: TCP Len: 48
From 192.168.1.4 To 194.67.45.100 Protocol: TCP Len: 48
From 192.168.1.4 To 213.59.0.100 Protocol: TCP Len: 48
From 192.168.1.161 To 24.153.22.67 Protocol: UDP Len: 57
From 24.153.22.67 To 192.168.1.161 Protocol: UDP Len: 180

From 194.67.23.150 To 192.168.1.161 Protocol: UDP Len: 40
From 192.168.1.161 To 194.67.23.150 Protocol: UDP Len: 40

Код: Выделить всё

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

typedef	unsigned char	_BYTE;
typedef  unsigned int	_WORD;
#define MAKEINT(low, high)  ((_WORD)(((_BYTE)(low)) | (((_WORD)((_WORD)(high))) << 8)))


#define MIN_IP_HDRSIZE	0x14				// минимальная длина заголовка IP ( без опций - 20 байт )
#define MAX_PACKET_SIZE	0x10000				// максимальная длина IP-пакета (64 Kb)
#define SIO_RCVALL		0x98000001
#define	MAX_LOGSTR_SIZE	0x100				// длина строки лога

_BYTE	buf				[MAX_PACKET_SIZE];	// буфер для приёма заголовков IP пакетов
char	logsimple		[MAX_LOGSTR_SIZE];	// строка лога
char	proto			[] = "TCP          ";



int _tmain( void )
{
	WSAData wsaData;
	if (WSAStartup(0x0202,(WSADATA *) &wsaData )) 
	{
			printf("Error WSAStartup %d\n",WSAGetLastError());
			return -1;
	}

	char				chName[128];
	SOCKADDR_IN			sa;        
	hostent*			psh;
	ZeroMemory( &sa, sizeof(sa) );

	if (!gethostname(chName,sizeof(chName)))
	{
			psh=gethostbyname((char*)&chName);
			if (!psh || !psh->h_addr_list[0])
			{
					printf("Error gethostbyname %d\n",WSAGetLastError());
					return -1;
			}
	}
	else
	{
			printf("Error gethostname %d\n",WSAGetLastError());
			return -1;
	}
	sa.sin_family		= AF_INET;
	sa.sin_addr.s_addr	= ((struct in_addr *)psh->h_addr_list[0])->s_addr;

	// Создаём RAW-сокет и переводим его в режим прослушивания (promiscuous mode)
	SOCKET		snfSock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
	
	if( bind(snfSock, (SOCKADDR *)&sa, sizeof(SOCKADDR)) )
	{
			printf("Error bind %d\n",WSAGetLastError());
			return -1;
	}
	unsigned long			mode = 1;			// promiscuous mode.
	ioctlsocket(snfSock, SIO_RCVALL, &mode);

	// принимаем и анализируем данные
	while( !_kbhit() )
	{
		int cnt = recv( snfSock, (char*) buf, MAX_PACKET_SIZE, 0 );
		if ( cnt < MIN_IP_HDRSIZE ) continue;
		
		// здесь заголовок в твоих руках, анализируй, например,
		if ( buf[9] == IPPROTO_UDP)
			strcpy(proto, "UDP");
		else if ( buf[9] == IPPROTO_ICMP)
			strcpy(proto, "ICMP");

		//  в буфере весь пакет
		//  здесь же можешь анализировать TCP,UDP и прикладные протоколы

		sprintf( logsimple, "From %d.%d.%d.%d To %d.%d.%d.%d Protocol: %s Len: %d",
					buf[12],buf[13],buf[14],buf[15],
					buf[16],buf[17],buf[18],buf[19],
					proto,
					MAKEINT( buf[3], buf[2] ));
		//  например, эту строку logsimple можешь писать в лог-файл
		printf("%s\n", logsimple);
    }

	closesocket( snfSock );
	WSACleanup();
	return 0;
}
ПС. Данный пример совсем простой. Поэтому в нём не использованы структуры заголовков протоколов TCP/IP. Конечно, лучше их использовать вместо доступа по индексу в немного более сложных случаях, например, когда в коде Вам необходимо анализировать более 2-3 полей протоколов.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Re: Программа-шпион

Сообщение ajkj3em »

Xa-xa писал(а): Какая ОС? Если unix, то нетфильтр Вам поможет ;) Вот хорошая статья из последнего фрака:
Hacking the Linux Kernel Network Stack
при всем моем глубоком уважении к фраку, эта статейка по качеству явно не дотягивает до их типичного уровня, поскольку написана человеком, не имеющим серьезного опыта kernel development'a. check_tcp_packet() alone содержит 3 серьезных бага, oops'нуть стек в check_ftp() - только выбирай варианты и т.д. и т.п.
Xa-xa
Пользователь
Сообщения: 81
Зарегистрирован: 06 июл 2003, 19:35
Контактная информация:

Re: Программа-шпион

Сообщение Xa-xa »

drain bamage писал(а):
Xa-xa писал(а): Какая ОС? Если unix, то нетфильтр Вам поможет ;) Вот хорошая статья из последнего фрака:
Hacking the Linux Kernel Network Stack
при всем моем глубоком уважении к фраку, эта статейка по качеству явно не дотягивает до их типичного уровня, поскольку написана человеком, не имеющим серьезного опыта kernel development'a. check_tcp_packet() alone содержит 3 серьезных бага, oops'нуть стек в check_ftp() - только выбирай варианты и т.д. и т.п.
Согласен, фрак, как и другие "хакерские" издания в последенее время сильно обмельчали. Взять тот же DDJ -- я зачитывался номерами, выпушенными в конце 90х, а то что выходит сейчас -- полный отстой.
Аватара пользователя
Проф. Преображенский
Графоман
Сообщения: 20276
Зарегистрирован: 08 ноя 2006, 11:10

Сообщение Проф. Преображенский »

vg писал(а):ПС. Данный пример совсем простой. Поэтому в нём не использованы структуры заголовков протоколов TCP/IP. Конечно, лучше их использовать вместо доступа по индексу в немного более сложных случаях, например, когда в коде Вам необходимо анализировать более 2-3 полей протоколов.
Вот это, похоже, в нужном направлении. Можно источник, плиз?
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Вопрос обсуждался на RSDN.RU. Поищите там. Я тоже поищу.
Тем более, что есть вопрос, на который раньше было наплевать,
поскольку это делалось с правами админа. Я спрошу парней ещё на другом форуме, кроме RSDN.RU.

Думаю, надо к этому вернуться (мне просто стало интересно).
Одна из проблем в том, что Вы получите код ошибки winsock 10013 (WSAEACCES (10013) Permission denied), если попробуете запустить программу с правами пользователя, а не правами администратора компьютера. Это ограничение можно было обойти на NT 4.0 (при помощи соответственной рихтовки регистри), но я не знаю, как это сделать для W2k и выше.

То код, что я пропостил - я писал сам, для Вас. :lol: Убирая всё лишнее из старых проектов и недопроектов :D
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Вот, на rsdn.ru и статья и пргограмма, которая делает то же самое (только гораздо более в лаконичной форме :lol: )

http://www.rsdn.ru/article/net/sniffer.xml?print

Найду чего-нить ещё (как обойти ограничение касательно админовских прав) - писну :lol:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

runner,

Если нет прав админа, то не сможешь использовать RAW-socket для обсуждаемого случая и для W2k. Получишь ту ошибку, о которой я постил. Однако ребята подсказали другую идею. Сказали, мол, тормоз, оберни код в сервис и наслаждайся :lol:
Аватара пользователя
Проф. Преображенский
Графоман
Сообщения: 20276
Зарегистрирован: 08 ноя 2006, 11:10

Сообщение Проф. Преображенский »

А сервис с какими правами работать будет? Это ему не помешает?
Хотя права админа в моем случае не проблема.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

А сервис с какими правами работать будет? Это ему не помешает?
Хотя права админа в моем случае не проблема.
А это уж, как ты назначишь :lol: Думаю, и под сустем акаунтом можно :lol:

Блин. Редактирую. Не только английского не знаю, но и русского. :evil:
Ответить