Черви… Как много в этом слове букв… 🙂 Это, пожалуй, самый распространенный и активно развивающийся вид “киберинфекции”. Меня, если честно, до сих пор удивляет как тысячи людей без страха и сомнения открывают пришедшее от неизвестного адресата письмо и с радостью запускают приаттаченный файл. Но по последним данным народ начал умнеть. Теперь уже мало кто покупается на любовные послания и фотографии известных спортсменок. И в поисках новых средств убеждения пользователей World Wild Web, мистер Benny из 29A предложил довольно заманчивый способ (его статью можно найти в 7-ом номере на
http://29a.host.sk/main.html). Он заключается в получении информации о пользователях из базы ICQ - жертве отправляется письмо с червём, она его открывает (пусть первая жертва будет доверчивой), червь получает информацию (имя, фамилия, мыло, дата рождения… Да всё что может понадобиться для составления “убедительного” письма) из контактного листа ICQ и рассылает себя по полученным адресам. Причём эти письма уже содержат довольно “убедительные” сведения – письма обращены к получателям, да ещё и содержат “личные” данные.
И всё бы хорошо – бери да пиши, но нет! Для начала нужен был способ залезть в вазу к аське – для этого была обнаружена ICQAutomation.dll. В ней содержится COM объект для работы с аской. В своей статье Benny попытался создать скриптового червя, но у него не получилось: ICQAutomation.dll не работала. Вызов любого метода приводил к внутренней ошибке.
Меня заинтересовала эта библиотека, и я кое-что выяснил. Эта
Dllка написана на Microsoft Visual C++ 6.0. Казалось бы – “что это даёт?”, а это важно. Создатели видать очень сильно любят продукты от MS и вовсю используют все доступные этой среде классы и компоненты. Ну да ладно, пока рано об этом говорить. Сначала было бы неплохо узнать, из-за чего происходит ошибка в недрах аси. Для этого на любом языке (желательно с удобным дебаггером) можно написать код,
вызывающий любой из методов интересующего нас COM объекта. На Delphi это будет выглядеть так:
program icqexplorer;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
ICQAUTOMATIONLib_TLB, // это файл импорта ICQAutomation.dll
ComObj,ActiveX;
var o:MIICQAutomation;
iinterfac:iinterface;
fp:MIICQFireEvents;
pint:pinteger;
s:string;
begin
CoInitialize(nil);
iinterfac:=CreateComObject(CLASS_ICQAutomation);
o:=iinterfac as MIICQAutomation;
o.OpenICQ; // вот тут происходит внутренняя ошибка
end.
Будем трэйсить! Ставим бряк на o.OpenICQ и Ctrl+Alt+C. 🙂 (У меня ICQ 2k3a, поэтому в других версиях адреса могут быть отличны.) После затяжного прыжка оказываемся возле подобного кода:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:23F8141A(U)
|
:23F86621 B8CACEF823 mov eax, 23F8CECA
:23F86626 E8C5450000 call 23F8ABF0
:23F8662B 81EC80000000 sub esp, 00000080
:23F86631 53 push ebx
:23F86632 56 push esi
:23F86633 8B7508 mov esi, dword ptr [ebp+08]
:23F86636 57 push edi
:23F86637 8965F0 mov dword ptr [ebp-10], esp
:23F8663A 8D4EF8 lea ecx, dword ptr [esi-08]
:23F8663D E89CADFFFF call 23F813DE
:23F86642 84C0 test al, al
:23F86644 750A jne 23F86650
:23F86646 B805400080 mov eax, 80004005
:23F8664B E9DC010000 jmp 23F8682C
Меня сразу заинтересовала проверка на 0. Что ж, можно узнать куда она ведёт и что будет если мы туда пойдём. 🙂 Функция возвращает 0 и прыжок не срабатывает. Ок, сбрасываем в дебаггере ZF и… аська включается! Так… Значит всё самое интересное в выше лежащей функции. Не буду здесь приводить довольно длинные листинги этого COM объекта, сразу скажу в чём всё дело. Создатели ICQ очень любят MS и не очень любят проверять, что инициализировано, а что нет. Поэтому этот компонент сразу пытается обращаться к Afx библиотеке и особенно к AfxGetModuleState. Боюсь, Benny придётся если и думать о черве, то только о бинарном. Что в общем-то даже хорошо. 🙂 Перед использованием этого COM’a надо инициализировать все необходимые ему данные или патчить имеющиеся ICQAutomation.dll :). Правда патчи не всегда помогают – есть ряд функций работы со стоками основанных на инициализированном Afx. Ну и напоследок можно рассказать о методе ICQIsRunning. 🙂 Это довольно забавная вещь – этому методу тоже требуется Afx, но код его сводиться к проверке мютекса “Mirabilis ICQ Mutex”. Достаточно его создать и COM будет думать, что аська работает… Да и сама аська при нахождении этого объекта скажет, что одна копия же работает. 😉