test.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import socket
  2. import time
  3. def replay_full_session():
  4. """完整回放新抓包中的所有通信(保持顺序和时间间隔)"""
  5. HOST = "47.108.151.236"
  6. PORT = 211
  7. # 从新抓包中提取的所有客户端发送的包(按时间顺序)
  8. packets = [
  9. # 14:23:27.392 - 握手
  10. bytes.fromhex(
  11. "04 da 00 00 54 00 00 00 08 00 00 00 26 00 00 00"
  12. "7b 00 43 00 34 00 35 00 46 00 44 00 33 00 33 00"
  13. "43 00 2d 00 37 00 39 00 30 00 46 00 2d 00 34 00"
  14. "34 00 45 00 41 00 2d 00 42 00 33 00 41 00 44 00"
  15. "2d 00 34 00 30 00 30 00 36 00 41 00 44 00 35 00"
  16. "31 00 36 00 38 00 37 00 37 00 7d 00"
  17. ),
  18. # 14:23:27.641 - id02
  19. bytes.fromhex(
  20. "03 da 00 00 18 00 00 00 03 00 00 00 00 00 00 00"
  21. "08 00 00 00 04 00 00 00 69 00 64 00 30 00 32 00"
  22. ),
  23. # 14:23:27.760 - 复杂联查
  24. bytes.fromhex(
  25. "02 da 00 00 72 03 00 00 03 00 00 00 00 00 00 00"
  26. "03 00 00 00 2e 01 00 00 03 00 00 00 01 00 00 00"
  27. "0b 00 00 00 ff ff 03 00 00 00 02 00 00 00 03 00"
  28. "00 00 00 00 00 08 40 00 00 9a 01 00 00 73 00 65"
  29. "00 6c 00 65 00 63 00 74 00 20 00 64 00 2e 00 6d"
  30. "00 64 00 6d 00 63 00 2c 00 62 00 2e 00 67 00 6b"
  31. "00 78 00 6d 00 2c 00 62 00 2e 00 6b 00 61 00 68"
  32. "00 61 00 6f 00 2c 00 63 00 2e 00 6e 00 61 00 6d"
  33. "00 65 00 2c 00 63 00 2e 00 6b 00 61 00 68 00 61"
  34. "00 6f 00 20 00 61 00 73 00 20 00 79 00 67 00 6b"
  35. "00 68 00 2c 00 61 00 2e 00 63 00 63 00 79 00 69"
  36. "00 64 00 2c 00 61 00 2e 00 64 00 6a 00 69 00 64"
  37. "00 2c 00 61 00 2e 00 73 00 68 00 72 00 2c 00 61"
  38. "00 2e 00 62 00 65 00 69 00 7a 00 68 00 75 00 2c"
  39. "00 61 00 2e 00 64 00 6a 00 6c 00 78 00 2c 00 61"
  40. "00 2e 00 72 00 69 00 71 00 69 00 2c 00 61 00 2e"
  41. "00 7a 00 73 00 6c 00 2c 00 61 00 2e 00 7a 00 6a"
  42. "00 65 00 2c 00 61 00 2e 00 77 00 66 00 6b 00 2c"
  43. "00 61 00 2e 00 7a 00 6b 00 6a 00 65 00 2c 00 61"
  44. "00 2e 00 73 00 72 00 2c 00 61 00 2e 00 63 00 7a"
  45. "00 6b 00 6a 00 73 00 2c 00 61 00 2e 00 64 00 78"
  46. "00 69 00 64 00 2c 00 61 00 2e 00 64 00 6a 00 6c"
  47. "00 78 00 2c 00 61 00 2e 00 6b 00 6d 00 6d 00 63"
  48. "00 20 00 66 00 72 00 6f 00 6d 00 20 00 79 00 77"
  49. "00 20 00 61 00 20 00 6a 00 6f 00 69 00 6e 00 20"
  50. "00 67 00 75 00 6b 00 65 00 20 00 62 00 20 00 6f"
  51. "00 6e 00 20 00 61 00 2e 00 64 00 78 00 69 00 64"
  52. "00 3d 00 62 00 2e 00 6b 00 61 00 68 00 61 00 6f"
  53. "00 20 00 6a 00 6f 00 69 00 6e 00 20 00 79 00 75"
  54. "00 61 00 6e 00 67 00 6f 00 6e 00 67 00 20 00 63"
  55. "00 20 00 6f 00 6e 00 20 00 61 00 2e 00 79 00 77"
  56. "00 79 00 69 00 64 00 3d 00 63 00 2e 00 6b 00 61"
  57. "00 68 00 61 00 6f 00 20 00 6a 00 6f 00 69 00 6e"
  58. "00 20 00 62 00 75 00 6d 00 65 00 6e 00 20 00 64"
  59. "00 20 00 6f 00 6e 00 20 00 72 00 69 00 67 00 68"
  60. "00 74 00 28 00 61 00 2e 00 64 00 6a 00 69 00 64"
  61. "00 2c 00 31 00 29 00 3d 00 64 00 2e 00 62 00 75"
  62. "00 6d 00 65 00 6e 00 69 00 64 00 20 00 77 00 68"
  63. "00 65 00 72 00 65 00 20 00 73 00 75 00 62 00 73"
  64. "00 74 00 72 00 69 00 6e 00 67 00 28 00 61 00 2e"
  65. "00 64 00 6a 00 69 00 64 00 2c 00 31 00 30 00 2c"
  66. "00 31 00 29 00 3d 00 27 00 4c 00 27 00 20 00 61"
  67. "00 6e 00 64 00 20 00 61 00 2e 00 72 00 69 00 71"
  68. "00 69 00 20 00 62 00 65 00 74 00 77 00 65 00 65"
  69. "00 6e 00 20 00 27 00 32 00 30 00 32 00 36 00 2d"
  70. "00 30 00 36 00 2d 00 30 00 38 00 27 00 20 00 61"
  71. "00 6e 00 64 00 20 00 27 00 32 00 30 00 32 00 36"
  72. "00 2d 00 30 00 36 00 2d 00 30 00 38 00 27 00 20"
  73. "00 61 00 6e 00 64 00 20 00 72 00 69 00 67 00 68"
  74. "00 74 00 28 00 61 00 2e 00 64 00 6a 00 69 00 64"
  75. "00 2c 00 31 00 29 00 3d 00 27 00 41 00 27 00 20"
  76. "00 6f 00 72 00 64 00 65 00 72 00 20 00 62 00 79"
  77. "00 20 00 61 00 2e 00 72 00 69 00 71 00 69 00 20"
  78. "00 64 00 65 00 73 00 63 00 2c 00 61 00 2e 00 64"
  79. "00 6a 00 69 00 64 00 20 00 64 00 65 00 73 00 63"
  80. "00 03 00 00 00 63 00 00 00"
  81. ),
  82. # 14:23:29.643 - yuangang 查询
  83. bytes.fromhex(
  84. "02 da 00 00 b2 00 00 00 03 00 00 00 00 00 00 00"
  85. "03 00 00 00 2e 01 00 00 03 00 00 00 01 00 00 00"
  86. "0b 00 00 00 ff ff 03 00 00 00 02 00 00 00 03 00"
  87. "00 00 00 00 00 08 00 00 00 3a 00 00 00 73 00 65"
  88. "00 6c 00 65 00 63 00 74 00 20 00 64 00 69 00 73"
  89. "00 74 00 69 00 6e 00 63 00 74 00 20 00 6e 00 61"
  90. "00 6d 00 65 00 20 00 66 00 72 00 6f 00 6d 00 20"
  91. "00 79 00 75 00 61 00 6e 00 67 00 6f 00 6e 00 67"
  92. "00 20 00 77 00 68 00 65 00 72 00 65 00 20 00 79"
  93. "00 78 00 62 00 6a 00 3d 00 30 00 20 00 6f 00 72"
  94. "00 64 00 65 00 72 00 20 00 62 00 79 00 20 00 31"
  95. "00 03 00 00 00 63 00 00 00"
  96. ),
  97. # 14:23:29.871 - bumen 查询
  98. bytes.fromhex(
  99. "02 da 00 00 80 00 00 00 03 00 00 00 00 00 00 00"
  100. "03 00 00 00 2e 01 00 00 03 00 00 00 01 00 00 00"
  101. "0b 00 00 00 ff ff 03 00 00 00 02 00 00 00 03 00"
  102. "00 00 00 00 00 08 40 00 00 21 00 00 00 73 00 65"
  103. "00 6c 00 65 00 63 00 74 00 20 00 6d 00 64 00 6d"
  104. "00 63 00 20 00 66 00 72 00 6f 00 6d 00 20 00 62"
  105. "00 75 00 6d 00 65 00 6e 00 20 00 6f 00 72 00 64"
  106. "00 65 00 72 00 20 00 62 00 79 00 20 00 31 00 03"
  107. "00 00 00 63 00 00 00"
  108. ),
  109. # 14:23:30.112 - pinpai 查询
  110. bytes.fromhex(
  111. "02 da 00 00 bc 00 00 00 03 00 00 00 00 00 00 00"
  112. "03 00 00 00 2e 01 00 00 03 00 00 00 01 00 00 00"
  113. "0b 00 00 00 ff ff 03 00 00 00 02 00 00 00 03 00"
  114. "00 00 00 00 00 08 40 00 00 3f 00 00 00 73 00 65"
  115. "00 6c 00 65 00 63 00 74 00 20 00 64 00 69 00 73"
  116. "00 74 00 69 00 6e 00 63 00 74 00 20 00 70 00 69"
  117. "00 6e 00 70 00 61 00 69 00 20 00 66 00 72 00 6f"
  118. "00 6d 00 20 00 71 00 69 00 61 00 6e 00 7a 00 68"
  119. "00 75 00 69 00 5f 00 6a 00 70 00 20 00 77 00 68"
  120. "00 65 00 72 00 65 00 20 00 79 00 78 00 62 00 6a"
  121. "00 3d 00 30 00 20 00 6f 00 72 00 64 00 65 00 72"
  122. "00 20 00 62 00 79 00 20 00 31 00 03 00 00 00 63"
  123. "00 00 00"
  124. ),
  125. ]
  126. # 抓包中的时间间隔(秒)
  127. intervals = [
  128. 0, # 第一个包
  129. 0.249, # 27.392 -> 27.641
  130. 0.119, # 27.641 -> 27.760
  131. 1.883, # 27.760 -> 29.643
  132. 0.228, # 29.643 -> 29.871
  133. 0.241, # 29.871 -> 30.112
  134. ]
  135. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  136. sock.settimeout(30)
  137. all_responses = []
  138. try:
  139. sock.connect((HOST, PORT))
  140. print("[+] 连接成功")
  141. for i, packet in enumerate(packets):
  142. print(f"\n[包 {i+1}] 发送 {len(packet)} 字节")
  143. sock.send(packet)
  144. # 接收响应
  145. try:
  146. # 对于查询包,可能需要接收更多数据
  147. if i >= 2: # 查询包
  148. total = b''
  149. sock.settimeout(10)
  150. while True:
  151. try:
  152. chunk = sock.recv(65536)
  153. if not chunk:
  154. break
  155. total += chunk
  156. print(f" 收到 {len(chunk)} 字节,累计 {len(total)}")
  157. if len(chunk) < 65536:
  158. time.sleep(0.5)
  159. break
  160. except socket.timeout:
  161. break
  162. if total:
  163. all_responses.append((i, total))
  164. print(f" [✓] 总响应: {len(total)} 字节")
  165. # 保存响应
  166. with open(f"response_{i+1}.bin", "wb") as f:
  167. f.write(total)
  168. parse_response(total, i+1)
  169. else:
  170. # 握手和id02的响应
  171. resp = sock.recv(1024)
  172. print(f" 响应: {resp.hex()}")
  173. all_responses.append((i, resp))
  174. except socket.timeout:
  175. print(f" 响应超时")
  176. # 按抓包时间间隔等待
  177. if i < len(intervals) - 1:
  178. time.sleep(intervals[i + 1])
  179. print("\n" + "="*60)
  180. print("所有响应接收完成")
  181. print("="*60)
  182. except Exception as e:
  183. print(f"错误: {e}")
  184. import traceback
  185. traceback.print_exc()
  186. finally:
  187. sock.close()
  188. def parse_response(data, packet_num):
  189. """解析响应数据"""
  190. print(f"\n--- 解析包 {packet_num} 的响应 ---")
  191. if len(data) < 8:
  192. return
  193. # 检查响应命令
  194. cmd = data[0:2]
  195. length = int.from_bytes(data[4:8], 'little')
  196. print(f"命令: {cmd.hex()}, 长度: {length}")
  197. # 查找 0x03 开头的字符串
  198. results = []
  199. i = 0
  200. while i < len(data) - 2:
  201. if data[i] == 0x03:
  202. str_len = data[i + 1]
  203. if i + 2 + str_len <= len(data):
  204. str_data = data[i + 2:i + 2 + str_len]
  205. try:
  206. # 尝试 GBK
  207. text = str_data.decode('gbk', errors='ignore')
  208. if text.strip() and len(text) > 1:
  209. results.append(text)
  210. except:
  211. try:
  212. text = str_data.decode('utf-8', errors='ignore')
  213. if text.strip() and len(text) > 1:
  214. results.append(text)
  215. except:
  216. pass
  217. i += 2 + str_len
  218. else:
  219. i += 1
  220. else:
  221. i += 1
  222. if results:
  223. print(f"\n找到 {len(results)} 条记录:")
  224. for i, text in enumerate(results[:30], 1):
  225. print(f" {i}. {text}")
  226. with open(f"parsed_{packet_num}.txt", "w", encoding="utf-8") as f:
  227. f.write('\n'.join(results))
  228. else:
  229. # 尝试 UTF-16LE
  230. try:
  231. text = data.decode('utf-16le', errors='ignore')
  232. lines = [line.strip() for line in text.split('\x00') if len(line.strip()) > 2]
  233. if lines:
  234. print(f"\nUTF-16LE 解码找到 {len(lines)} 行:")
  235. for i, line in enumerate(lines[:30], 1):
  236. print(f" {i}. {line[:100]}")
  237. with open(f"parsed_utf16_{packet_num}.txt", "w", encoding="utf-8") as f:
  238. f.write('\n'.join(lines))
  239. except:
  240. pass
  241. if __name__ == "__main__":
  242. replay_full_session()