SHARE
TWEET

Untitled

a guest Jun 5th, 2017 80 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3. import socket
  4. import struct
  5. import threading
  6. import Queue
  7. import MySQLdb
  8. import time
  9. import subprocess
  10. import re
  11. import os
  12.  
  13. class Database:
  14.     host = '127.0.0.1'
  15.     user = 'root'
  16.     password = 'root'
  17.     db = 'smshack'
  18.  
  19. def __init__(self):
  20.     self.connection = MySQLdb.connect(self.host, self.user, self.password, self.db)
  21.         self.cursor = self.connection.cursor()
  22.  
  23.     def insert(self, query):
  24.         try:
  25.             self.cursor.execute(query)
  26.             self.connection.commit()
  27.         except:
  28.             self.connection.rollback()
  29.  
  30. def query(self, query):
  31.     cursor = self.connection.cursor( MySQLdb.cursors.DictCursor )
  32.         cursor.execute(query)
  33.        
  34.         return cursor.fetchall()
  35.    
  36.     def __del__(self):
  37.         self.connection.close()
  38.  
  39. def covert_cellphone_num(num):
  40.     phone_number = []
  41.     for i in num:
  42.         i = ord(i)
  43.         i = (i << 4 & 0xF0) + (i >> 4 & 0x0F)
  44.         phone_number.append(chr(i))
  45.    
  46.     return ("".join(phone_number).encode('hex'))[:-1]
  47.  
  48. def handle_message(**kargs):
  49.     gsm_sms_segs = ""
  50.     mysql = Database()
  51.     mysql.insert("SET NAMES utf8")
  52.    
  53.     while True:
  54.         data = kargs['messages'].get(True)
  55.         if data[0:2] == '\x02\x04':
  56.             #uplink = struct.unpack('H', data[4:6])[0]
  57.             #uplink = (uplink & 0x40 == 0x40)
  58.             #print data.encode('hex')
  59.             #skip header 16 bytes, directly handle the LAPDm part
  60.             address_field = struct.unpack('B', data[16:17])[0]
  61.             control_field = struct.unpack('B', data[17:18])[0]
  62.             length_field =  struct.unpack('B', data[18:19])[0]
  63.            
  64.             if (address_field >> 2) & 0x1F == 3: # GSM SMS
  65.                 if (control_field & 0x01) == 0x00:  # frame type == information frame
  66.                     # caculate segments data length
  67.                     seg_len = (length_field >> 2) & 0x3F
  68.                     # if there are more segments
  69.                     has_segments = ((length_field >> 1) & 0x01 == 0x1)
  70.                     # caculate segments sequence
  71.                     seq = (control_field >> 1) & 0x07
  72.                    
  73.                     gsm_sms_segs += data[19:19+seg_len]
  74.                    
  75.                     # reassemble all segments when handling the last packet
  76.                     if has_segments == False:
  77.                        
  78.                         gsm_sms = gsm_sms_segs
  79.                         gsm_sms_segs = ""
  80.                        
  81.                         to_number = ""
  82.                         from_number = ""
  83.                         to_number_len = 0
  84.                         from_number_len = 0
  85.                         is_sms_submit = False
  86.                         is_sms_deliver = False
  87.                         has_tpudhi = False
  88.                         has_tpvpf = False
  89.                         is_mms = False
  90.                        
  91.                         if (len(gsm_sms) > 10 and ord(gsm_sms[0:1]) & 0x0F == 0x09) and (ord(gsm_sms[1:2]) == 0x01) and (ord(gsm_sms[2:3]) > 0x10): # SMS Message
  92.                             try:
  93.                                 print gsm_sms.encode('hex')
  94.                                 # determinate if this is uplink message aka MS to Network
  95.                                 is_uplink = (ord(gsm_sms[3:4]) == 0x00)
  96.                                 print ("Type: SUBMIT" if is_uplink else "Type: DELIVER")
  97.                                
  98.                                 if is_uplink:
  99.                                     to_number_len = struct.unpack('B', gsm_sms[6:7])[0] - 1
  100.                                     to_number = gsm_sms[8:8+to_number_len]
  101.                                     to_number = covert_cellphone_num(to_number)
  102.                                    
  103.                                     # check if this is SMS-SUBMIT
  104.                                     sms_submit = struct.unpack('B', gsm_sms[7+to_number_len+2:7+to_number_len+2+1])[0]
  105.                                     if sms_submit & 0x03 == 0x01:
  106.                                         is_sms_submit = True
  107.                                         # check if TP UD includes a extra header
  108.                                         has_tpudhi = ((struct.unpack('B', gsm_sms[7+to_number_len+2:7+to_number_len+2+1])[0] & 0x40) == 0x40)
  109.                                         has_tpvpf = ((struct.unpack('B', gsm_sms[7+to_number_len+2:7+to_number_len+2+1])[0] >> 3 & 0x02) == 0x02)
  110.                                         from_number_len = struct.unpack('B', gsm_sms[8+to_number_len+3:8+to_number_len+3+1])[0]
  111.                                         from_number_len = (from_number_len / 2) + (from_number_len % 2)
  112.                                         from_number = gsm_sms[8+to_number_len+3+2:8+to_number_len+3+2+from_number_len]
  113.                                         from_number = covert_cellphone_num(from_number)
  114.                                        
  115.                                         print "From: ",
  116.                                         #print from_number.encode('hex')
  117.                                         print from_number
  118.                                        
  119.                                         print "To: ",
  120.                                         #print to_number.encode('hex')
  121.                                         print to_number
  122.                                
  123.                                 else:
  124.                                     to_number_len = struct.unpack('B', gsm_sms[5:6])[0] - 1
  125.                                     to_number = gsm_sms[7:7+to_number_len]
  126.                                     to_number = covert_cellphone_num(to_number)
  127.                                    
  128.                                     # check if this is SMS-DELIVER
  129.                                     sms_deliver = struct.unpack('B', gsm_sms[7+to_number_len+2:7+to_number_len+2+1])[0]
  130.                                     if sms_deliver & 0x03 == 0x0:
  131.                                         is_sms_deliver = True
  132.                                         # check if TP UD includes a extra header
  133.                                         has_tpudhi = ((struct.unpack('B', gsm_sms[7+to_number_len+2:7+to_number_len+2+1])[0] & 0x40) == 0x40)
  134.                                        
  135.                                         from_number_len = struct.unpack('B', gsm_sms[7+to_number_len+3:7+to_number_len+3+1])[0]
  136.                                         from_number_len = (from_number_len / 2) + (from_number_len % 2)
  137.                                         from_number = gsm_sms[7+to_number_len+3+2:7+to_number_len+3+2+from_number_len]
  138.                                         from_number = covert_cellphone_num(from_number)
  139.                                        
  140.                                         print "From: ",
  141.                                         #print from_number.encode('hex')
  142.                                         print from_number
  143.                                        
  144.                                         print "To: ",
  145.                                         #print to_number.encode('hex')
  146.                                         print to_number
  147.                                
  148.                                 if is_sms_deliver:
  149.                                     try:
  150.                                         # if there is additional header, skip it
  151.                                         header_len = 0
  152.                                         if has_tpudhi:
  153.                                             header_len = struct.unpack('B', gsm_sms[7+to_number_len+3+2+from_number_len+10:7+to_number_len+3+2+from_number_len+10+1])[0]
  154.                                        
  155.                                         mms = struct.unpack('B', gsm_sms[7+to_number_len+3+2+from_number_len+1:7+to_number_len+3+2+from_number_len+1+1])[0]
  156.                                         if ((mms >> 2) & 0x03) == 0x01:
  157.                                             is_mms = True
  158.                                        
  159.                                         if header_len == 0:
  160.                                             sms = gsm_sms[7+to_number_len+3+2+from_number_len + 10:]
  161.                                         else:
  162.                                             sms = gsm_sms[7+to_number_len+3+2+from_number_len + 10 + header_len + 1:]
  163.                                         #print sms.encode('hex')
  164.                                        
  165.                                         # adjust string from big-endian to little-endian
  166.                                         #sms_len = (len(sms) / 2)
  167.                                         #sms = struct.unpack((">" + "H" * sms_len), sms)
  168.                                         #sms = struct.pack("<" + ("H" * sms_len), *sms)
  169.                                         #print sms.encode('hex')
  170.                                        
  171.                                         #SMS is using utf-16 encode
  172.                                         if not is_mms:
  173.                                             print sms.decode('UTF-16BE')
  174.                                             #print "INSERT INTO sms_data(sms_to, sms_from, sms_message) VALUES('%s', '%s', '%s')" % (to_number.encode('utf-8'), from_number.encode('utf-8'), sms.decode('UTF-16BE').encode('utf-8'))
  175.                                             mysql.insert("INSERT INTO sms_data(sms_to, sms_from, sms_message, type) VALUES('%s', '%s', '%s', b'0')" % (to_number.encode('utf-8'), from_number.encode('utf-8'), sms.decode('UTF-16BE').encode('utf-8')))
  176.                                         else:
  177.                                             print "This is a MMS message."
  178.                                
  179.                                 except:
  180.                                     print "can't decode the message"
  181.                                
  182.                                 elif is_sms_submit:
  183.                                     try:
  184.                                         # if there is additional header, skip it
  185.                                         header_len = 0
  186.                                         # looks like uplink sms doesn't have a TP service centre time stamp
  187.                                         if has_tpudhi:
  188.                                             header_len = struct.unpack('B', gsm_sms[8+to_number_len+3+2+from_number_len+3:8+to_number_len+3+2+from_number_len+3+1])[0]
  189.                                        
  190.                                         mms = struct.unpack('B', gsm_sms[8+to_number_len+3+2+from_number_len+1:8+to_number_len+3+2+from_number_len+1+1])[0]
  191.                                         if ((mms >> 2) & 0x03) == 0x01:
  192.                                             is_mms = True
  193.                                        
  194.                                         if has_tpvpf:
  195.                                             if header_len == 0:
  196.                                                 sms = gsm_sms[8+to_number_len+3+2+from_number_len + 3 + 1:]
  197.                                             else:
  198.                                                 sms = gsm_sms[8+to_number_len+3+2+from_number_len + 3 + header_len + 1 + 1:]
  199.                                         else:
  200.                                             if header_len == 0:
  201.                                                 sms = gsm_sms[8+to_number_len+3+2+from_number_len + 3:]
  202.                                             else:
  203.                                                 sms = gsm_sms[8+to_number_len+3+2+from_number_len + 3 + header_len + 1:]
  204.                                         #print sms.encode('hex')
  205.                                        
  206.                                         # adjust string from big-endian to little-endian
  207.                                         #sms_len = (len(sms) / 2)
  208.                                         #sms = struct.unpack((">" + "H" * sms_len), sms)
  209.                                         #sms = struct.pack("<" + ("H" * sms_len), *sms)
  210.                                         #print sms.encode('hex')
  211.                                        
  212.                                         #SMS is using utf-16 encode
  213.                                         if not is_mms:
  214.                                             print sms.decode('UTF-16BE')
  215.                                             mysql.insert("INSERT INTO sms_data(sms_to, sms_from, sms_message, type) VALUES('%s', '%s', '%s', b'1')" % (to_number.encode('utf-8'), from_number.encode('utf-8'), sms.decode('UTF-16BE').encode('utf-8')))
  216.                                 else:
  217.                                     print "This is a MMS message."
  218.                                     except:
  219.                                         print "can't decode the message"
  220.                                             else:
  221.                                         print "this is a sms status report, no more message"
  222.                                             except:
  223.                                                 print "unexpected packets format."
  224. if __name__ == '__main__':
  225.    
  226.     q = Queue.Queue()
  227.    
  228.     t = threading.Thread(target=handle_message, name="handle_message_thread", kwargs={'messages':q})
  229.     t.daemon = True
  230.     t.start()
  231.    
  232.     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  233.     s.bind(('0.0.0.0', 4729))
  234.     while True:
  235.         data, addr = s.recvfrom(2048)
  236.         #print data.encode('hex')
  237.         q.put(data)
  238.    
  239.     s.close()
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top