Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

Как перехватить сообщение ICQ (QIP) и ответить на него?   Найти похожие ветки 

 
Volf_555 ©   (2006-03-17 12:59) [0]

Мне нужно написать прогу, которая будет перехватывать приходящие сообщения через ICQ (QIP) и отвечать на них.
То есть, моя прога должна уметь делать:
-принять пришедшее сообщение. Условие - это сообщение должно    отобразиться/не отобразиться   как в ICQ (QIP), так и в моей программе. Настраиваемый параметр
-определить UIN отправителя сообщения
-определить текст сообщения
-проанализировать текст пришедшего сообщения
-отправить результат на UIN отправителя
Как такое осуществить?


 
Piter ©   (2006-03-18 01:10) [1]

Если QiP поддерживает плагины как Miranda - копай в ту сторону.

Если нет - то внедрение в процесс QiP"а, перехват WinApi функций по работе с сокетами, перехват трафика QiP"а, его анализ.

Нетривиальная задача. Судя по всему - забудь.


 
GanibalLector ©   (2006-03-18 11:29) [2]

2 Piter
>Если нет - то внедрение в процесс QiP"а, перехват WinApi функций по работе с сокетами

Это ты загнул. Обычный сниффер делается на опред.адрес,порт(на Raw).Исходников полно ;)


 
Piter ©   (2006-03-18 15:47) [3]

GanibalLector ©   (18.03.06 11:29) [2]
Обычный сниффер делается на опред.адрес


а что, снифер умеет:

Volf_555 ©   (17.03.06 12:59)
это сообщение должно    отобразиться/не отобразиться  


-отправить результат на UIN отправителя

Да?

К тому же, ты хочешь сказать, что снифер пишется легче, чем перехват WinApi? Готовая библиотека аля WinPCap не совсем подойдет по вышеозначенным причинам. Писать свой драйвер? :)

ЧТо касается возможностей WinSock2 по работе RAW - то это во-первых, только для группы администраторов, по-моему, да и поддержка только начиная с win2000 вроде.


 
GanibalLector ©   (2006-03-18 16:42) [4]

2 Piter
Естественно,твоя правда тут есть ;) Сообщения будут доходить всегда.

>отправить результат на UIN отправителя
А это тут при чем? В задачи снифера это не входит. Да и в общем,я думаю, что не такая сложная задача создать клиента для Аси.

>ы хочешь сказать, что снифер пишется легче, чем перехват WinApi?
Да. Посмотри исходники на http://rouse.front.ru/

> и поддержка только начиная с win2000 вроде
Тоже ты прав. А иначе "Судя по всему - забудь."


 
Piter ©   (2006-03-18 17:24) [5]

GanibalLector ©   (18.03.06 16:42) [4]
>отправить результат на UIN отправителя
А это тут при чем? В задачи снифера это не входит


странный ты! Это входит в задачу автора!

Ты ему предложил снифер и сказал, что уже в задачу снифера это не входит, оригинально :)))


 
GanibalLector ©   (2006-03-18 19:35) [6]

2 Piter
Я предложил использовать RAW для написания небольшого сниффера ВМЕСТО ВНЕДРЕНИЯ! и говорил я не автору,а ТЕБЕ! Т.к. твои идеи из серии  "Судя по всему - забудь."

З.Ы. Дальнейший спор считаю бесполезным.
>странный ты!
Знаешь,ты тоже не подарок!


 
Piter ©   (2006-03-18 20:55) [7]

GanibalLector ©   (18.03.06 19:35) [6]
Я предложил использовать RAW для написания небольшого сниффера ВМЕСТО ВНЕДРЕНИЯ


дык, это не равноценная замена. Внедрение позволит ПОЛНОСТЬЮ контролировать трафик, в том числе пропускать / не пропускать.

А вот снифер позволит только читать трафик.


 
Piter ©   (2006-03-18 20:55) [8]

о чем я тебе тут и говорю.


 
Volf_555 ©   (2006-03-19 15:00) [9]

Спасибо за интерес к моему вопросу!


> GanibalLector ©   (18.03.06 16:42) [4]
> 2 Piter
> Естественно,твоя правда тут есть ;) Сообщения будут доходить
> всегда.
>
> >отправить результат на UIN отправителя
> А это тут при чем? В задачи снифера это не входит. Да и
> в общем,я думаю, что не такая сложная задача создать клиента
> для Аси.
>
> >ы хочешь сказать, что снифер пишется легче, чем перехват
> WinApi?
> Да. Посмотри исходники на http://rouse.front.ru/
>
> > и поддержка только начиная с win2000 вроде
> Тоже ты прав. А иначе "Судя по всему - забудь."

Спасибо за ссылку! Буду разбираться с исходниками


> Piter ©   (18.03.06 17:24) [5]
> GanibalLector ©   (18.03.06 16:42) [4]
> >отправить результат на UIN отправителя
> А это тут при чем? В задачи снифера это не входит
>
> странный ты! Это входит в задачу автора!
>
> Ты ему предложил снифер и сказал, что уже в задачу снифера
> это не входит, оригинально :)))

Да. Это в мою задачу входит. Но я думаю, что не составит труда отправить сообщение на UIN отправителя. На некоторых сайтах есть возможность отправки сообщения на UIN, например на http://www.mobile-portal.kiev.ua/sms.phtml?t=sendicq.

Я тут подумал - может быть проще сделать так:
1) запустить QIP и мою программу, которая будет следить за новыми сообщениями
2) при приходе нового сообщения моя программа перехватывает всплывающее окно сообщения и анализирует - то есть определяет UIN отправителя и текст сообщения
3) проанализировать, изменить текст ответа и нажать на кнопку Отправить

