![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить сообщение ICQ (QIP) и ответить на него? [D6, WinXP]
Volf_555 © (2006-03-17 12:59:00)Мне нужно написать прогу, которая будет перехватывать приходящие сообщения через ICQ (QIP) и отвечать на них.
То есть, моя прога должна уметь делать:
-принять пришедшее сообщение. Условие - это сообщение должно отобразиться/не отобразиться как в ICQ (QIP), так и в моей программе. Настраиваемый параметр
-определить UIN отправителя сообщения
-определить текст сообщения
-проанализировать текст пришедшего сообщения
-отправить результат на UIN отправителя
Как такое осуществить?
seeker (2006-03-21 12:43:00) [1]Как правило все клиенты отправляют пакет целиком, так что можно считать что при перехвате 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
Volf_555 (2006-03-20 21:11:00) [2]
> seeker © (20.03.06 09:49) [10]
> 2Volf_555
> Судя по твоей задаче, без перехвата API не обойтись...
>
> > Только вот как определить приход нового сообщения+UIN
> отправителя+текст
> > сообщения - остаётся загадкой
>
> А тут все просто, нужно только найти заголовок любого flap-
> пакета, а остальное дело техники.
> Единственная проблема, отправка сообщений мимо клиента приведет
> к сбою, т.к. у каждого пакета свой идентификатор на 1 больше
> чем у предыдущего.Тобишь отправить пакет и получить на него
> ответ можно, но отправка пакета самим клиентом(а он не знает
> что отправлялись пакеты без него) привидет к тому, что сервер
> разорвет соединение. Но и это можно обойти путем правки
> во всех последующих пакетах их SEQ.
> Так что перехват API тебе в руки.
Просто :)
Для тебя может быть и да...
Если тут всё просто, то напиши как найти заголовок flap-пакета!
seeker (2006-03-20 09:49:00) [3]2Volf_555
Судя по твоей задаче, без перехвата API не обойтись...
> Только вот как определить приход нового сообщения+UIN отправителя+текст
> сообщения - остаётся загадкой
А тут все просто, нужно только найти заголовок любого flap-пакета, а остальное дело техники.
Единственная проблема, отправка сообщений мимо клиента приведет к сбою, т.к. у каждого пакета свой идентификатор на 1 больше чем у предыдущего.Тобишь отправить пакет и получить на него ответ можно, но отправка пакета самим клиентом(а он не знает что отправлялись пакеты без него) привидет к тому, что сервер разорвет соединение. Но и это можно обойти путем правки во всех последующих пакетах их SEQ.
Так что перехват API тебе в руки.
Volf_555 (2006-03-19 15:00:00) [4]Спасибо за интерес к моему вопросу!
> 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 отправителя+текст сообщения - остаётся загадкой
Piter (2006-03-18 20:55:00) [5]GanibalLector © (18.03.06 19:35) [6]
Я предложил использовать RAW для написания небольшого сниффера ВМЕСТО ВНЕДРЕНИЯ
дык, это не равноценная замена. Внедрение позволит ПОЛНОСТЬЮ контролировать трафик, в том числе пропускать / не пропускать.
А вот снифер позволит только читать трафик.
Piter (2006-03-18 20:55:00) [6]о чем я тебе тут и говорю.
GanibalLector (2006-03-18 19:35:00) [7]2 Piter
Я предложил использовать RAW для написания небольшого сниффера ВМЕСТО ВНЕДРЕНИЯ! и говорил я не автору,а ТЕБЕ! Т.к. твои идеи из серии "Судя по всему - забудь."
З.Ы. Дальнейший спор считаю бесполезным.
>странный ты!
Знаешь,ты тоже не подарок!
Piter (2006-03-18 17:24:00) [8]GanibalLector © (18.03.06 16:42) [4]
>отправить результат на UIN отправителя
А это тут при чем? В задачи снифера это не входит
странный ты! Это входит в задачу автора!
Ты ему предложил снифер и сказал, что уже в задачу снифера это не входит, оригинально :)))
GanibalLector (2006-03-18 16:42:00) [9]2 Piter
Естественно,твоя правда тут есть ;) Сообщения будут доходить всегда.
>отправить результат на UIN отправителя
А это тут при чем? В задачи снифера это не входит. Да и в общем,я думаю, что не такая сложная задача создать клиента для Аси.
>ы хочешь сказать, что снифер пишется легче, чем перехват WinApi?
Да. Посмотри исходники на http://rouse.front.ru/
> и поддержка только начиная с win2000 вроде
Тоже ты прав. А иначе "Судя по всему - забудь."
Piter (2006-03-18 15:47:00) [10]GanibalLector © (18.03.06 11:29) [2]
Обычный сниффер делается на опред.адрес
а что, снифер умеет:
Volf_555 © (17.03.06 12:59)
это сообщение должно отобразиться/не отобразиться
-отправить результат на UIN отправителя
Да?
К тому же, ты хочешь сказать, что снифер пишется легче, чем перехват WinApi? Готовая библиотека аля WinPCap не совсем подойдет по вышеозначенным причинам. Писать свой драйвер? :)
ЧТо касается возможностей WinSock2 по работе RAW - то это во-первых, только для группы администраторов, по-моему, да и поддержка только начиная с win2000 вроде.
GanibalLector (2006-03-18 11:29:00) [11]2 Piter
>Если нет - то внедрение в процесс QiP'а, перехват WinApi функций по работе с сокетами
Это ты загнул. Обычный сниффер делается на опред.адрес,порт(на Raw).Исходников полно ;)
Piter (2006-03-18 01:10:00) [12]Если QiP поддерживает плагины как Miranda - копай в ту сторону.
Если нет - то внедрение в процесс QiP'а, перехват WinApi функций по работе с сокетами, перехват трафика QiP'а, его анализ.
Нетривиальная задача. Судя по всему - забудь.