1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.
    Скрыть объявление

Ковыряем SMS-Аларм

Тема в разделе "Статьи на хакерскую тематику", создана пользователем chimatii, 27 авг 2011.

  1. chimatii

    chimatii Глобальный модератор

    Регистрация:
    13 окт 2009
    Сообщения:
    0
    Симпатии:
    98
    Баллы:
    0
    Доброе время суток, дамы и господа!

    Ранее в этой теме я выкладывал интересные на мой взгляд трояны для мобильных телефонов, которые осуществляют несанкционированную пользователем отсылку SMS-сообщений на платные номера (то бишь алярмы)
    Сейчас же я попытаюсь как можно подробнее описать сам процесс исследования такого трояна, а чтобы он не показался Вам скучным и примитивным (делов то, распаковать архив и открыть/отредактировать текстовик с номером/префиксами, даже пятиклассник сможет) за пример будет взят аларм с зашифрованными данными. Итак, поехали:)

    • WinRAR (самый известный архиватор; конечно можно обойтись без него, воспользовавшись стандартным виндовским ZIP-архиватором, но с этим таки лучше)
    • DJ Java Decompiler (по мне, так лучший декомпилятор и дизассемблер для Java, пригодится для исследования .class файлов)
    • InClassTranslator (изначально программа предназначалась для перевода .class файлов, послужит для изменения в них текста)
    • Kwyshell MidpX Emulator (эмулятор ява-машины, понадобится для запуска алярма на компьютере, при помощи него можно предварительно оценить интерфейс, например)
    • Мобильник (необязательно, но смартфон не помешал бы, ведь некоторые алярмы отказываются запускаться в эмуляторе, либо выдают ошибки)
    • Программа для снятия скриншотов на мобилке (для моего Nokia E52 на Symbian 9.3 можно взять тут, для своего - ищите в нете))


    На операционном столе у нас алярм, спарсенный мной на файлопомойке wsend.net, собственно вот он (зеркало) Закошен он под взломщик соц.сети Галактика знакомств.
    Пробуем запустить его при помощи Kwyshell MidpX Emulator (выбираем файл, правой кнопкой "Открыть с помощью", "Midp2Exe Compiler") Наблюдаем следующую картину:

    [​IMG]

    Нажмем на правую софт-клавишу и почитаем About:

    [​IMG]

    Больше похоже на соглашение/договор:) Ну что же, жмем OK и смотрим дальше:

    [​IMG]

    Заполняем данные от балды (даже не важно что код не совпадает, жмем дальше):

    [​IMG]

    Ну здесь уже все ясно:) Мы будем долбить на левую софт клавишу, и даже не заметим как в появившемся предложении отправить СМС нажмем "Да". Смс-ку эмулятор конечно же не отправит, в лучшем случае он никак не отреагирует, а в худшем - выдаст ошибку. Поэтому переводим наши исследования на мобильный телефон.
    Качаем приложение и устанавливаем его. Если телефон предложит запустить его - отказываемся, скажу почему.
    Нам нужно перевести телефон в автономный режим (sim-карта не используется, значит в случае нашей ошибки, смс все равно не будет отправлено). На Nokia E52 это делается так: жмем на клавишу выключения я выбираем "Автономный"

    [​IMG]

    Далее запускаем приложение, заполняем все так же как и сверху, и много-много раз жмем кнопку "Обезопасить". Ближе к концу полоски вылезет следующее окошко:

    [​IMG]

    Если бы мы очень быстро жали на кнопку, окошко даже не вылезло бы. Не успело бы:)
    Ситуация проясняется. СМС будет отправлено на номер, который Вы видите на скриншоте. Теперь попытаемся узнать, какой текст отправляется в сообщении и, конечно же, как его изменить. Переводим телефон в обычный режим и возвращаемся к компьютеру для детального изучения файла.

    Выбираем наш файл, жмем на него правой кнопкой мыши и при помощи WinRAR извлекаем все файлы в отдельную папку. Смотрим, что у нас внутри:

    [​IMG]

    Файл MANIFEST.MF в папке META-INF - описание приложения, там находится его версия, разработчик и так далее, подробнее гляньте тут, 1-20.gif - картинки, используемые в оформлении интерфейса аларма, icon.png - иконка приложения, файл count.db текстовик с каким-то мусором, какой-то отчет об ошибке что-ли:

    Ну и, наконец, .class-файлы, содержащие код. Их мы будем изучать при помощи DJ Java Decompiler. Скажу сразу, я просмотрел их все, и интерес у меня вызвали всего 2 файла: Lib_scodes.class и M.class (по совместительству, самые увесистые)

    В первом, который Lib_scodes.class, среди прочего находятся следующие строки:

    Код:
       catch(IllegalArgumentException ilae) { }
            if(rightSoftMoto.indexOf(SOFT_WORD) >= 0 && rightSoftMoto.indexOf("2") >= 0)
                return SOFT_KEY_RIGHT_MOTOROLA;
            if(rightSoftMoto1.indexOf(SOFT_WORD) >= 0 && rightSoftMoto1.indexOf("2") >= 0)
                return SOFT_KEY_RIGHT_MOTOROLA;
            if(rightSoftMoto2.indexOf(SOFT_WORD) >= 0 && rightSoftMoto2.indexOf("2") >= 0)
                return SOFT_KEY_RIGHT_MOTOROLA1;
            if(rightSoftMoto.indexOf(SOFT_WORD) >= 0 && rightSoftMoto.indexOf("RIGHT") >= 0)
                return SOFT_KEY_LEFT_MOTOROLA;
            if(rightSoftMoto1.indexOf(SOFT_WORD) >= 0 && rightSoftMoto1.indexOf("RIGHT") >= 0)
                return SOFT_KEY_RIGHT_MOTOROLA1;
            if(rightSoftMoto2.indexOf(SOFT_WORD) >= 0 && rightSoftMoto2.indexOf("RIGHT") >= 0)
                return SOFT_KEY_RIGHT_MOTOROLA;
            break MISSING_BLOCK_LABEL_425;
            if(PLATFORM_NAME.equals(PLATFORM_NOKIA))
                return SOFT_KEY_RIGHT_NOKIA;
            if(PLATFORM_NAME.equals(PLATFORM_SAMSUNG))
                return SOFT_KEY_RIGHT_SAMSUNG;
            String rightSoftSiemens;
            if(!PLATFORM_NAME.equals(PLATFORM_SIEMENS))
                break MISSING_BLOCK_LABEL_312;
            rightSoftSiemens = M.T.getKeyName(SOFT_KEY_RIGHT_SIEMENS).toUpperCase();
            if(rightSoftSiemens.indexOf(SOFT_WORD) < 0)
                break MISSING_BLOCK_LABEL_425;
            if(rightSoftSiemens.indexOf("4") >= 0)
                return SOFT_KEY_RIGHT_SIEMENS;
            if(rightSoftSiemens.indexOf("RIGHT") >= 0)
                return SOFT_KEY_RIGHT_SIEMENS;
            break MISSING_BLOCK_LABEL_425;
            if(PLATFORM_NAME.equals(PLATFORM_SONY_ERICSSON))
                return SOFT_KEY_RIGHT_SE;
            if(PLATFORM_NAME.equals(PLATFORM_NOT_DEFINED))
            {
                for(int i = -125; i <= 125; i++)
                {
                    if(i == 0)
                        i++;
                    String keyName = M.T.getKeyName(i).toUpperCase();
                    if(keyName.indexOf(SOFT_WORD) < 0)
                        continue;
                    if(keyName.indexOf("2") >= 0)
                    {
                        keyCode = i;
                        break;
                    }
                    if(keyName.indexOf("4") >= 0)
                    {
                        keyCode = i;
                        break;
                    }
                    if(keyName.indexOf("RIGHT") < 0)
                        continue;
                    keyCode = i;
                    break;
                }
    
    По ним становится понятно, что алярм сам определяет что-то типа обобщенной модели телефона, и дает знать, какую клавишу следует нажимать, чтобы заполнить линейку "Обезопасить", правую или левую.

    Второй, M.class, намного интереснее. Здесь содержится текст договора и другие строки, которые в дальнейшем можно отредактировать при помощи InClassTranslator:

    [​IMG]

    Далее - интересные куски кода:

    Код:
    res = S.r("/count.db");
            line = new String(S.nl(res));
            count = new String(line.substring(line.indexOf("on line") + 8, line.length()));
            line = new String(line.substring(line.indexOf(String.valueOf('_')) + 1, line.indexOf(".dat")));
            _fldnull = new String(line.substring(line.indexOf(String.valueOf('q')) + 1, line.length()));
            String.valueOf('T')[c] = 0 - 0;
            String.valueOf('b')[c] = 1 - 0;
            String.valueOf('F')[c] = 2 - 0;
            String.valueOf('E')[c] = 3 - 0;
            String.valueOf('m')[c] = 4 - 0;
            String.valueOf('r')[c] = 5 - 0;
            String.valueOf('p')[c] = 6 - 0;
            String.valueOf('C')[c] = 7 - 0;
            String.valueOf('X')[c] = 8 - 0;
            String.valueOf('z')[c] = 9 - 0;
            i = 0;
    А что здесь собственно происходит? А вот что: тут у нас открывается файлик count.db (да-да, тот, с мусором) и проходит парсинг строк: count = текст, следующий после "on line", т.е. 2735, а line = текст, находящися между "_" и ".dat", т.е. zyFFEEFFqCFrT.
    Что это за набор букв: zyFFEEFFqCFrT? А далее в коде у нас по таблице происходит замена одних символов другими: T заменяется на ноль, b на единицу.. И набор букв приобретает следующий вид:

    Постой-те ка:) Ведь 7250 - это номер телефона, на который отправляется СМС-ка) Рискнем, попробуем заменить этот номер на свой, потом по таблице заменим символы и вставим в файл count.db. Запакуем все обратно в jar и скинем его на телефон. Проделаем все тоже самое что и раньше, и увидим: адресат сообщения изменился:)

    [​IMG]

    А вот сообщение, которое нам пришло от самого себя:

    [​IMG]

    Ничего не напоминает? Часть текста - 9y223322 до q, после которого идет номер сообщения, а другая часть - 2735, разделенная пробелами:) Вот он и текст нашелся. Но тут y заменен на +?
    Ах да, и это в коде прописано, дальше:

    Код:
      if((((byte)(hesh.indexOf(String.valueOf('[B]y[/B]')) != j ? -1 : 0))) == 0)
                break MISSING_BLOCK_LABEL_1272;
            hesh.substring(j, j + 1);
            (new StringBuffer()).append(buf);
            JVM INSTR swap ;
            append();
            toString();
            JVM INSTR new #32  <Class String>;
            JVM INSTR dup_x1 ;
            JVM INSTR swap ;
            String();
            buf;
            continue; /* Loop/switch isn't completed */
            [B](char)43; <== 43 это + в хексе[/B]
            (new StringBuffer()).append(buf);
    
    Теперь попробуем заменить и текст) В файле count.db:
    • 9y223322 изменим на 1234567890 (с учетом таблицы)
    • 2735 удалим

    Получим файл с примерно следующим содержанием:

    Код:
    Warning: fopen(cashe_bFEmrpCXzTqXzTrEFTTTTT.dat) [function.fopen]: failed to open stream: Permission denied in /home/user_478/public_html/index.php on line 
    Ну и наконец, собственно, результат:

    [​IMG]

    З.Ы. Тут можно скачать программу, которая сама заменяет символы по таблице (чтоб самому любимому не колупаться)

    [​IMG]

    Удачных исследований!:)

    (c) chimatii, xaker.name & grabberz.com
    Копирование статьи без указания первоисточника карается анально


    И пожалуй, выставлю статью на конкурс:)
     
    Последнее редактирование: 26 ноя 2011
    8 пользователям это понравилось.
  2. chimatii

    chimatii Глобальный модератор

    Регистрация:
    13 окт 2009
    Сообщения:
    0
    Симпатии:
    98
    Баллы:
    0
    Доброе время суток, дамы и господа. Сегодня я решился обновить эту тему изучением очередного смс-аларма, но тем не менее интересного на мой взгляд.

    На выходных мне на телефон пришло смс-сообщение. Вот оно:

    [​IMG]

    Имея какой-никакой опыт в таких ситуациях, я решил чуть позже разобраться что там к чему, но это были выходные, я отвлекся и забыл обо всем. Вчера, имея некоторое количество свободного времени, я решил вернуться к этому вопросу.
    Понятное дело, что по ссылке скачивался смс-аларм, причем, если я пытался обратиться к сайту с компьютера, сайт редиректил на google (идет ли выборка по ip или user-agent я разбираться не стал), но это не помешало мне его скачать. Ну что ж, начинаем разбираться:

    Будут использоваться те же, что и раньше, за небольшой заменой и исключением некоторых.
    Нам понадобятся:

    • WinRAR (самый известный архиватор; конечно можно обойтись без него, воспользовавшись стандартным виндовским ZIP-архиватором, но с этим таки лучше)
    • Java Decompiler JD-GUI (очень неплохая замена DJ Java Decompiler: бесплатный, одним файлом)
    • WinHEX (продвинутый hex-редактор, можно использовать альтернативы)

    Так как файл был скачан на телефон, а только потом был передан на компьютер, я опишу как он выглядел на Nokia Е52.
    Для осмотра я перевел его в автономный режим, дабы не отправить ненароком чего лишнего на короткий номер, и потом запустил приложение.

    [​IMG]

    Интерфеис как бы намекает нам, что приложение поддерживается немалым количеством устройств. Жмем кнопку с условием:

    [​IMG]

    Все красиво и понятно расписано, мол "Вы, уважаемый Лох Лохович, можете получить доступ к файловому контенту, но за это у Вас спишут денюшку, а виноваты в случае чего будете Вы сами". Но не суть. Соглашаемся с условиями, видим самостоятельно заполняющийся прогрессбар.

    [​IMG]

    Но вот он доходит до 39% и картина меняется. Уловили суть?:)

    [​IMG] [​IMG] [​IMG]
    ==

    Стоит при этом заметить, что аларм использует несколько номеров и отправляет смс немалое количество раз. На этом визуальное знакомство заканчивается, переводим исследования на компьютер.

    Распаковываем наше приложение в отдельную папку при помощи WinRAR. Что у нас внутри:

    [​IMG]

    META-INF/MANIFEST.MF - описание приложения, там находится его версия, разработчик и так далее, res/logo.png - картинка в приложении, icon.png - иконка, несколько .class файлов, agreement.txt - видимо соглашение, rules.txt - правила, Thumbs.db - пока непонятно. Последние три файла зашифрованы, и ничего вменяемого мы там не видим:

    [​IMG]

    Чтобы узнать тайны шифрования этих файлов, следует более детально изучить код, что мы и сделаем.
    Открываем JD-GUI и скармливаем ей весь mms.jar (так удобнее) и начинаем детально просматривать .class-ы в поисках вкусненького..

    [​IMG]

    Нексколько классов. Названия фунций (smsSendBezPaleva, getSmsServisNum, dekodirivanie) как бы говорят нам "from Russia with love";)
    keyAnalysed - позволяет решить, какую кнопку нам нужно долбить, правую или левую, thisOperator - выбор оператора в зависимости от сервисцентра и так далее.

    Расписывать все не вижу смысла, так как нас интересуют именно шифрованные файлы, пробуем поискать их в коде, натыкаемся на:

    Ага! Значит для загрузки файлов используется функция lib.get_File_Content. Жмем на текст 2 раза, переходим к классу lib, вот наша функция:

    Я выделил фрагмент, в котором происходит шифрование. Берется текст и прогоняется весь побайтово, каждый байт ксорится (значок ^) на байты массива main.codeKey. Попробуем поискать его значение. Жмем Ctrl+F, вводим codeKey и натыкаемся на строчки в классе s.class:

    Ага! Вот он наш массив. Попробуем использовать полученную информацию на практике. Откроем файл agreement.txt в WinHex.
    Первой буквой в массиве была u, а это 75 в хексе. Выделяем первый байт нашего файла, жмем Ctrl+T, там ставим галку на Xor, вводим наше значение в хексе, жмем ОК.

    [​IMG]

    Знак ± превращается в букву Д. Далее в массиве идет o, это 6F в хексе, проделываем все тоже самое что и выше и получаем букву л.
    Вот как начинает выглядеть наш файл после небольшой обработки:

    [​IMG]

    Следует помнить, что после обработки нашим массивом 5 байтов информации, все начинается заново, и таким образом прогоняется весь файл.

    Так как делать все эти действия вручную муторно (да и не царское это дело) я набросал небольшую утилиту, упрощающую этот процесс. Итог обработки agreement.txt:

    Почти тоже самое с rules.txt, содержимое Thumbs.db:

    Вот и выбор в зависимости от оператора:) В общем дальше все становится просто. Результат замены номера:

    [​IMG] [​IMG]

    Префикс тоже меняется легко тем же блокнотом, после того прогоняем файл утилитой еще раз (функция XOR - обратимая;))

    В общем, удачных исследований! Скачать утилиту и сам аларм можно тут.
    Использовать в благих целях!

    (c) chimatii
    Прошу прощения у тех, у кого я возможно отнял хлеб, но вы и сами понимаете насколько честно это самое занятие.
     
    Последнее редактирование: 17 окт 2012
    2 пользователям это понравилось.

Поделиться этой страницей