История одного вскрытия: реверс-инжиниринг Java ME трояна

:

: 3

День начинался как обычно. Некоторое время я пытался листать конспекты, но скукой от них веяло самым жесточайшим образом. И тут внезапно случилось чудо. Самое настоящее чудо. У меня запищал мобильник, сообщая о том, что мне пришла SMSка.

Я схватил мобильник и стал читать эту SMSку. А в ней такой вот текст:

Postupil MMS podarok ot «Katya» dlya abonenta +7903*******. Posmotret: loadsms.ru/606.jar

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

Открываю браузер, иду по указанной ссылке. Антивирь поднимает визг и не даёт скачаться файлику.

Тут я вспомнил о замечательной качалке файлов на никсах, с которой познакомился в то время, когда пользовался Убунтой. Называется wget и имеет версии под все популярные ОСи. Гуглю, качаю: http://users.ugent.be/~bpuype/wget/

Скачиваю ей 606.jar (антивирь молчит в тряпочку), распаковываю его ZIPом и чешу репу: самое интересное находится в подкаталоге mms и называется Poster.class. Файлы .class есть скомпилированные Java-программы. Просто текстовым редактором их не открыть. Ну, то есть, можно открыть, но человекопонятного текста увидеть при этом не удастся. А мне же хочется...

Но, к счастью, Java обладает одним замечательным механизмом: Reflection (рефлексия), которые позволяет определять для скомпилированных классов их структуру, имена и сигнатуры методов, и кучу другой полезной информации. На основе этой технологии работает декомпилятор http://java.decompiler.free.fr/, позволяющий провести реверс-инжиниринг скомпилированной программы легко и непринуждённо. Чем я и занялся, едва успев его скачать и установить.
UPD: В комментариях подсказали, что Reflection API тут не при делах, а работает эта кухня через Byte code decompilation.

Открываю декомпилером файл mms/Poster.class и вижу всё, что нужно: восстановленный исходный код класса.
Самое первое, что я заметил: программа является Java MIDLet’ом, то есть Java-приложением, предназначенным для работы на различных устройствах со сравнительно слабыми техническими характеристиками, такими, как мобильные телефоны. Что вполне ожидаемо для телефонных разводов-то!Работа такого приложения начинается с вызова метода run(). Вот он:

В глаза бросается первая строка тела метода:

if (sendSms())

Судя по имени вызываемого метода, программа куда-то пытается отправить SMS. Смотрю на метод sendSms():

Первым делом тут проверяется, было ли уже отправлено SMS (в методе isRecordstoreExists(), куда я одним глазком заглянул по пути). Если уже было, то больше не отправляем (и на том спасибо).

Далее открывается файл 1.gif, причём как текстовый. Ну и ладно, я с самого начала не верил, что это картинка. Кстати, раз пошла такая пьянка, я его и сам решил открыть своим любимым текстовым редактором Notepad++ ( http://notepad-plus-plus.org/). И вот что я в нём увидел:

[3116:9652516212 200][8464:1]

Не знаю кому как, а мне не очень очевидно, что сиё означает. Поэтому читаю дальше код метода sendSms().

Ниже по течению метод определяет позиции символов « [», « :» и « ]» в тексте и выделяет части строк между ними с помощью метода substring.

Следующие несколько строк создают SMS через специальный API и отправляют его. Теперь становятся понятными значения цифр в файле:
« 3116» это номер, на который идёт SMS, « 9652516212 200» — текст сообщения. Во вторых скобках всё то же самое: « 8464» — номер, « 1» — текст.

Внимательный читатель тут же спросит: «Неужели две SMSки?». Да, две. Вообще, их может быть сколько угодно — столько, сколько записей вида [number:text] будет найдено в файле. Ибо процедура чтения и отправки выполняется в цикле до тех пор, пока не будет прочитан весь файл до конца.

Тут мне стало интересно, что же означает текст сообщения «9652516212 200», и я обратился с этим вопросом к гуглу. Гугл мне ответил, что:

  1. Номер 3116 принадлежит билайновскому сервису «МОБИ.Деньги».
  2. Формат сообщения «9652516212 200» соответствует просьбе перевести 200 рублей с моего счёта на номер 965-251-6212.

Аналогично я поступил и с 8464.

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

P.S. Прошу простить за сумбурный стиль изложения: это мой первый опыт описания своих проказ печатным текстом.