前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >搞微信机器人遇到的一个奇怪问题

搞微信机器人遇到的一个奇怪问题

作者头像
查克
发布2025-02-19 22:11:00
发布2025-02-19 22:11:00
8400
代码可运行
举报
文章被收录于专栏:碲矿碲矿
运行总次数:0
代码可运行

查克终于复现了 CreateRemoteThread 失败

CreateRemoteThread 失败
CreateRemoteThread 失败

CreateRemoteThread 失败

还原问题

还原一下操作过程:

  • 电脑太卡了,重启了一下电脑
  • 运行代码:
代码语言:javascript
代码运行次数:0
复制
from wcferry import Wcf
wcf = Wcf(debug=True)
  • 终端日志:
代码语言:javascript
代码运行次数:0
复制
连接失败: Connection refused
  • wcf.txt 日志
代码语言:javascript
代码运行次数:0
复制
nng_listen error: Permission denied
  • 再次运行代码:
代码语言:javascript
代码运行次数:0
复制
from wcferry import Wcf
wcf = Wcf(debug=True)
  • 终端仍然提示:
代码语言:javascript
代码运行次数:0
复制
连接失败: Connection refused
  • 退出微信
退出微信
退出微信
  • 再次运行代码:
代码语言:javascript
代码运行次数:0
复制
from wcferry import Wcf
wcf = Wcf(debug=True)
  • 错误出来了:
CreateRemoteThread 失败
CreateRemoteThread 失败
注入失败
注入失败

注入失败

解决方法(简单版)

不求甚解快速解决方案。

1 彻底关闭微信

实际上这时候微信并没有完全退出:

微信没完全退出
微信没完全退出

打开 任务管理器,切换到 详细信息,可以看到 WeChat.exe,然后 结束任务 彻底关闭微信。

2 切换通信端口

代码语言:javascript
代码运行次数:0
复制
wcf = Wcf(debug=True, port=50086) # 修改端口,将 10086 改成其他

问题排查

过程很复杂,梳理完之后其实挺简单:

第一次启动 WCF 的时候,因为 Permission denied,导致客户端连接失败,NNG 资源没有正常释放,退出微信的时候不能完全退出,再次注入的时候就出问题了。

这里面,RPC 的启动流程需要优化,当启动失败的时候需要释放所有 NNG 资源。 但这样处理完,只是 CreateRemoteThread 失败 不再这出现,并不能解决 连接失败: Connection refused

问题的根源在于 nng_listen error: Permission denied。下面开始逐步排查。

端口被占用?

代码语言:javascript
代码运行次数:0
复制
netstat -ano | findstr :10086

并没有。

需要管理员权限?

用管理员权限运行,也不行。

防火墙?

代码语言:javascript
代码运行次数:0
复制
# 关闭
netsh advfirewall set allprofiles state off

# 打开
netsh advfirewall set allprofiles state on

关闭防火墙,也不行。

NNG 的问题?

前面的排查,都没发现问题,看来是 NNG 自己的问题?

于是用 Python 写了段代码:

代码语言:javascript
代码运行次数:0
复制
# test10086.py

import socket

HOST = "0.0.0.0"
PORT = 10086

try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_socket.bind((HOST, PORT))
        server_socket.listen(5)
        print(f"[*] 服务器成功监听在 {HOST}:{PORT}")
        conn, addr = server_socket.accept()
        print(f"[*] 连接来自: {addr}")
except Exception as e:
    print(f"[!] 监听失败: {e}")

python test10086.py,也不行啊:

代码语言:javascript
代码运行次数:0
复制
[!] 监听失败: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

所以,也不是 NNG 的问题。

10086 的问题?

当排除所有其他的可能性,最后剩下来的,不管多么不可思议,那也一定是真相。

正常来说,10086 不需要特别的权限,难道 10086 被预留了?

代码语言:javascript
代码运行次数:0
复制
netsh interface ipv4 show excludedportrange protocol=tcp

结果如下:

代码语言:javascript
代码运行次数:0
复制
Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
      1176        1275
      1276        1375
     10049       10148
     50000       50059     *

* - Administered port exclusions.

果然如此。

解决办法

代码语言:javascript
代码运行次数:0
复制
netsh int ipv4 set dynamic tcp start=49152 num=16384
shutdown -r -t 0 # 立即重启电脑

WeChatFerry: 一个玩微信机器人的工具

后台回复 WCF 围观机器人🤖 后台回复 量子 研究量子计算

后台回复 保险 咨询保障方案

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 碲矿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 还原问题
  • 解决方法(简单版)
    • 1 彻底关闭微信
    • 2 切换通信端口
  • 问题排查
    • 端口被占用?
    • 需要管理员权限?
    • 防火墙?
    • NNG 的问题?
    • 10086 的问题?
    • 解决办法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档