Форум: "Сети";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
ВнизVypress Chat Найти похожие ветки
← →
Андре (2002-01-31 14:26) [0]Есть такая программа. Работает по протоколу UDP. Широковещание - broadcast. UDP порт - 8167.
Хочу написать программу которая будет принимать и посылать сообщения пользователям, которые работают с этой программой.
Использую компонент TNMUDP1. Свойства LocalPort:=8167; RemotePort:=8167; RemoteHost:= <устанавливаю адреса машин в сети>. Запускаю программу, но моя программа ничего не принимает, и не удается передать никаких данных VypressChat.
Никто не пробовал решить такую же задачу ?
← →
VuDZ (2002-01-31 15:30) [1]а ты ео сниффером вначале, а потом уже пиши что-то своё :)
← →
Андре (2002-01-31 15:37) [2]Может еще ссылочкой поможете. Желательно на бесплатный.
← →
Kornet (2002-01-31 17:02) [3]Да, пробывал. :) Года 3 назад обитал в общаге, где была местная локалка, тогда в моде была программа qChat. Это предшественник программы Vypress Chat, я сделал аналог програмы с возвожностью перехвата сообщений и отправки от "чужого" имени. Исходники не сохранились, да и не нужны они, не красиво читать чужие сообщения. :) Одно не нравилось мне, широковещание, и незащищённость сообщений. Дам малеьнькие советы:
1. LocalPort:=8167; RemotePort:=8167; RemoteHost:=192.168.0.255, т.е. широковещательный адрес для сети класса С (192.168.0.0).
2. сам чат на этой машине не должен быть запущен, сокет занят и всё такое...
← →
Андре (2002-02-04 15:46) [4]Насчет того, что читатать чужие сообщения некрасиво - полностью согласен, но что поделаешь, если начальник требует. (Я лучше предупрежу об этом кого нужно :-) ).
Теперь по существу. При приведенных выше настройках я перехватываю все сообщения, но во первых они все одинаковой длинны, а во вторых это не мои сообщения - это какая-то тарабарщина. Данные я принимаю так:
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: TMemoryStream;
TmpStr: String;
begin
MyStream := TMemoryStream.Create;
try
NMUDP1.ReadStream(MyStream);
SetLength(TmpStr,NumberBytes);
MyStream.Read(TmpStr[1],NumberBytes);
Memo1.Lines.Add(FromIP+": "+TmpStr);
finally
MyStream.Free;
end;
end;
В чем дело ? Это при передаче сообщение так разбивается на пакеты или это чат кодирует передаваемые данные ?
← →
Ghostbuster (2002-02-05 09:51) [5]Нет, данные не кодируются. Просто ты их не можешь отобразить в memo, т.к. в буфере содержатся нулевые байты. Попробуй заменить их на пробелы.
← →
Kornet (2002-02-05 10:37) [6]Там формат сообщения типа:
тип, состоит из одного байта
от кого,
кому,
параметры,
параметры,
......
признаком разделителя служит символ #0, поэтому как и сказал Ghostbuster в мемо остаток строки просто не отображается...
← →
tell (2002-02-09 13:51) [7]for Андре: Если не жалко пожелись исходниками твоей проги, у нас тоже локалка на этом чате, тема меня заинтересовала попробую тоже чтонибудь придумать
← →
nick_vstu (2002-02-10 00:48) [8]и мне, пожалуйста, если можно :)
← →
lun-dead@yandex.ru (2002-02-10 23:01) [9]У меня исходники есть и того и другого, если что пиши на мыло!
месяц назад мною была примоцка написана, она всё это и делает..
← →
cypher (2002-02-11 12:04) [10]192.168.0.255 - не совсем верно
лучше 255.255.255.255 ток нетмастеровские ЮДП не понимает такой бродкаст, либо используй другую компоненту, либо ставь пральный бродкаст своей сети..
Вайпресс я расковырял со всеми патрахами...
отправить соо от чужого ника так просто как хочется в нем не получится, так как он определяет ник по твоему ИП адресу... то есть, нада подделывать IP пакет... кроме того, если ника (IP-адреса) чат не знает, то и соо твое он не покажет (нельзя послать сообщение полностью анонимно)...
Я написал прогу для издевательства над вайпрессом, где мона и от любого ника слать соо, и трафик она сниферрит, читая все приваты... правда она у меня под линукс, ну и на гну С написана
← →
lun (2002-02-12 01:23) [11]По крайне мере в версии 1.0.3 такого замечено небыло
что
>так как он определяет ник по твоему ИП адресу...
Может в последующих версиях это реализовано, что очень с трудом вериться...
← →
cypher (2002-02-16 16:06) [12]> Может в последующих версиях это реализовано, что очень с трудом вериться...
проверно практикой, со своего IP не послать соо под чужим ником
← →
Igor Nikolaev (2002-02-17 11:52) [13]Я вижу вы тут очень страдаете. Лучше скачаите снифер для Vypress на яздре Winpcap. Качать на www.sources.ru раздел Паскаль\сеть
← →
cypher (2002-02-17 17:14) [14]нах, я сниф под Вайпресс уже больше года назад написал, до сих пор им пользуюсь =)
← →
Андре (2002-02-18 12:45) [15]Может все таки кто нибудь поможет ?
На одной машине запускаю чат, на второй свою программу:
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: TMemoryStream;
TmpStr: String;
Bee: array [1..1000] of Char;
rtt,Ic,Inick,Inickis,ism: Integer;
Nick,nickis,sot,mess:string;
i : integer;
dc : Char;
s : string;
begin
NMUDP1.ReadBuffer(Bee, Ic);
s:="";
for i:=1 to 1000 do
begin
dc:=Bee[i];
if dc<>#0 then s:=s+dc;
Label4.Caption:=s;
end;
Memo2.Lines.Add(s);
Memo2.Lines.SaveToFile("d:\qwer");
end;
Посылал "1234567890" с машины на ту же машину (просто для
удобства, хотя пробовал и с одной на другую). Ну нет в полученом
файле такой строки, по крайне мере я не вижу.
Может кто нибудь знает в чем дело ?
← →
cypher (2002-02-18 18:02) [16]Проверь, точно ли ты получаешьв Bee данные... а дальше че-нить придумаем
← →
cypher (2002-02-18 18:07) [17]Вот кусок из моего снифера, обрабатывающий скапчерный пакет... на С
void my_callback(u_char *user, const struct pcap_pkthdr *h, const u_char *p){
// *p - pointer to captured buffer
struct udphdr *uh;
struct ip *ih;
struct ether_header *eh;
u_short sport, dport, ulen;
static char buf1[4000];
static char ipFrom[20];
static char ipTo[20];
u_char *n1,*n2,*msg;
// ETHER HEADER
eh=(struct ether_header*)p;
p += sizeof(struct ether_header);
// IP HEADER
ih=(struct ip*)p;
p+=sizeof(struct ip);
// UDP HEADER
uh=(struct udphdr*)p;
p+=sizeof(struct udphdr);
// UDP PARAM
sport = ntohs(uh->uh_sport); // Source port
dport = ntohs(uh->uh_dport); // Destantion port
ulen = ntohs(uh->uh_ulen);
if(p[10]=="6" || p[10]=="J"){ // PRIVATE or MESSAGE ID"s
ip2str(ih->ip_src.s_addr,ipFrom);
ip2str(ih->ip_dst.s_addr,ipTo);
// CHECK FIRST TEN BYTES WITH PREV PACKET
if (!CompareWithPrev(p)) {
n1=p+11; // NICKNAME src
n2=n1+strlen(n1)+1; // NICKNAME dst
msg=n2+strlen(n2)+1; // TEXT
fprintf(stderr,"======================================================$
sprintf(buf1,"[%s] <%s:%s>---|%s:%s|",time_get(),n1,n2,ipFrom,ipTo);
while (strlen(buf1)<80)strcat(buf1,"=");
fprintf(stderr,"%s\n",buf1);
fprintf(stderr,"------------------------------------------------------$
fprintf(stderr,"%s\n\n",msg);
}
}
}
← →
cypher (2002-02-18 18:15) [18]if (!CompareWithPrev(p)) - проверяет первые 10 байт буфера... они заполняются случайным образом отправителем, и если они такие же как у предыдущего пакета, то чат считает это спамом и сообщение игнорирует. вообще формат соо примерно такой:
vyp_packet = record
chk_packet : array[1..10] of char;
fin1 : byte; всегда #0
packet_type : char; // тип пакета (соо, общий чат, привет, смена ника и пр)
nickname_from:array [1.. _ ] of char; // ник (от кого)
fin2 : char; // всегда #0
nickname_to:array[1.. _ ] of char; // ник кому...
fin3 : char; // всегда #0
msg : array [1.. _ ] of char;
end;
так как длина ников и сообщения строго не фиксирована, то и размер массива точно не известен =)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.03 c