Advertisement
Guest User

Untitled

a guest
Jun 5th, 2017
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.35 KB | None | 0 0
  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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement