x64 asm Hooking winsocket2 Connect()



我做了一个基本的C#工具,可以打开一个绑定到我的服务器的外壳。 假设 IP 是 192.168.0.101,端口是 9500。

我的目标是将流量从 C# 工具路由到我的第二台服务器,假设它在 192.168.0.102 并使用相同的端口。

为了得到我想要的东西,我试图挂上ws2_32.dll函数"WSAConnect"。 在 C# 中添加了一个调试器,在函数上放置了一个断点,毕竟我发现 RDX 包含指向我想要修改的内容的"sockaddr"。

前 2 个字节是 0x02 0x00 代表 ipv4 用法。 第二个 2 是我的十六进制端口,接下来的 4 个是我的十六进制 IP。 从那里我修改了这些字节以获得我想要的东西,并使程序继续。

为了检查它是否有效,我使用了"任务管理器"中的"源代码管理"并查看了我的 C# 应用程序。从那里我看到一个TCP连接,它没有连接到我的第一台服务器,而是我的第二台服务器,这正是我想要的。

但是在查看了两台服务器后,我没有看到传入的连接。 过了一会儿,"源代码管理"中的连接消失了,同时也没有数据包发送。

为什么我的连接没有开始?我忽略了什么吗?

过了很久,我终于找到了答案。 事实证明,一切都是正确的,但我不得不在发送第一个数据包之前等待。 内核尚未创建连接,导致send()失败。 为了解决这个问题,我最终做了一个Send(),检查WSAGetLastError(),并重复直到成功。为了防止卡在 inf-loop 中,我添加了一个计数器,该计数器在几次尝试后超时。

最新更新