Пишем альтернативный клиент ВВЕДЕНИЕ: После того как я выложил в паблик Mail.ru Spam base generator меня многие просили выложить исходник или хотя бы рассказать как работать с MMP протоколом. Собственно этому и будет посвящен этот пост, а чтобы было еще интереснее я опишу, как отравлять СМС используя протокол. Ассемблер я выбрал не случайно, так как надеюсь, что он отпугнет неверных АЛГОРИТМ: Протокол довольно хорошо описан самими разработчиками. После установки соединения сервер постоянно посылает пакеты, которые клиент должен успевать обрабатывать и адекватно отвечать. Прием и отправка должны происходить асинхронно, а на блокируемых сокетах подобное можно реализовать лишь используя многопоточность. Я опишу принцип работы моего клиента, остальное можно будет понять из комментариев к коду. Получаем адрес рекомендуемого сервера MMP по адресу mrim.mail.ru:2042 он передается в текстовом формате ip : port Подключаемся к серверу и создаем поток отправки и приема. Потоки синхронизируется событиями. Поток отправки представляет из себя процедуру, которая ждет появления события отправки и отправляет заголовок пакета и нужно данные расположенные в общем буфере. Заголовок и данные для отправки заполняются предварительно. Поток приема представляет из себя бесконечный цикл, который постоянно принимает и анализирует заголовки отправленные сервером. Отправляем MRIM_CS_HELLO Получаем MRIM_CS_HELLO_ACK и создаем поток пинга, который через указанный в пакете интервал отправляет MRIM_CS_PING. Посылаем MRIM_CS_LOGIN2. Mail.ru Agent отправляет очень странный пакет, полностью который разобрать мне так и не удалось, а все мои попытки самостоятельно сформировать MRIM_CS_LOGIN2 оказывались неудачными, поэтому я просто скопировал часть дампа ) В случае успешной авторизации сервер присылает MRIM_CS_LOGIN_ACK и MRIM_CS_LOGIN_REJ в случае неудачи. После авторизации необходимо принять полностью MRIM_CS_USER_INFO и только после этого отправлять свои данные. Все мои попытки отправлять запросы сразу после MRIM_CS_LOGIN_ACK заканчивались неудачей. СМС: Эта возможность никак не освещена в официальной документации, но стоит немножко поснифать... Code: EFBEADDE 12000100 DD711940 39100000 команда 0x1039 отправка смс 2E000000 длина сообщения 00000000 00000000 00000000 00000000 00000000 00000000 00000000 lps номер телефона кому 0C000000 2B3739313233353435363731 // +79123545671 lps сообщение в UNICODE 16000000 67006100720069006B0020006D007500740069007400 // garik mutit После успешной отправки сервер присылает пакет 0x1040, а в случае неудачи MRIM_CS_MESSAGE_ACK в котором красиво написано почему, не ушла СМС. WWW: Для тех, кто хочет понять, как вообще это все работает, я рекомендую почитать: http://www.wasm.ru/publist.php?list=1 http://www.insidepro.com/kk/006/006r.shtml P.S Автор не несет ответственности за возможно последующие брут форсы email (пока тестировал сервер даже не ругнулся, что я так часто подключаюсь), генераторы спам баз на основе MRIM_CS_WP_REQUEST, спамерские рассылки СМС и MRIM_CS_MESSAGE, и распространение червей через MRIM_CS_FILE_TRANSFER Приложение А Текст программы К сожелению она получилась настолько здоровая, что тупо не умещается в пост ) поэтому вот ссылочки: mra.inc, string.inc, sms.asm Приложение Б Контрольный пример работы программы Рисунок Б.1 – Главное окно программы Кому лень компилировать, можете посмотреть сразу как все это работает sms.exe (7168 байт). Лично у меня антивить ругается, что это "TR/Crypr.XPACK.Gen", эх зналбы он что это просто асм программа, труд 3х ночей )
Отлично =) На делфи вариант только не выкладывай, ибо начнется массовая продажа СМС-спамеров через м.ру
Gar|k, кстати у меня тоже орет Авира на XPACK, может пару левых модулей еще подключить? З.Ы. Значит я не буду выкладывать вариант отсылки на Delphi
Gar|k А как же ))) осталось только побороть 50 смс в сутки, путем использования множества аков и синхронизации оных )) и будет около 2500 смс за сутки )) Только здаеться мне, маил.ру прикроет дыру в виде возможности отправки без добавления в список контактов.
Все на Украину шлет (там только и тестил) На лайф идет на ура, на МТС иногда с задержками, на Киевстар и Диджус не идет (но там помоему система что надо чтоб владелец, дал разрешение на принятие смс с инета). П.С. Эта прога тоже шлет нормально, но там часто траблы и она грузит проц на 100%, вообщем имеется ввиду что писал я не на асме конечно, а эти исходники только для интереса по изучал и потестил, развивать дальше на асме слишком для меня геморно ))
А не лучше ли сделать вместо Code: .ww: invoke WaitForSingleObject, [hSend], 150 cmp eax, WAIT_OBJECT_0 jne .ww Вот так: Code: invoke WaitForSingleObject, [hSend], INFINITE И еще здесь у меня происходит зависание потока со 100% загрузкой процессора. В какой-то момент recv начинает возвращать 0 и образуется бесконечный цикл. Code: .ww: ; пока не примем хоть какойто вменяемый пакетик будем крутить цикл ) cmp [s.msg], 0 jne @F invoke recv, [sock], s, 44, 0 jmp .ww
2 0rs эмм WaitForSingleObject, [hSend], 150 делает задержку в 150 милисекунд, попробуй поставить 0 и увидишь как быстро скушается все ресурсы процессора... INFINITE делает вечный цикл... тогда уж проще написать пока один равно один а вот как ты верно заметил с определением начала пакета у меня косяк... я вот реально незнаю как найти начало пакета... может цикл приема по 4 байта и сравнение его с magic num пакета - это решение, нужно попробывать...
интересно, а у меня пишет в ком строке что отправка пакета при нажатии отправить , но смс не отправляется и никакой реакции..... чтоможет быть?
В данном случае WaitForSingleObject с таймером 150 и проверкой WAIT_OBJECT_0 делает тоже самое что и WaitForSingleObject с INFINITE. После вызова SetEvent программа в любом случае выйдет из WaitForSingleObject с кодом WAIT_OBJECT_0. На счет начала пакета: разве новый пакет не начинается после того как заканчивается предыдущий? Или проблема в том чтобы определить момент, когда сервер отослал нам новый пакет, тогда можно попробовать WSASetEvent.
0rs данные идут в потоке, тоесть в одном TCP/IP пакете от сервера может быть 2-3 и тд пакета MMP. Загвоздка в определении начала пакета - чтобы принять заголовок и узнать длинну пакета MMP. В общем нужно придумать правильную обработку приема... тогда все встанет на свои места.
2 buxmanager в mail.ru множество ограничений на отправку смс, временные интервалы, лимит сообщений, неверные номера. Я лишь привел пример, как можно написать клиент. По хорошему еще нужно доработать: 1. Правильный прием данных с сервера 2. Проверку в самом приложении номера телефона, длины сообщения (если сформировать не верный пакет, он естественно ничего не вернет) 3. Обработку ошибок - ответов от сервера. + я думаю приложение получится более правильным если использовать изначально ассинхронные сокеты, но тогда теряется кросплатформенность (если писать на Си конечно)