Подобным страдал сам, но статью писать было лень, и вот сегодня на хабрее увидел подобное.
Афтор статьи: den_lesnov
День начинался как обычно. Некоторое время я пытался листать конспекты, но скукой от них веяло самым жесточайшим образом. И тут внезапно случилось чудо. Самое настоящее чудо. У меня запищал мобильник, сообщая о том, что мне пришла SMSка.
Я схватил мобильник и стал читать эту SMSку. А в ней такой вот текст:
Звёздочками я тут прикрыл свой номер.
Ясное дело, развод. Но блин, руки-то чешутся, зверушка явно написана на моей любимой Джаве, и мне жутко хочется её расковырять.
Открываю браузер, иду по указанной ссылке. Антивирь поднимает визг и не даёт скачаться файлику.
Тут я вспомнил о замечательной качалке файлов на никсах, с которой познакомился в то время, когда пользовался Убунтой. Называется 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/). И вот что я в нём увидел:
Не знаю кому как, а мне не очень очевидно, что сиё означает. Поэтому читаю дальше код метода sendSms().
Ниже по течению метод определяет позиции символов «[», «:» и «]» в тексте и выделяет части строк между ними с помощью метода substring.
Следующие несколько строк создают SMS через специальный API и отправляют его. Теперь становятся понятными значения цифр в файле:
«3116» это номер, на который идёт SMS, «9652516212 200» — текст сообщения. Во вторых скобках всё то же самое: «8464» — номер, «1» — текст.
Внимательный читатель тут же спросит: «Неужели две SMSки?». Да, две. Вообще, их может быть сколько угодно — столько, сколько записей вида [number:text] будет найдено в файле. Ибо процедура чтения и отправки выполняется в цикле до тех пор, пока не будет прочитан весь файл до конца.
Тут мне стало интересно, что же означает текст сообщения «9652516212 200», и я обратился с этим вопросом к гуглу. Гугл мне ответил, что:
Вот так тайна и перестала быть тайной. Грубый, брутальный развод обернулся для меня почти часом любопытнейших изысканий.
Афтор статьи: den_lesnov

День начинался как обычно. Некоторое время я пытался листать конспекты, но скукой от них веяло самым жесточайшим образом. И тут внезапно случилось чудо. Самое настоящее чудо. У меня запищал мобильник, сообщая о том, что мне пришла SMSка.
Я схватил мобильник и стал читать эту SMSку. А в ней такой вот текст:
Код:
Postupil MMS podarok ot «Katya» dlya abonenta +7903*******. Posmotret: [U]loadsms.ru/606.jar[/U]
Звёздочками я тут прикрыл свой номер.
Ясное дело, развод. Но блин, руки-то чешутся, зверушка явно написана на моей любимой Джаве, и мне жутко хочется её расковырять.
Открываю браузер, иду по указанной ссылке. Антивирь поднимает визг и не даёт скачаться файлику.
Тут я вспомнил о замечательной качалке файлов на никсах, с которой познакомился в то время, когда пользовался Убунтой. Называется 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]
Ниже по течению метод определяет позиции символов «[», «:» и «]» в тексте и выделяет части строк между ними с помощью метода substring.
Следующие несколько строк создают SMS через специальный API и отправляют его. Теперь становятся понятными значения цифр в файле:
«3116» это номер, на который идёт SMS, «9652516212 200» — текст сообщения. Во вторых скобках всё то же самое: «8464» — номер, «1» — текст.
Внимательный читатель тут же спросит: «Неужели две SMSки?». Да, две. Вообще, их может быть сколько угодно — столько, сколько записей вида [number:text] будет найдено в файле. Ибо процедура чтения и отправки выполняется в цикле до тех пор, пока не будет прочитан весь файл до конца.
Тут мне стало интересно, что же означает текст сообщения «9652516212 200», и я обратился с этим вопросом к гуглу. Гугл мне ответил, что:
- Номер 3116 принадлежит билайновскому сервису «МОБИ.Деньги».
- Формат сообщения «9652516212 200» соответствует просьбе перевести 200 рублей с моего счёта на номер 965-251-6212.
Вот так тайна и перестала быть тайной. Грубый, брутальный развод обернулся для меня почти часом любопытнейших изысканий.