![]() |
Mail.ru SMS sender
Пишем альтернативный клиент ВВЕДЕНИЕ: После того как я выложил в паблик Mail.ru Spam base generator меня многие просили выложить исходник или хотя бы рассказать как работать с MMP протоколом. Собственно этому и будет посвящен этот пост, а чтобы было еще интереснее я опишу, как отравлять СМС используя протокол. Ассемблер я выбрал не случайно, так как надеюсь, что он отпугнет неверных :) АЛГОРИТМ: Протокол довольно хорошо описан самими разработчиками. После установки соединения сервер постоянно посылает пакеты, которые клиент должен успевать обрабатывать и адекватно отвечать. Прием и отправка должны происходить асинхронно, а на блокируемых сокетах подобное можно реализовать лишь используя многопоточность. Я опишу принцип работы моего клиента, остальное можно будет понять из комментариев к коду.
Эта возможность никак не освещена в официальной документации, но стоит немножко поснифать... Код:
EFBEADDEWWW: Для тех, кто хочет понять, как вообще это все работает, я рекомендую почитать: 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 Приложение Б Контрольный пример работы программы http://zona-chat.narod.ru/smssend/sms.jpg Рисунок Б.1 – Главное окно программы Кому лень компилировать, можете посмотреть сразу как все это работает sms.exe (7168 байт). Лично у меня антивить ругается, что это "TR/Crypr.XPACK.Gen", эх зналбы он что это просто асм программа, труд 3х ночей ) |
Отлично =)
На делфи вариант только не выкладывай, ибо начнется массовая продажа СМС-спамеров через м.ру |
2 ex3me, не бойся я делфи знаю на уровне школьника :)
|
Gar|k, кстати у меня тоже орет Авира на XPACK, может пару левых модулей еще подключить? :D
З.Ы. Значит я не буду выкладывать вариант отсылки на Delphi :D |
ну че ктонить написал спаммер? ))
|
Gar|k
А как же ))) осталось только побороть 50 смс в сутки, путем использования множества аков и синхронизации оных )) и будет около 2500 смс за сутки )) Только здаеться мне, маил.ру прикроет дыру в виде возможности отправки без добавления в список контактов. |
На Украину шлет?
|
а на украину не отправляет....((((((((
|
Цитата:
|
а куда кроме раши и укр шлет?
|
Цитата:
|
Все на Украину шлет (там только и тестил)
На лайф идет на ура, на МТС иногда с задержками, на Киевстар и Диджус не идет (но там помоему система что надо чтоб владелец, дал разрешение на принятие смс с инета). П.С. Эта прога тоже шлет нормально, но там часто траблы и она грузит проц на 100%, вообщем имеется ввиду что писал я не на асме конечно, а эти исходники только для интереса по изучал и потестил, развивать дальше на асме слишком для меня геморно )) :D |
а бляйн как?
|
А не лучше ли сделать вместо
Код:
.ww:Код:
invoke WaitForSingleObject, [hSend], INFINITEКод:
.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. Обработку ошибок - ответов от сервера. + я думаю приложение получится более правильным если использовать изначально ассинхронные сокеты, но тогда теряется кросплатформенность (если писать на Си конечно) |
указал номер верно, указал текст верно) и дулька)))
|
Gar|k
А можно детальнее про временные интервалы, кроме одной минуты и 50 смс в день? |
AKYLA, когда я в прошлом году сделал этот клиент я попробывал написать рассылку, но тут же столкнулся с проблемой минутного интервала. Писать обработку сообщений сервера мне было лень и я забросил эту идею. Попробуй, потестируй, погляди что возвращает сервер, обычно это сообщение (1036 вроде) в котором текстом в rtf объясняется причина по которой СМС не может быть доставлена.
|
так почему не отправляется то? не могу понять:) извините за непонимание, но все верно указываю!
|
Gar|k
Ну я пока нашел ограничения это - минута, через 10 сообщений если тебе не отвечает абонент так же смс'кой то ты блокируешься на 24 часа. (хитро придумано, ведь ответные смс с тела на агент платные ))) Тесты показали, если с нового ака маил.ру пытаться отправить, ничего не будет, для этого обязательно нужно в контакты занести хотя бы один контакт с номером (потом его можно и удалить) и только тогда будет возможность отсылать без маил агента. |
Цитата:
|
Цитата:
|
"Бороть" 50 СМС в сутки или 1 минуту не надо. В 1 поток быстрее чем 1 СМС в секунду не отшлешь. Решение - Вешаем 1К акков и вперед. По одному на секунду в цикле 50.
Добавление/удаление телефона в контакты не нужно. Для отправки СМС нужно чтобы хотя бы в один контакт был добавлен номер телефона. Решение - добавляем любой "левый" номер в контакт Support (по умолчанию он у любого акка есть), а потом шлем СМС на любой нужный номер. Вот этот самый номер в контакты можно не писать. Все равно отправляет. Можно добавить проверку на наличие номеров в контактах акка, тогда вообще остается только отправить СМС-ку безо всяких добавлений. ИП вроде не "палится", но это надо массово проверять.. Удачных экспериментов. |
У меня ип от таких приколов в бан на 3е суток уходил где то на 15 - 20й смске
|
Gar|k как думаеш это пдойдет для асинхронных ответов серверу ?
отбработки ошибок нет для наглядности Код:
крутил крутил как сделать получилось это затраты на создание структур ядра потока и помещение его в очередь небольшие но все равно мне не нравится решение с постоянным созданием потоков сначал думал держать поток на событии но потом прикинул что мне надо например 10 потоков отправляли одновремено 10 событий ? 1 если собитые то или один поток проснется если с автосбросом или все если с ручным сбросом один если просыпатся будет неподходит так как отправка тогда не асинхронно будет выполнятся все тоже не пойдет если я передаю один запрос всего в минуту да и вот еще что допустим из какого то потока вызов SendMsg("MRIM_CS_HELLO"); так как вызов асихронный то она вернет управление и выйдет из функции ее вызывавшей буфер разрушится когда поток получит время начнет отсылать и прочитает из стека черти что поэтому пришлось сделать так тут блокируем вызывабщий поток пока поток когда получит время не скопирует себе строку в кучу Код:
th.hCompleteInit = CreateEvent(NULL, FALSE, FALSE, NULL);Код:
PCHAR pMsg = malloc(strlen(th->pMsg)+1);SendMsg("MRIM_CS_HELLO"); и можно уже не опасатся из какого контекста вызывалась функция фактически только задержка на событии для копирования строки получается но мне это не нравится как то есть идеи как лучше отправку организовать ? еще вариант с пулом поколдовать там хоть не надо создавать треды так часто QueueUserWorkItem в коде фактически придется только заменить CreateThread на QueueUserWorkItem наверно эффективней должно быть хоть потоки завершатся не будут набрел на твою статью решил поигратся с протоколом ))) кстати запости заголовок пакета которые отправляются перед сообщением который а то у меня маил агентов нет а ставить че то как то не очень то и надо )) фактически вот сразу попробовал решение с пулом потоков вот что получилось Код:
копируются вызывающий поток который хочеит отправить сообщение ждет только пока потоку в пуле выделится время он скопирует пакет себе в память и тут же освобождает поток который хочет отправить сообщение уже что то )) есть мысли как сделать лучше ?)) |
greki_hoy o_O :)
посмотри это массив сокетов и те же потоки приема и отправки. (сейчас понимаю что прием лучше было бы реализовать через select) А вообще обмен с клиентом идет асинхронно... и стоит задуматься не проще ли использовать асинхронные сокеты? ) (я с ними никогда не работал... статейка так ничего) Вон прочитай выше статью и обрати внимание на описание WSAEventSelect. Я удмаю реально запихнуть весь клиент в одну функцию, а потом просто делать много потков на нее основе. |
а есть на короткие намера? отправлять отправляю а принимать то незнаю как?
|
Цитата:
на киевстар не доходит |
| Время: 23:19 |