Mail.ru SMS sender

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Gar|k, 5 Aug 2009.

  1. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Пишем альтернативный клиент


    ВВЕДЕНИЕ:
    После того как я выложил в паблик Mail.ru Spam base generator меня многие просили выложить исходник или хотя бы рассказать как работать с MMP протоколом. Собственно этому и будет посвящен этот пост, а чтобы было еще интереснее я опишу, как отравлять СМС используя протокол.
    Ассемблер я выбрал не случайно, так как надеюсь, что он отпугнет неверных :)

    АЛГОРИТМ:
    Протокол довольно хорошо описан самими разработчиками.
    После установки соединения сервер постоянно посылает пакеты, которые клиент должен успевать обрабатывать и адекватно отвечать. Прием и отправка должны происходить асинхронно, а на блокируемых сокетах подобное можно реализовать лишь используя многопоточность.

    Я опишу принцип работы моего клиента, остальное можно будет понять из комментариев к коду.
    1. Получаем адрес рекомендуемого сервера MMP по адресу mrim.mail.ru:2042 он передается в текстовом формате ip : port
    2. Подключаемся к серверу и создаем поток отправки и приема.

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

    3. Отправляем MRIM_CS_HELLO
    4. Получаем MRIM_CS_HELLO_ACK и создаем поток пинга, который через указанный в пакете интервал отправляет MRIM_CS_PING.
    5. Посылаем MRIM_CS_LOGIN2. Mail.ru Agent отправляет очень странный пакет, полностью который разобрать мне так и не удалось, а все мои попытки самостоятельно сформировать MRIM_CS_LOGIN2 оказывались неудачными, поэтому я просто скопировал часть дампа )
    6. В случае успешной авторизации сервер присылает MRIM_CS_LOGIN_ACK и MRIM_CS_LOGIN_REJ в случае неудачи.
    7. После авторизации необходимо принять полностью 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

    Приложение Б
    Контрольный пример работы программы


    [​IMG]
    Рисунок Б.1 – Главное окно программы

    Кому лень компилировать, можете посмотреть сразу как все это работает sms.exe (7168 байт). Лично у меня антивить ругается, что это "TR/Crypr.XPACK.Gen", эх зналбы он что это просто асм программа, труд 3х ночей )
     
    _________________________
    #1 Gar|k, 5 Aug 2009
    Last edited: 5 Aug 2009
    14 people like this.
  2. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Отлично =)
    На делфи вариант только не выкладывай, ибо начнется массовая продажа СМС-спамеров через м.ру
     
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 ex3me, не бойся я делфи знаю на уровне школьника :)
     
    _________________________
    1 person likes this.
  4. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Gar|k, кстати у меня тоже орет Авира на XPACK, может пару левых модулей еще подключить? :D

    З.Ы. Значит я не буду выкладывать вариант отсылки на Delphi :D
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    ну че ктонить написал спаммер? ))
     
    _________________________
  6. AKYLA

    AKYLA Elder - Старейшина

    Joined:
    29 Nov 2007
    Messages:
    108
    Likes Received:
    35
    Reputations:
    6
    Gar|k
    А как же ))) осталось только побороть 50 смс в сутки, путем использования множества аков и синхронизации оных )) и будет около 2500 смс за сутки ))
    Только здаеться мне, маил.ру прикроет дыру в виде возможности отправки без добавления в список контактов.
     
  7. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    На Украину шлет?
     
  8. buxmanager

    buxmanager Elder - Старейшина

    Joined:
    1 Apr 2009
    Messages:
    613
    Likes Received:
    229
    Reputations:
    69
    а на украину не отправляет....((((((((
     
  9. warlok

    warlok Elder - Старейшина

    Joined:
    17 Feb 2008
    Messages:
    328
    Likes Received:
    142
    Reputations:
    81
    я пробывал на MTC укр все доходило)
     
  10. nonamez

    nonamez Elder - Старейшина

    Joined:
    22 Jul 2007
    Messages:
    565
    Likes Received:
    265
    Reputations:
    17
    а куда кроме раши и укр шлет?
     
  11. buxmanager

    buxmanager Elder - Старейшина

    Joined:
    1 Apr 2009
    Messages:
    613
    Likes Received:
    229
    Reputations:
    69
    а на лайф чето не идут, может подскажешь как ты отправил) ? осемь-девять-88-семь-шесть стукни плиз
     
  12. AKYLA

    AKYLA Elder - Старейшина

    Joined:
    29 Nov 2007
    Messages:
    108
    Likes Received:
    35
    Reputations:
    6
    Все на Украину шлет (там только и тестил)
    На лайф идет на ура, на МТС иногда с задержками, на Киевстар и Диджус не идет (но там помоему система что надо чтоб владелец, дал разрешение на принятие смс с инета).
    П.С. Эта прога тоже шлет нормально, но там часто траблы и она грузит проц на 100%, вообщем имеется ввиду что писал я не на асме конечно, а эти исходники только для интереса по изучал и потестил, развивать дальше на асме слишком для меня геморно )) :D
     
    #12 AKYLA, 5 Sep 2009
    Last edited: 5 Sep 2009
  13. Keltos

    Keltos Banned

    Joined:
    8 Jul 2009
    Messages:
    1,558
    Likes Received:
    920
    Reputations:
    520
    а бляйн как?
     
  14. 0rs

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    А не лучше ли сделать вместо
    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
    
     
  15. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 0rs
    эмм WaitForSingleObject, [hSend], 150 делает задержку в 150 милисекунд, попробуй поставить 0 и увидишь как быстро скушается все ресурсы процессора...
    INFINITE делает вечный цикл... тогда уж проще написать пока один равно один :)

    а вот как ты верно заметил с определением начала пакета у меня косяк... я вот реально незнаю как найти начало пакета... может цикл приема по 4 байта и сравнение его с magic num пакета - это решение, нужно попробывать...
     
    _________________________
    #15 Gar|k, 5 Sep 2009
    Last edited: 5 Sep 2009
  16. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    нащет того куда уходят смски
     
    _________________________
  17. buxmanager

    buxmanager Elder - Старейшина

    Joined:
    1 Apr 2009
    Messages:
    613
    Likes Received:
    229
    Reputations:
    69
    интересно, а у меня пишет в ком строке что отправка пакета при нажатии отправить , но смс не отправляется и никакой реакции..... чтоможет быть?
     
  18. 0rs

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    В данном случае WaitForSingleObject с таймером 150 и проверкой WAIT_OBJECT_0 делает тоже самое что и WaitForSingleObject с INFINITE. После вызова SetEvent программа в любом случае выйдет из WaitForSingleObject с кодом WAIT_OBJECT_0.
    На счет начала пакета: разве новый пакет не начинается после того как заканчивается предыдущий? Или проблема в том чтобы определить момент, когда сервер отослал нам новый пакет, тогда можно попробовать WSASetEvent.
     
    #18 0rs, 5 Sep 2009
    Last edited: 5 Sep 2009
  19. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    0rs данные идут в потоке, тоесть в одном TCP/IP пакете от сервера может быть 2-3 и тд пакета MMP. Загвоздка в определении начала пакета - чтобы принять заголовок и узнать длинну пакета MMP. В общем нужно придумать правильную обработку приема... тогда все встанет на свои места.
     
    _________________________
  20. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 buxmanager в mail.ru множество ограничений на отправку смс, временные интервалы, лимит сообщений, неверные номера. Я лишь привел пример, как можно написать клиент. По хорошему еще нужно доработать:

    1. Правильный прием данных с сервера
    2. Проверку в самом приложении номера телефона, длины сообщения (если сформировать не верный пакет, он естественно ничего не вернет)
    3. Обработку ошибок - ответов от сервера.

    + я думаю приложение получится более правильным если использовать изначально ассинхронные сокеты, но тогда теряется кросплатформенность (если писать на Си конечно)
     
    _________________________