ip_change.py 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040
  1. import ctypes
  2. from copy import deepcopy
  3. from datetime import datetime
  4. from random import choice, randint
  5. import pytz
  6. import requests
  7. from apscheduler.schedulers.blocking import BlockingScheduler
  8. URL = 'http://192.168.88.1/jsproxy'
  9. HEADERS = {
  10. 'Accept-Language': '',
  11. 'Content-Type': 'msg',
  12. 'Cookie': 'username=root',
  13. }
  14. def int_overflow(val) -> int:
  15. maxint = 2147483647
  16. if not -maxint - 1 <= val <= maxint:
  17. val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1
  18. return val & 0xFFFFFFFF
  19. def unsigned_right_shift(n, i) -> int:
  20. """实现无符号右移"""
  21. if n < 0:
  22. n = ctypes.c_uint32(n).value
  23. if i < 0:
  24. return -int_overflow(n << abs(i))
  25. return int_overflow(n >> i)
  26. class Buffer(object):
  27. def __init__(self) -> None:
  28. self.MASK_FTYPE = 0xf8000000
  29. self.FT_BOOL = int_overflow(0 << 27)
  30. self.FT_U32 = int_overflow(1 << 27)
  31. self.FT_U64 = int_overflow(2 << 27)
  32. self.FT_ADDR6 = int_overflow(3 << 27)
  33. self.FT_STRING = int_overflow(4 << 27)
  34. self.FT_MESSAGE = int_overflow(5 << 27)
  35. self.FT_RAW = int_overflow(6 << 27)
  36. self.FT_BOOL_ARRAY = int_overflow(16 << 27)
  37. self.FT_U32_ARRAY = int_overflow(17 << 27)
  38. self.FT_U64_ARRAY = int_overflow(18 << 27)
  39. self.FT_ADDR6_ARRAY = int_overflow(19 << 27)
  40. self.FT_STRING_ARRAY = int_overflow(20 << 27)
  41. self.FT_MESSAGE_ARRAY = int_overflow(21 << 27)
  42. self.FT_RAW_ARRAY = int_overflow(22 << 27)
  43. self.FS_SHORT = int_overflow(1 << 24)
  44. self.arr = [0] * 64 * 1024
  45. self.pos = 0
  46. def msg2buffer(self, msg):
  47. self.arr[self.pos] = 0x4d
  48. self.pos += 1
  49. self.arr[self.pos] = 0x32
  50. self.pos += 1
  51. for r in msg:
  52. pfx = r[0]
  53. if pfx == '_':
  54. continue
  55. val = msg[r]
  56. if pfx == 'b':
  57. self.write_id(self.FT_BOOL | (
  58. self.FS_SHORT if val else 0), r)
  59. elif pfx == 'u':
  60. val = val if val is not None else -1
  61. if 0 <= val < 256:
  62. self.write_id(self.FT_U32 | self.FS_SHORT, r)
  63. self.arr[self.pos] = val
  64. self.pos += 1
  65. else:
  66. self.write_id(self.FT_U32, r)
  67. self.write_32(val)
  68. elif pfx == 'q':
  69. self.write_id(self.FT_U64, r)
  70. self.write_64(val)
  71. elif pfx == 'a':
  72. self.write_id(self.FT_ADDR6, r)
  73. for i in range(16):
  74. self.arr[self.pos] = val[i]
  75. self.pos += 1
  76. elif pfx == 's':
  77. if len(val) < 256:
  78. self.write_id(self.FT_STRING | self.FS_SHORT, r)
  79. self.arr[self.pos] = len(val)
  80. self.pos += 1
  81. else:
  82. self.write_id(self.FT_STRING, r)
  83. self.write_16(len(val))
  84. for i in range(len(val)):
  85. self.arr[self.pos] = ord(val[i])
  86. self.pos += 1
  87. elif pfx == 'r':
  88. if len(val) < 256:
  89. self.write_id(self.FT_RAW | self.FS_SHORT, r)
  90. self.arr[self.pos] = len(val)
  91. self.pos += 1
  92. else:
  93. self.write_id(self.FT_RAW, r)
  94. self.write_16(len(val))
  95. for i in range(len(val)):
  96. self.arr[self.pos] = val[i]
  97. self.pos += 1
  98. elif pfx == 'm':
  99. x = self.msg2buffer(val)
  100. if len(x) < 256:
  101. self.write_id(self.FT_MESSAGE | self.FS_SHORT, r)
  102. self.arr[self.pos] = len(x)
  103. self.pos += 1
  104. else:
  105. self.write_id(self.FT_MESSAGE, r)
  106. self.write_16(len(x))
  107. for item in x[::-1]:
  108. self.arr[self.pos] = item
  109. self.pos += len(x)
  110. elif pfx == 'B':
  111. self.write_id(self.FT_BOOL_ARRAY, r)
  112. self.write_16(len(val))
  113. for i in range(len(val)):
  114. self.arr[self.pos] = val[i]
  115. self.pos += 1
  116. elif pfx == 'U':
  117. self.write_id(self.FT_U32_ARRAY, r)
  118. self.write_16(len(val))
  119. for i in range(len(val)):
  120. self.write_32(val[i])
  121. elif pfx == 'Q':
  122. self.write_id(self.FT_U64_ARRAY, r)
  123. self.write_16(len(val))
  124. for i in range(len(val)):
  125. self.write_64(val[i])
  126. elif pfx == 'A':
  127. self.write_id(self.FT_ADDR6_ARRAY, r)
  128. self.write_16(len(val))
  129. for i in range(len(val)):
  130. for k in range(16):
  131. self.arr[self.pos] = val[i][k]
  132. self.pos += 1
  133. elif pfx == 'S':
  134. self.write_id(self.FT_STRING_ARRAY, r)
  135. self.write_16(len(val))
  136. for i in range(len(val)):
  137. self.write_16(len(val[i]))
  138. for k in range(len(val[i])):
  139. self.arr[self.pos] = ord(val[i][k])
  140. self.pos += 1
  141. elif pfx == 'R':
  142. self.write_id(self.FT_RAW_ARRAY, r)
  143. self.write_16(len(val))
  144. for i in range(len(val)):
  145. self.write_16(len(val[i]))
  146. for k in range(len(val[i])):
  147. self.arr[self.pos] = val[i][k]
  148. self.pos += 1
  149. elif pfx == 'M':
  150. self.write_id(self.FT_MESSAGE_ARRAY, r)
  151. self.write_16(len(val))
  152. for i in range(len(val)):
  153. x = self.msg2buffer(val[i])
  154. self.write_16(len(x))
  155. for item in x[::-1]:
  156. self.arr[self.pos] = item
  157. self.pos += len(x)
  158. return self.arr[:self.pos]
  159. def buffer2msg(self, arr, offset: int = 0):
  160. self.arr, self.pos, ret = arr, 2, dict()
  161. if self.arr[0] != 0x4d or self.arr[1] != 0x32:
  162. return ret
  163. while self.pos < len(self.arr):
  164. _id = self.read_32()
  165. if _id & self.MASK_FTYPE == self.FT_BOOL:
  166. ret['b' + self.idnum2hex(_id)] = 1 if (_id & self.FS_SHORT) else 0
  167. elif _id & self.MASK_FTYPE == self.FT_U32:
  168. if _id & self.FS_SHORT:
  169. ret['u' + self.idnum2hex(_id)] = self.arr[self.pos]
  170. self.pos += 1
  171. else:
  172. ret['u' + self.idnum2hex(_id)
  173. ] = self.int2num(self.read_32())
  174. elif _id & self.MASK_FTYPE == self.FT_U64:
  175. ret['q' + self.idnum2hex(_id)] = self.read_64()
  176. elif _id & self.MASK_FTYPE == self.FT_ADDR6:
  177. a = []
  178. for i in range(16):
  179. a[i] = self.arr[self.pos]
  180. self.pos += 1
  181. ret['a' + self.idnum2hex(_id)] = a
  182. elif _id & self.MASK_FTYPE == self.FT_STRING:
  183. length = self.arr[self.pos]
  184. self.pos += 1
  185. if not (_id & self.FS_SHORT):
  186. length |= self.arr[self.pos] << 8
  187. self.pos += 1
  188. s = ''
  189. for i in range(length):
  190. s = s + chr(self.arr[self.pos])
  191. self.pos += 1
  192. ret['s' + self.idnum2hex(_id)] = s
  193. elif _id & self.MASK_FTYPE == self.FT_RAW:
  194. length = self.arr[self.pos]
  195. self.pos += 1
  196. if not (_id & self.FS_SHORT):
  197. length |= self.arr[self.pos] << 8
  198. self.pos += 1
  199. a = [0] * length
  200. for i in range(length):
  201. a[i] = self.arr[self.pos]
  202. self.pos += 1
  203. ret['r' + self.idnum2hex(_id)] = a
  204. elif _id & self.MASK_FTYPE == self.FT_MESSAGE:
  205. length = self.arr[self.pos]
  206. self.pos += 1
  207. if not (_id & self.FS_SHORT):
  208. length |= self.arr[self.pos] << 8
  209. self.pos += 1
  210. ret['m' + self.idnum2hex(_id)] = self.buffer2msg(
  211. self.arr[offset + self.pos:offset + self.pos + length])
  212. self.pos += length
  213. offset += self.pos
  214. elif _id & self.MASK_FTYPE == self.FT_BOOL_ARRAY:
  215. length = self.read_16()
  216. a = [0] * length
  217. for i in range(length):
  218. a[i] = not (not self.arr[self.pos])
  219. self.pos += 1
  220. ret['B' + self.idnum2hex(_id)] = a
  221. elif _id & self.MASK_FTYPE == self.FT_U32_ARRAY:
  222. length = self.read_16()
  223. a = [0] * length
  224. for i in range(length):
  225. a[i] = self.int2num(self.read_32())
  226. ret['U' + self.idnum2hex(_id)] = a
  227. elif _id & self.MASK_FTYPE == self.FT_U64_ARRAY:
  228. length = self.read_16()
  229. a = [0] * length
  230. for i in range(length):
  231. a[i] = self.read_64()
  232. ret['Q' + self.idnum2hex(_id)] = a
  233. elif _id & self.MASK_FTYPE == self.FT_ADDR6_ARRAY:
  234. length = self.read_16()
  235. a = [0] * length
  236. for i in range(length):
  237. x = [0] * 16
  238. for k in range(16):
  239. x[k] = self.arr[self.pos]
  240. self.pos += 1
  241. a[i] = x
  242. ret['A' + self.idnum2hex(_id)] = a
  243. elif _id & self.MASK_FTYPE == self.FT_STRING_ARRAY:
  244. length = self.read_16()
  245. a = [0] * length
  246. for i in range(length):
  247. x = ''
  248. x_len = self.read_16()
  249. for k in range(x_len):
  250. x = x + chr(self.arr[self.pos])
  251. self.pos += 1
  252. a[i] = x
  253. ret['S' + self.idnum2hex(_id)] = a
  254. elif _id & self.MASK_FTYPE == self.FT_RAW_ARRAY:
  255. length = self.read_16()
  256. a = [0] * length
  257. for i in range(length):
  258. x_len = self.read_16()
  259. x = [0] * x_len
  260. for k in range(x_len):
  261. x[k] = self.arr[self.pos]
  262. self.pos += 1
  263. a[i] = x
  264. ret['R' + self.idnum2hex(_id)] = a
  265. elif _id & self.MASK_FTYPE == self.FT_MESSAGE_ARRAY:
  266. length = self.read_16()
  267. a = [0] * length
  268. for i in range(length):
  269. x_len = self.read_16()
  270. a[i] = self.buffer2msg(self.arr[offset + self.pos:offset + self.pos + x_len], offset + self.pos)
  271. self.pos += x_len
  272. offset += self.pos
  273. ret['M' + self.idnum2hex(_id)] = a
  274. return ret
  275. def buffer2msgs(self, arr, offset: int = 0):
  276. ret, pos = [], 0
  277. while pos + 2 <= len(arr):
  278. length = (arr[pos] << 8) | arr[pos + 1]
  279. arr[pos] = 0x4d
  280. arr[pos + 1] = 0x32
  281. msg = self.buffer2msg(arr[:offset + pos + length], offset + pos)
  282. pos += length
  283. ret.append(msg)
  284. return ret
  285. def write_id(self, id_type, id_str):
  286. x = int(id_str[1:], 16)
  287. self.arr[self.pos] = x & 0xff
  288. self.pos += 1
  289. self.arr[self.pos] = (x >> 8) & 0xff
  290. self.pos += 1
  291. self.arr[self.pos] = (x >> 16) & 0xff
  292. self.pos += 1
  293. self.arr[self.pos] = (id_type >> 24) & 0xff
  294. self.pos += 1
  295. def write_16(self, val):
  296. self.arr[self.pos] = val & 0xff
  297. self.pos += 1
  298. self.arr[self.pos] = (val >> 8) & 0xff
  299. self.pos += 1
  300. def write_32(self, val):
  301. for i in range(4):
  302. self.arr[self.pos] = (val >> (i * 8)) & 0xff
  303. self.pos += 1
  304. def write_64(self, val):
  305. for i in range(4):
  306. self.arr[self.pos] = (val >> (i * 8)) & 0xff
  307. self.pos += 1
  308. temp = int(val / 4294967296)
  309. for i in range(4):
  310. self.arr[self.pos] = (temp >> (i * 8)) & 0xff
  311. self.pos += 1
  312. def num2hex(self, ccc):
  313. if ccc < 10:
  314. return chr(ccc + 48)
  315. return chr(ccc + 87)
  316. def idnum2hex(self, _id):
  317. ret = ''
  318. for i in range(6):
  319. x = (_id >> (20 - (i * 4))) & 0xf
  320. if len(ret) == 0 and not x:
  321. continue
  322. ret = ret + self.num2hex(x)
  323. if len(ret) == 0:
  324. ret = '0'
  325. return ret
  326. def read_16(self):
  327. ret = 0
  328. for i in range(2):
  329. ret |= int_overflow(self.arr[self.pos] << (i * 8))
  330. self.pos += 1
  331. return ret
  332. def read_32(self):
  333. ret = 0
  334. for i in range(4):
  335. ret |= int_overflow(self.arr[self.pos] << (i * 8))
  336. self.pos += 1
  337. return ret
  338. def read_64(self):
  339. ret = 0
  340. for i in range(4):
  341. ret |= int_overflow(self.arr[self.pos] << (i * 8))
  342. self.pos += 1
  343. temp = 0
  344. for i in range(4):
  345. temp |= int_overflow(self.arr[self.pos] << (i * 8))
  346. self.pos += 1
  347. return self.int2num(ret) + temp * 4294967296
  348. def int2num(self, v):
  349. return 0x100000000 + v if v < 0 else v
  350. class Curve(object):
  351. @classmethod
  352. def curve_a2u(cls, a):
  353. r = [0] * 32
  354. for i in range(32):
  355. r[i >> 1] |= a[31 - i] << (i & 1) * 8
  356. return r
  357. @classmethod
  358. def curve_u2a(cls, a):
  359. r = [0] * 32
  360. for i in range(32):
  361. r[31 - i] = (a[i >> 1] >> ((i & 1) * 8)) & 0xff
  362. return r
  363. @classmethod
  364. def byte2str(cls, b):
  365. b &= 0xff
  366. return chr(b if b else 256)
  367. @classmethod
  368. def word2str(cls, w):
  369. return cls.byte2str(w >> 24) + cls.byte2str(w >> 16) + cls.byte2str(w >> 8) + cls.byte2str(w)
  370. @classmethod
  371. def str2byte(cls, s, off):
  372. return s[off] & 0xff
  373. @classmethod
  374. def str2word(cls, s, off):
  375. return int_overflow(cls.str2byte(s, off) << 24) | int_overflow(cls.str2byte(s, off + 1) << 16) | int_overflow(
  376. cls.str2byte(s, off + 2) << 8) | int_overflow(cls.str2byte(s, off + 3))
  377. @classmethod
  378. def str2a(cls, s):
  379. res = []
  380. for i in range(len(s)):
  381. res.append(s[i] & 0xff)
  382. return res
  383. @classmethod
  384. def a2str(cls, a):
  385. x = []
  386. for i in range(len(a)):
  387. x.append(cls.byte2str(a[i]))
  388. return ''.join(x)
  389. @classmethod
  390. def c255lgetbit(cls, n, c):
  391. return (n[c >> 4] >> (c & 0xf)) & 1
  392. @classmethod
  393. def c255lzero(cls):
  394. return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  395. @classmethod
  396. def c255lone(cls):
  397. return [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  398. @classmethod
  399. def c255lbase(cls):
  400. return [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  401. @classmethod
  402. def c255lsqr8h(cls, a7, a6, a5, a4, a3, a2, a1, a0):
  403. r = [0] * 16
  404. v = a0 * a0
  405. r[0] = v & 0xffff
  406. v = (0 | int(v / 0x10000)) + 2 * a0 * a1
  407. r[1] = v & 0xffff
  408. v = (0 | int(v / 0x10000)) + 2 * a0 * a2 + a1 * a1
  409. r[2] = v & 0xffff
  410. v = (0 | int(v / 0x10000)) + 2 * a0 * a3 + 2 * a1 * a2
  411. r[3] = v & 0xffff
  412. v = (0 | int(v / 0x10000)) + 2 * a0 * a4 + 2 * a1 * a3 + a2 * a2
  413. r[4] = v & 0xffff
  414. v = (0 | int(v / 0x10000)) + 2 * a0 * a5 + 2 * a1 * a4 + 2 * a2 * a3
  415. r[5] = v & 0xffff
  416. v = (0 | int(v / 0x10000)) + 2 * a0 * a6 + \
  417. 2 * a1 * a5 + 2 * a2 * a4 + a3 * a3
  418. r[6] = v & 0xffff
  419. v = (0 | int(v / 0x10000)) + 2 * a0 * a7 + \
  420. 2 * a1 * a6 + 2 * a2 * a5 + 2 * a3 * a4
  421. r[7] = v & 0xffff
  422. v = (0 | int(v / 0x10000)) + 2 * a1 * a7 + \
  423. 2 * a2 * a6 + 2 * a3 * a5 + a4 * a4
  424. r[8] = v & 0xffff
  425. v = (0 | int(v / 0x10000)) + 2 * a2 * a7 + 2 * a3 * a6 + 2 * a4 * a5
  426. r[9] = v & 0xffff
  427. v = (0 | int(v / 0x10000)) + 2 * a3 * a7 + 2 * a4 * a6 + a5 * a5
  428. r[10] = v & 0xffff
  429. v = (0 | int(v / 0x10000)) + 2 * a4 * a7 + 2 * a5 * a6
  430. r[11] = v & 0xffff
  431. v = (0 | int(v / 0x10000)) + 2 * a5 * a7 + a6 * a6
  432. r[12] = v & 0xffff
  433. v = (0 | int(v / 0x10000)) + 2 * a6 * a7
  434. r[13] = v & 0xffff
  435. v = (0 | int(v / 0x10000)) + a7 * a7
  436. r[14] = v & 0xffff
  437. r[15] = 0 | int(v / 0x10000)
  438. return r
  439. @classmethod
  440. def c255lsqrmodp(cls, a):
  441. x = cls.c255lsqr8h(a[15], a[14], a[13], a[12],
  442. a[11], a[10], a[9], a[8])
  443. z = cls.c255lsqr8h(a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0])
  444. y = cls.c255lsqr8h(a[15] + a[7], a[14] + a[6], a[13] + a[5], a[12] +
  445. a[4], a[11] + a[3], a[10] + a[2], a[9] + a[1], a[8] + a[0])
  446. r = [0] * 16
  447. v = 0x800000 + z[0] + (y[8] - x[8] - z[8] + x[0] - 0x80) * 38
  448. r[0] = v & 0xffff
  449. for i in range(1, 8):
  450. v = 0x7fff80 + \
  451. unsigned_right_shift(
  452. v, 16) + z[i] + (y[i + 8] - x[i + 8] - z[i + 8] + x[i]) * 38
  453. r[i] = v & 0xffff
  454. for i in range(8, 15):
  455. v = 0x7fff80 + \
  456. unsigned_right_shift(
  457. v, 16) + z[i] + y[i - 8] - x[i - 8] - z[i - 8] + x[i] * 38
  458. r[i] = v & 0xffff
  459. r[15] = 0x7fff80 + \
  460. unsigned_right_shift(v, 16) + \
  461. z[15] + y[7] - x[7] - z[7] + x[15] * 38
  462. cls.c255lreduce(r)
  463. return r
  464. @classmethod
  465. def c255lmul8h(cls, a7, a6, a5, a4, a3, a2, a1, a0, b7, b6, b5, b4, b3, b2, b1, b0):
  466. r = [0] * 16
  467. v = a0 * b0
  468. r[0] = v & 0xffff
  469. v = (0 | int(v / 0x10000)) + a0 * b1 + a1 * b0
  470. r[1] = v & 0xffff
  471. v = (0 | int(v / 0x10000)) + a0 * b2 + a1 * b1 + a2 * b0
  472. r[2] = v & 0xffff
  473. v = (0 | int(v / 0x10000)) + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0
  474. r[3] = v & 0xffff
  475. v = (0 | int(v / 0x10000)) + a0 * b4 + \
  476. a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0
  477. r[4] = v & 0xffff
  478. v = (0 | int(v / 0x10000)) + a0 * b5 + a1 * \
  479. b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0
  480. r[5] = v & 0xffff
  481. v = (0 | int(v / 0x10000)) + a0 * b6 + a1 * b5 + \
  482. a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0
  483. r[6] = v & 0xffff
  484. v = (0 | int(v / 0x10000)) + a0 * b7 + a1 * b6 + a2 * \
  485. b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0
  486. r[7] = v & 0xffff
  487. v = (0 | int(v / 0x10000)) + a1 * b7 + a2 * b6 + \
  488. a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1
  489. r[8] = v & 0xffff
  490. v = (0 | int(v / 0x10000)) + a2 * b7 + a3 * \
  491. b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2
  492. r[9] = v & 0xffff
  493. v = (0 | int(v / 0x10000)) + a3 * b7 + \
  494. a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3
  495. r[10] = v & 0xffff
  496. v = (0 | int(v / 0x10000)) + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4
  497. r[11] = v & 0xffff
  498. v = (0 | int(v / 0x10000)) + a5 * b7 + a6 * b6 + a7 * b5
  499. r[12] = v & 0xffff
  500. v = (0 | int(v / 0x10000)) + a6 * b7 + a7 * b6
  501. r[13] = v & 0xffff
  502. v = (0 | int(v / 0x10000)) + a7 * b7
  503. r[14] = v & 0xffff
  504. r[15] = 0 | int(v / 0x10000)
  505. return r
  506. @classmethod
  507. def c255lmulmodp(cls, a, b):
  508. x = cls.c255lmul8h(a[15], a[14], a[13], a[12], a[11], a[10], a[9],
  509. a[8], b[15], b[14], b[13], b[12], b[11], b[10], b[9], b[8])
  510. z = cls.c255lmul8h(a[7], a[6], a[5], a[4], a[3], a[2], a[1],
  511. a[0], b[7], b[6], b[5], b[4], b[3], b[2], b[1], b[0])
  512. y = cls.c255lmul8h(a[15] + a[7], a[14] + a[6], a[13] + a[5], a[12] + a[4], a[11] + a[3], a[10] + a[2],
  513. a[9] + a[1], a[8] +
  514. a[0], b[15] + b[7], b[14] + b[6], b[13] + b[5], b[12] + b[4], b[11] + b[3], b[10] + b[2],
  515. b[9] + b[1], b[8] + b[0])
  516. r = [0] * 16
  517. v = 0x800000 + z[0] + (y[8] - x[8] - z[8] + x[0] - 0x80) * 38
  518. r[0] = v & 0xffff
  519. for i in range(1, 8):
  520. v = 0x7fff80 + \
  521. unsigned_right_shift(
  522. v, 16) + z[i] + (y[i + 8] - x[i + 8] - z[i + 8] + x[i]) * 38
  523. r[i] = v & 0xffff
  524. for i in range(8, 15):
  525. v = 0x7fff80 + \
  526. unsigned_right_shift(
  527. v, 16) + z[i] + y[i - 8] - x[i - 8] - z[i - 8] + x[i] * 38
  528. r[i] = v & 0xffff
  529. r[15] = 0x7fff80 + \
  530. unsigned_right_shift(v, 16) + \
  531. z[15] + y[7] - x[7] - z[7] + x[15] * 38
  532. cls.c255lreduce(r)
  533. return r
  534. @classmethod
  535. def c255lreduce(cls, a):
  536. v = a[15]
  537. a[15] = v & 0x7fff
  538. v = (0 | int(v / 0x8000)) * 19
  539. for i in range(15):
  540. v += a[i]
  541. a[i] = v & 0xffff
  542. v = unsigned_right_shift(v, 16)
  543. a[15] += v
  544. @classmethod
  545. def c255laddmodp(cls, a, b):
  546. r = [0] * 16
  547. v = ((0 | unsigned_right_shift(
  548. a[15], 15)) + (0 | unsigned_right_shift(b[15], 15))) * 19 + a[0] + b[0]
  549. r[0] = v & 0xffff
  550. for i in range(1, 15):
  551. v = unsigned_right_shift(v, 16) + a[i] + b[i]
  552. r[i] = v & 0xffff
  553. r[15] = unsigned_right_shift(
  554. v, 16) + (a[15] & 0x7fff) + (b[15] & 0x7fff)
  555. return r
  556. @classmethod
  557. def c255lsubmodp(cls, a, b):
  558. r = [0] * 16
  559. v = 0x80000 + ((0 | unsigned_right_shift(a[15], 15)) - (
  560. 0 | unsigned_right_shift(b[15], 15)) - 1) * 19 + a[0] - b[0]
  561. r[0] = v & 0xffff
  562. for i in range(1, 15):
  563. v = unsigned_right_shift(v, 16) + 0x7fff8 + a[i] - b[i]
  564. r[i] = v & 0xffff
  565. r[15] = unsigned_right_shift(
  566. v, 16) + 0x7ff8 + (a[15] & 0x7fff) - (b[15] & 0x7fff)
  567. return r
  568. @classmethod
  569. def c255linvmodp(cls, a):
  570. c, i = a, 249
  571. while i > 0:
  572. i -= 1
  573. a = cls.c255lsqrmodp(a)
  574. a = cls.c255lmulmodp(a, c)
  575. a = cls.c255lsqrmodp(a)
  576. a = cls.c255lsqrmodp(a)
  577. a = cls.c255lmulmodp(a, c)
  578. a = cls.c255lsqrmodp(a)
  579. a = cls.c255lsqrmodp(a)
  580. a = cls.c255lmulmodp(a, c)
  581. a = cls.c255lsqrmodp(a)
  582. a = cls.c255lmulmodp(a, c)
  583. return a
  584. @classmethod
  585. def c255lmulasmall(cls, a):
  586. m, r = 121665, [0] * 16
  587. v = a[0] * m
  588. r[0] = v & 0xffff
  589. for i in range(1, 15):
  590. v = (0 | int(v / 0x10000)) + a[i] * m
  591. r[i] = v & 0xffff
  592. r[15] = (0 | int(v / 0x10000)) + a[15] * m
  593. cls.c255lreduce(r)
  594. return r
  595. @classmethod
  596. def c255ldbl(cls, x, z):
  597. m = cls.c255lsqrmodp(cls.c255laddmodp(x, z))
  598. n = cls.c255lsqrmodp(cls.c255lsubmodp(x, z))
  599. o = cls.c255lsubmodp(m, n)
  600. x_2 = cls.c255lmulmodp(n, m)
  601. z_2 = cls.c255lmulmodp(cls.c255laddmodp(cls.c255lmulasmall(o), m), o)
  602. return [x_2, z_2]
  603. @classmethod
  604. def c255lsum(cls, x, z, x_p, z_p, x_1):
  605. p = cls.c255lmulmodp(cls.c255lsubmodp(
  606. x, z), cls.c255laddmodp(x_p, z_p))
  607. q = cls.c255lmulmodp(cls.c255laddmodp(
  608. x, z), cls.c255lsubmodp(x_p, z_p))
  609. x_3 = cls.c255lsqrmodp(cls.c255laddmodp(p, q))
  610. z_3 = cls.c255lmulmodp(cls.c255lsqrmodp(cls.c255lsubmodp(p, q)), x_1)
  611. return [x_3, z_3]
  612. @classmethod
  613. def curve25519_raw(cls, f, c):
  614. x_1 = c
  615. a = cls.c255ldbl(x_1, cls.c255lone())
  616. q = [deepcopy(x_1), cls.c255lone()]
  617. n = 255
  618. while cls.c255lgetbit(f, n) == 0:
  619. n -= 1
  620. if n < 0:
  621. return cls.c255lzero()
  622. n -= 1
  623. while n >= 0:
  624. b = cls.c255lgetbit(f, n)
  625. a_or_q = [[0] * 16, [0] * 16]
  626. cls.cond_copy(a_or_q[0], q[0], a[0], b)
  627. cls.cond_copy(a_or_q[1], q[1], a[1], b)
  628. r = cls.c255lsum(a[0], a[1], q[0], q[1], x_1)
  629. s = cls.c255ldbl(a_or_q[0], a_or_q[1])
  630. cls.cond_copy(q[0], s[0], r[0], b)
  631. cls.cond_copy(q[1], s[1], r[1], b)
  632. cls.cond_copy(a[0], r[0], s[0], b)
  633. cls.cond_copy(a[1], r[1], s[1], b)
  634. n -= 1
  635. q[1] = cls.c255linvmodp(q[1])
  636. q[0] = cls.c255lmulmodp(q[0], q[1])
  637. cls.c255lreduce(q[0])
  638. return q[0]
  639. @classmethod
  640. def cond_copy(cls, r, a, b, c):
  641. m2 = (-c) & 0xffff
  642. m1 = (~m2) & 0xffff
  643. n = 0
  644. while n < 16:
  645. r[n] = (a[n] & m1) | (b[n] & m2)
  646. n += 1
  647. @classmethod
  648. def curve25519(cls, f, c: list = None):
  649. if not c:
  650. c = cls.c255lbase()
  651. f[0] &= 0xFFF8
  652. f[15] = (f[15] & 0x7FFF) | 0x4000
  653. c[15] &= 0x7FFF
  654. return cls.curve25519_raw(f, c)
  655. @classmethod
  656. def sha1(cls, msg):
  657. length = len(msg)
  658. total_length = length + 9
  659. total_length = (total_length + 63) & -64
  660. padding = [0x80]
  661. padding.extend([0 for _ in range(length + 1, total_length)])
  662. msg.extend(padding)
  663. cls.packbe(msg, total_length - 4, length * 8)
  664. h0, h1, h2, h3, h4, w = 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0, [
  665. 0] * 80
  666. for j in range(0, len(msg), 64):
  667. for i in range(16):
  668. w[i] = int_overflow(cls.unpackbe(msg, j + i * 4))
  669. for i in range(16, 80):
  670. w[i] = int_overflow(cls.rrotate(
  671. w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 31))
  672. a, b, c, d, e = h0, h1, h2, h3, h4
  673. for i in range(80):
  674. if i < 20:
  675. f = int_overflow((b & c) | (~b & d))
  676. k = 0x5A827999
  677. elif i < 40:
  678. f = int_overflow(b ^ c ^ d)
  679. k = 0x6ED9EBA1
  680. elif i < 60:
  681. f = int_overflow((b & c) | (b & d) | (c & d))
  682. k = 0x8F1BBCDC
  683. else:
  684. f = int_overflow(b ^ c ^ d)
  685. k = 0xCA62C1D6
  686. t = int_overflow(Curve.rrotate(a, 27) + f + e + k + w[i])
  687. e = d
  688. d = c
  689. c = int_overflow(Curve.rrotate(b, 2))
  690. b = a
  691. a = int_overflow(t << 0)
  692. h0 = int_overflow((h0 + a) << 0)
  693. h1 = int_overflow((h1 + b) << 0)
  694. h2 = int_overflow((h2 + c) << 0)
  695. h3 = int_overflow((h3 + d) << 0)
  696. h4 = int_overflow((h4 + e) << 0)
  697. res = [0] * 20
  698. Curve.packbe(res, 0, h0)
  699. Curve.packbe(res, 4, h1)
  700. Curve.packbe(res, 8, h2)
  701. Curve.packbe(res, 12, h3)
  702. Curve.packbe(res, 16, h4)
  703. return res
  704. @classmethod
  705. def rrotate(cls, v, r):
  706. return unsigned_right_shift(v, r) | (v << (32 - r))
  707. @classmethod
  708. def unpackbe(cls, a, off):
  709. v = 0
  710. for i in range(4):
  711. v |= a[off + i] << (24 - (i * 8))
  712. return v
  713. @classmethod
  714. def packbe(cls, a, off, v):
  715. for i in range(4):
  716. a[off + i] = (v >> (24 - i * 8)) & 0xff
  717. class RC4(object):
  718. def __init__(self):
  719. self.S = []
  720. self.i = 0
  721. self.j = 0
  722. def set_key(self, key):
  723. self.S = [i for i in range(256)]
  724. S, j = self.S, 0
  725. for i in range(256):
  726. j = (j + key[i % len(key)] + S[i]) & 255
  727. S[i], S[j] = S[j], S[i]
  728. for _ in range(768):
  729. self.gen()
  730. def gen(self):
  731. S = self.S
  732. i = self.i = (self.i + 1) & 255
  733. j = self.j = (self.j + S[i]) & 255
  734. S[i], S[j] = S[j], S[i]
  735. return S[(S[i] + S[j]) & 255]
  736. def crypt_uint8array(self, dst, src, start):
  737. for i in range(len(src)):
  738. dst[start + i] = src[i] ^ self.gen()
  739. def encrypt(self, s):
  740. a = ''
  741. for i in range(len(s)):
  742. c = s[i] ^ self.gen()
  743. if c == 0:
  744. c = 256
  745. a += chr(c)
  746. return a
  747. class RouterSession(object):
  748. def __init__(self):
  749. self.id = None
  750. self.pri_key = None
  751. self.pub_key = None
  752. self.padding = [32] * 8
  753. self.rx_seq = 1
  754. self.rx_enc = RC4()
  755. self.tx_seq = 1
  756. self.tx_enc = RC4()
  757. def make_initial_request(self):
  758. self.pri_key = bytes([randint(0, 255) for _ in range(32)])
  759. pub_key = Curve.curve_u2a(
  760. Curve.curve25519(Curve.curve_a2u(self.pri_key)))
  761. self.pub_key = Curve.word2str(
  762. 0) + Curve.word2str(0) + Curve.a2str(pub_key)
  763. self.pub_key = self.pub_key.encode()
  764. def key_exchange(self, body):
  765. self.id = Curve.str2word(body, 0)
  766. r_pub_key = Curve.str2a(body[8:])
  767. master_key = Curve.curve_u2a(Curve.curve25519(
  768. Curve.curve_a2u(self.pri_key), Curve.curve_a2u(r_pub_key)))
  769. self.rx_enc.set_key(self.make_key(master_key, False, False))
  770. self.tx_enc.set_key(self.make_key(master_key, True, False))
  771. def make_key(self, master_key, is_send, is_server):
  772. magic_2 = 'On the client side, this is the send key; on the server side, it is the receive key.'
  773. magic_3 = 'On the client side, this is the receive key; on the server side, it is the send key.'
  774. v = deepcopy(master_key)
  775. v.extend([0 for _ in range(40)])
  776. if is_send == is_server:
  777. v.extend(Curve.str2a(magic_3.encode()))
  778. else:
  779. v.extend(Curve.str2a(magic_2.encode()))
  780. v.extend([0xf2 for _ in range(40)])
  781. return Curve.sha1(v)[:16]
  782. def encrypt_uint8array(self, arr):
  783. narr = [0] * (len(arr) + 16)
  784. narr[1] = self.id >> 16
  785. narr[2] = self.id >> 8
  786. narr[3] = self.id & 0xff
  787. narr[4] = self.tx_seq >> 24
  788. narr[5] = self.tx_seq >> 16
  789. narr[6] = self.tx_seq >> 8
  790. narr[7] = self.tx_seq
  791. self.tx_enc.crypt_uint8array(narr, arr, 8)
  792. for i in range(len(arr) + 8, len(narr)):
  793. narr[i] = 32
  794. xarr = narr[len(arr) + 8:len(arr) + 16]
  795. self.tx_enc.crypt_uint8array(narr, xarr, len(arr) + 8)
  796. self.tx_seq += len(arr) + 8
  797. return bytes(narr)
  798. def decrypt_uint8array(self, arr):
  799. if len(arr) < 16:
  800. return False
  801. _id = int_overflow(arr[0] << 24) | int_overflow(arr[1] << 16) | int_overflow(arr[2] << 8) | arr[3]
  802. seq = int_overflow(arr[4] << 24) | int_overflow(arr[5] << 16) | int_overflow(arr[6] << 8) | arr[7]
  803. if _id != self.id:
  804. return False
  805. if seq != self.rx_seq:
  806. return True
  807. self.rx_seq += len(arr) - 8
  808. self.rx_enc.crypt_uint8array(arr, arr[8:], 8)
  809. for i in range(len(arr) - 8, len(arr)):
  810. if arr[i] != 32:
  811. return False
  812. msgs = Buffer().buffer2msgs(arr[8:len(arr) - 8], 8)
  813. if msgs:
  814. for i in range(len(msgs)):
  815. print(msgs[i])
  816. return True
  817. def encrypt(self, s):
  818. seq = self.tx_seq
  819. self.tx_seq += len(s) + 8
  820. return (Curve.word2str(self.id) + Curve.word2str(seq)) + self.tx_enc.encrypt(s.encode()) + self.tx_enc.encrypt(
  821. self.padding)
  822. def encrypt_uri(self, uri):
  823. s = self.encrypt(uri)
  824. r = ''
  825. for i in range(len(s)):
  826. r += chr(ord(s[i]) & 0xff)
  827. return r
  828. def fetch(self, url, headers, data):
  829. data = self.encrypt_uint8array(Buffer().msg2buffer(data))
  830. response = requests.post(url=url, headers=headers, data=data)
  831. body = list(response.content)
  832. self.decrypt_uint8array(body)
  833. def login(self):
  834. response = requests.post(url=URL, data=self.pub_key)
  835. body = [ord(item) for item in response.content.decode()]
  836. self.key_exchange(body)
  837. data = {'s1': 'root', 's3': ''}
  838. self.fetch(url=URL, headers=HEADERS, data=data)
  839. def change_vpn(self, vpn_idx, vpn_server):
  840. data = {
  841. "U1003c": [9, 0, 0, 0, 0, 0, 0, 0],
  842. "bdd": 0,
  843. "be1": 0,
  844. "be3": 0,
  845. "bfe000a": 0,
  846. "b1000e": 0,
  847. "ufe0001": vpn_idx + 48,
  848. "u10001": 34,
  849. "u10003": 0,
  850. "u10002": 16384,
  851. "uca": 1450,
  852. "ucb": 1450,
  853. "ud9": 4294967294,
  854. "udb": 30,
  855. "udc": 0,
  856. "ude": 60,
  857. "udf": 1,
  858. "sb0004": "disabled",
  859. "s10006": f"Vpn{vpn_idx}",
  860. "s1001e": "l2tp-out",
  861. "s10066": "",
  862. "se0": vpn_server,
  863. "se2": "",
  864. "sfe0009": "",
  865. "sd6": "123qqq",
  866. "sd7": "hnszs3ds",
  867. "Uff0014": [134217944],
  868. "Uff0001": [20, 0],
  869. "uff0007": 16646147
  870. }
  871. self.fetch(url=URL, headers=HEADERS, data=data)
  872. class AdminSession(object):
  873. def __init__(self):
  874. self.username = '17600025055'
  875. self.password = 'zhangyong0712'
  876. self.headers = None
  877. def cookie2str(self, cookies):
  878. ret = []
  879. for key, value in cookies.iteritems():
  880. ret.append(f'{key}={value}')
  881. return '; '.join(ret)
  882. def login(self):
  883. url = 'https://hwq.yycyk.com/'
  884. self.headers = {
  885. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  886. 'Accept-Encoding': 'gzip, deflate, br',
  887. 'Accept-Language': 'zh-CN,zh;q=0.9',
  888. 'Cache-Control': 'no-cache',
  889. 'Origin': 'https://hwq.yycyk.com',
  890. 'Pragma': 'no-cache',
  891. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
  892. }
  893. response = requests.get(url=url, headers=self.headers)
  894. self.headers.update({'Cookie': self.cookie2str(response.cookies)})
  895. url = 'https://hwq.yycyk.com/passport/loginact'
  896. self.headers.update({
  897. 'Accept': '*/*',
  898. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  899. 'Referer': 'https://hwq.yycyk.com/passport/login',
  900. 'X-Requested-With': 'XMLHttpRequest',
  901. })
  902. data = {
  903. 'phone': self.username,
  904. 'password': self.password,
  905. 'captcha': '',
  906. }
  907. response = requests.post(url=url, headers=self.headers, data=data)
  908. self.headers.update({'Cookie': self.cookie2str(response.cookies)})
  909. def get_proxy_list(self):
  910. url = 'https://hwq.yycyk.com/welcome/dynamicLines'
  911. self.headers.update({'Referer': 'https://hwq.yycyk.com/welcome'})
  912. data = {
  913. 'search_str': '',
  914. 'type': '3',
  915. }
  916. response = requests.post(url=url, headers=self.headers, data=data)
  917. obj = response.json()
  918. proxy_list = []
  919. for item in obj.get('res', {}).get('data', {}).values():
  920. proxy_list.append(item.get('info', {}).get('province_domain'))
  921. for sub_item in item.get('line', []):
  922. if int(sub_item.get('status', 0)) == 0: # 维护中的跳过
  923. continue
  924. if int(sub_item.get('ping', 1000)) >= 200: # 延迟超过200ms的跳过
  925. continue
  926. proxy_list.append(sub_item.get('domain'))
  927. return proxy_list
  928. def job():
  929. admin_session = AdminSession()
  930. admin_session.login()
  931. vpn_server = choice(admin_session.get_proxy_list())
  932. router_session = RouterSession()
  933. router_session.make_initial_request()
  934. router_session.login()
  935. router_session.change_vpn(vpn_idx=1, vpn_server=vpn_server)
  936. now = datetime.now(tz=pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S')
  937. print(f'[+] {now} 切换代理地址为: {vpn_server}')
  938. def main():
  939. scheduler = BlockingScheduler({
  940. 'apscheduler.timezone': 'Asia/Shanghai',
  941. })
  942. scheduler.add_job(job, 'cron', hour=12, minute=0, second=0)
  943. try:
  944. print('[+] 定时任务已启动')
  945. scheduler.start()
  946. except KeyboardInterrupt:
  947. print('[+] 定时任务已停止')
  948. if __name__ == '__main__':
  949. main()