Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.02;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.007 c
4-2723
cok11
2002-02-27 13:28
2002.05.02
Не фурычит!


1-2606
Афоня
2002-04-18 13:31
2002.05.02
Как создать калькулятор


1-2623
Ivan Voronov
2002-04-20 11:05
2002.05.02
Шаблоны/регулярные выражения в Delphi


7-2695
Королев
2002-02-07 09:04
2002.05.02
мне все же нужна цоколевка разъема СС208


6-2632
dedoff
2002-02-16 18:07
2002.05.02
Как отправить почту через DNS-сервер(-)