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

Вниз

Как перехватить сообщение 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
3-1148397351
rar
2006-05-23 19:15
2006.07.30
Трехзвенка


2-1152028271
aka
2006-07-04 19:51
2006.07.30
Всплывающие подсказки


3-1148770554
Кашперук Иван
2006-05-28 02:55
2006.07.30
BDE Administrator и PARADOX


2-1152372331
atruhin
2006-07-08 19:25
2006.07.30
Нужна функция для округления чисел до опреленного значимого знака


2-1152130963
<X>
2006-07-06 00:22
2006.07.30
Синтаксис