Только вот как определить приход нового сообщения+UIN отправителя+текст сообщения - остаётся загадкой


 
seeker ©   (2006-03-20 09:49) [10]

2Volf_555
Судя по твоей задаче, без перехвата API не обойтись...

> Только вот как определить приход нового сообщения+UIN отправителя+текст
> сообщения - остаётся загадкой

А тут все просто, нужно только найти заголовок любого flap-пакета, а остальное дело техники.
Единственная проблема, отправка сообщений мимо клиента приведет к сбою, т.к. у каждого пакета свой идентификатор на 1 больше чем у предыдущего.Тобишь отправить пакет и получить на него ответ можно, но отправка пакета самим клиентом(а он не знает что отправлялись пакеты без него) привидет к тому, что сервер разорвет соединение. Но и это можно обойти путем правки во всех последующих пакетах их SEQ.
Так что перехват API тебе в руки.


 
Volf_555 ©   (2006-03-20 21:11) [11]


> seeker ©   (20.03.06 09:49) [10]
> 2Volf_555
> Судя по твоей задаче, без перехвата API не обойтись...
>
> > Только вот как определить приход нового сообщения+UIN
> отправителя+текст
> > сообщения - остаётся загадкой
>
> А тут все просто, нужно только найти заголовок любого flap-
> пакета, а остальное дело техники.
> Единственная проблема, отправка сообщений мимо клиента приведет
> к сбою, т.к. у каждого пакета свой идентификатор на 1 больше
> чем у предыдущего.Тобишь отправить пакет и получить на него
> ответ можно, но отправка пакета самим клиентом(а он не знает
> что отправлялись пакеты без него) привидет к тому, что сервер
> разорвет соединение. Но и это можно обойти путем правки
> во всех последующих пакетах их SEQ.
> Так что перехват API тебе в руки.

Просто :)
Для тебя может быть и да...
Если тут всё просто, то напиши как найти заголовок flap-пакета!


 
seeker ©   (2006-03-21 12:43) [12]

Как правило все клиенты отправляют пакет целиком, так что можно считать что при перехвате send buf будет указывать на начало пакета а len его длинну.

> Если тут всё просто, то напиши как найти заголовок flap-
> пакета!

первый байт - ord("*")
второй байт - = #0 или  > #4
5 и 6 байты это длинна flap-пакета(в сетевом парядке).
считаем что нумерация идет с нулевого байта

if (buf[0] = ord("*")) and ((buf[0] = 0) оr (buf[0] > 4)) then
begin
// заголовок верен
if swap(word((@buf[4])^)) >= len then
begin
// пакет отправляется полностью
end
else
begin
// пакет отправляется не полностью, нужно добавить его в очередь
end;
end;

вот как это сделано в крысе

type
TflapQueue=class(Tobject)
   buff:string;
   constructor create;
   procedure add(s:string);
   function  error:boolean;     // errore di protocollo, и necessario invocare popError per continuare
   function  errorTill:integer; // fino a questo byte i dati sono considerati errati
   function  available:boolean; // disponibilitа di un pacchetto
   function  pop:string;        // estrale il pacchetto
   function  popError:string;   // estrae i dati errati dalla coda
   function  bodySize:integer;
   procedure reset;
   end; // TflapQueue
...

function word_BEat(p:pointer):word;
begin result:=swap(word(p^)) end;

constructor TflapQueue.create;
begin reset end;

procedure TflapQueue.reset;
begin buff:="" end;

procedure TflapQueue.add(s:string);
begin buff:=buff+s end;

function TflapQueue.error:boolean;
begin
error:=((buff>"") and (buff[1]<>"*"))
 or ((length(buff)>1) and ((buff[2]=#0) or (buff[2]>#5)))
end; // error

function TflapQueue.errorTill:integer;
begin
result:=-1;
if buff="" then exit;
result:=1;
while (result<=length(buff)) and
     ((buff[result]<>"*") or (result<length(buff)) and ((buff[result+1]=#0) or (buff[result+1]>#4))) do
 inc(result);
end; // errorTill

function TflapQueue.popError:string;
var
 i:integer;
begin
i:=errorTill;
result:=copy(buff,1,i);
delete(buff,1,i);
end; // popError

function TflapQueue.bodySize:integer;
begin result:=word_BEat(@buff[5]) end;

function TflapQueue.available:boolean;
begin
result:=not error
  and (length(buff) >= FLAP_HEAD_SIZE)   // bodysize exists only if this is true
  and (length(buff) >= FLAP_HEAD_SIZE+bodySize)
end; // available

function TflapQueue.pop:string;
begin
if not available then
 begin
 result:="";
 exit;
 end;
result:=copy(buff,1,FLAP_HEAD_SIZE+bodysize);
delete(buff,1,FLAP_HEAD_SIZE+bodySize);
end; // pop



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1152532623
SergeyG
2006-07-10 15:57
2006.07.30
Как сделать, чтобы форма и расположенные на ней компоненты


15-1151738519
Новичоккк
2006-07-01 11:21
2006.07.30
Уже вторые сутки не могу прочитать байты из буфера


2-1152351613
Dyakon_Frost
2006-07-08 13:40
2006.07.30
Обработка html - страницы


2-1152164844
Wood
2006-07-06 09:47
2006.07.30
Как защитить лист или книгу Excel из Delphi?


15-1151314731
ANB
2006-06-26 13:38
2006.07.30
Бутово





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский