查克终于复现了 CreateRemoteThread 失败
:
CreateRemoteThread 失败
还原一下操作过程:
from wcferry import Wcf
wcf = Wcf(debug=True)
连接失败: Connection refused
nng_listen error: Permission denied
from wcferry import Wcf
wcf = Wcf(debug=True)
连接失败: Connection refused
from wcferry import Wcf
wcf = Wcf(debug=True)
注入失败
不求甚解快速解决方案。
实际上这时候微信并没有完全退出:
打开 任务管理器
,切换到 详细信息
,可以看到 WeChat.exe
,然后 结束任务
彻底关闭微信。
wcf = Wcf(debug=True, port=50086) # 修改端口,将 10086 改成其他
过程很复杂,梳理完之后其实挺简单:
第一次启动 WCF
的时候,因为 Permission denied
,导致客户端连接失败,NNG 资源没有正常释放,退出微信的时候不能完全退出,再次注入的时候就出问题了。
这里面,RPC 的启动流程需要优化,当启动失败的时候需要释放所有 NNG 资源。 但这样处理完,只是 CreateRemoteThread 失败
不再这出现,并不能解决 连接失败: Connection refused
。
问题的根源在于 nng_listen error: Permission denied
。下面开始逐步排查。
netstat -ano | findstr :10086
并没有。
用管理员权限运行,也不行。
# 关闭
netsh advfirewall set allprofiles state off
# 打开
netsh advfirewall set allprofiles state on
关闭防火墙,也不行。
前面的排查,都没发现问题,看来是 NNG 自己的问题?
于是用 Python 写了段代码:
# 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
,也不行啊:
[!] 监听失败: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
所以,也不是 NNG 的问题。
当排除所有其他的可能性,最后剩下来的,不管多么不可思议,那也一定是真相。
正常来说,10086
不需要特别的权限,难道 10086
被预留了?
netsh interface ipv4 show excludedportrange protocol=tcp
结果如下:
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
1176 1275
1276 1375
10049 10148
50000 50059 *
* - Administered port exclusions.
果然如此。
netsh int ipv4 set dynamic tcp start=49152 num=16384
shutdown -r -t 0 # 立即重启电脑
后台回复 WCF
围观机器人🤖
后台回复 量子
研究量子计算
后台回复 保险
咨询保障方案