Python: MRA — Mail.ru Agent (SMS)

Решил немного потренироваться в создании пакетов и разборов дампов, выбрал для этого MRA в качестве исследуемого и Python как язык для реализации задуманного.
Хочу сразу уточнить, что ответ сервера при отправки SMS был выбран методом тыка, потому что у меня нет под рукой нативного клиента, который мог бы отправить СМСку.
Основные моменты описаны в коде, оптимизировать ф-ции в коде не стал, т.к. так более наглядней и можно просмотреть все этапы создания пакета для отправки.
В роле снифера выступал wireshark.
Буду очень благодарен за дампы с ответами после отправки SMS.(успешной и нет)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env python
# coding=utf-8
'''
sms_mrim_client.py
author: Dominus
site: http://k0derz.ru/
http://agent.mail.ru/ru/help/3/2.html - поддерживаемые операторы
'''

import socket, string, sys
from struct import *
'''
Конфигурационные данные
'''

LOGIN    = '' # e-mail
PASSWORD = '' # пароль
NUMBER   = '' # номер телефона
TEXT         = "" # текст сообщения
'''
The End of config
'''

PROTO_VERSION               = 0x10008    # версия протокола
CS_MAGIC                            = 0xDEADBEEF # тип магическая хрень (начало заголовка пакета)
MRIM_CS_HELLO                   = 0x1001     # приветсвуем сервер
MRIM_CS_HELLO_ACK       = 0x1002     # получаем ответный привет
MRIM_CS_LOGIN2          = 0x1038     # пытаемся залогиниться
MRIM_CS_LOGIN_ACK     = 0x1004     # ответ в случае успешной авторизации
MRIM_CS_SMS                     = 0x1039         # шлём СМСку
MRIM_CS_SMS_ACK             = 0x33A          # читаем статус СМСки
MRIM_CS_STATUS_ONLINE = 0x00000001 # логинимся со статусом On-line

# получаем адрес куда будет конектиться
def get_host_port():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('mrim.mail.ru', 2042))
    s.send("GET / HTTP 1.1\r\n\r\n")
    data = s.recv(128)
    s.close()
    return data
# ф-ция по созданию пакета приветствия
def packet_make(msg, seq=1, mydata=''):
    formt = '<5L'
    dlen = len(mydata)
    my_header = pack(formt, CS_MAGIC, PROTO_VERSION, seq, msg, dlen) + pack('<L', 0)*6
    return my_header
   
# ф-ция авторизации
def mrim_login(login=LOGIN, password=PASSWORD, client='pymra 0.1beta'):
    formt = '<5L'
    mydata = pack('<L', len(login)) + login + pack('<L', len(password)) + password + pack('<L', MRIM_CS_STATUS_ONLINE) + pack('<L', len(client)) + client + pack('<L', 0)*5
    dlen = len(mydata)
    my_header_login = pack(formt, CS_MAGIC, PROTO_VERSION, 2, MRIM_CS_LOGIN2, dlen) + pack('<L', 0)*6 + mydata
    return my_header_login

# ф-ция отправки SMS   
def sms_send(number=NUMBER, text=TEXT):
    formt = '<5L'
    mydata = pack('<L', 0) + pack('<L', len(number)) + number + pack('<L', len(text)) + text
    dlen = len(mydata)
    my_header_sms = pack(formt, CS_MAGIC, PROTO_VERSION, 3, MRIM_CS_SMS, dlen) + pack('<L', 0)*6 + mydata
    return my_header_sms

def main():    
    host_port = get_host_port().split(':') 
    my_header = packet_make(MRIM_CS_HELLO, 1)
    my_header_login = mrim_login()
    my_header_sms = sms_send() 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host_port[0], int(host_port[1])))   
    s.send(my_header)
    data = s.recv(48)
    resp = unpack('12L', data)
    if resp[3] == MRIM_CS_HELLO_ACK:
        print "[+] Подключились!"
    else:
        print "[!] Не подключились!"
        sys.exit(0)
    s.send(my_header_login)
    data_l = s.recv(48)
    resp_l = unpack('12L', data_l)
    if resp_l[3] == MRIM_CS_LOGIN_ACK:
        print "[+] Залогинились!"
    else:
        print "[!] Проверьте логин и пароль!"
        sys.exit(0)
    s.send(my_header_sms)
    data_s = s.recv(48)
    resp_s = unpack('12L', data_s) 
    if resp_s[3] == MRIM_CS_SMS_ACK:
        print "[+] SMS отправили!"
    else:
        print "[!] SMS не отправили :("
        sys.exit(0)
    s.close()
   
if __name__ == "__main__":
    main()

UPD: Огромное спасибо Владимиру за дополнения и корректировку статуса удачной отправки сообщения.

20 Replies to “Python: MRA — Mail.ru Agent (SMS)”

    1. самый простой вариант это дописать эти две строки

      1
      2
      socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "127.0.0.1", 9050, True)
      socket.socket = socks.socksocket

      перед вызовом самого сокета, и подключить либу socks (

      1
      import socks

      ),
      с такими параметрами (127.0.0.1:9050) можно подключаться через TOR, или же прописать свой собственный.

  1. Dm, проверьте отступы, также желательно чтоб отступы были не пробелами, а табами — это есть в настройках редактора (для windows это notepad+, для linux — geany или gedit)

  2. Здравствуйте. При попытке отослать через командную строку пишет:
    File «1.py» line 14
    Login = ‘****@mail.ru’
    IndentationError: unexpected indent
    Помогите исправить,заранее благодарю

  3. в общем у меня при отправке с другого аккаунта выдает коды MRIM_CS_SMS_ACK и 866, и 877, и 818, и 817. причем одинаковые статусы выдает как при удачных так и при неудачных отправлениях… есть два соседних ответа сервера когда послал меньше чем через минуту. первая смс дошла, вторая заблокирована. при этом в обоих случаях сервер вернул (65559, 2, 4117, 818, 0, 0, 0, 0, 0, 0, 13, 1296650829). так что не понятно.

    1. ясненько, одним словом мэилрушечка)
      спасибо за тестирование и помощь, если вдруг найдете какую-то закономерность сразу сообщите 😉

  4. вроде да. правда мегафон у меня в последнее время глючит и смс-ки с запозданием ходят. новые отправленные(как с тем так и с другим статусом) не дошли еще.

  5. спасибо большое за дополнения и замечания, обновил код.
    т.е. оба удачных отправленных сообщение, но с разными статусами 0x33a и 0x339?

  6. для отправки русского текста использую
    TEXT = u’проверка’.encode (‘cp1251’)

    также сервер вернул при отправленном сообщении
    (65559, 2, 4117, 825, 0, 0, 0, 0, 0, 0, 13, 1296650829)

    при этом в сообщении не было информации про то, что можем послать обратное сообщение

  7. скрипт работает! у меня на моск мегафон отправляет. правда пишет что sms не отправлено. на всякий случай я поставил задержку времени 1 сек time.sleep (1) перед s.send(my_header_sms) (85 строка)

    1. спасибо за комментарий и дополнение, если не трудно не могли бы скинуть дамп пакета, когда отправка СМС проходит, буду очень благодарен.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *