2009-08-20 48 views
2

我使用Nektra的Deviare来挂接winsock的发送方法调用。我的理念是学会通过与原始应用程序相同的套接字发送消息。所以当我检测到第一个发送消息的调用时,我保存了套接字ID(发送函数的第一个参数),所以我可以稍后使用它。发送带有套接字的字符串(不那么容易!)

因此,这里是我的代码:

uint socket = 0; 

[DllImport("Ws2_32.dll")] 
private static extern int send(uint socket, string buf, int len, int flags); 

void _proxy_OnFunctionCalled(DeviareTools.IProcess proc, DeviareParams.ICallInfo callInfo, Deviare.IRemoteCall rCall) 
{ 
    socket = (uint)callInfo.Params.get_Item(0).Value; 
} 

后来

int ret = send(socket, "ABC", 3, 0); 
    MessageBox.Show(ret.ToString()); 

这最后一个消息框总是坡平了-1。为什么要这样呢?

感谢

编辑:调用WSAGetLastError()返回2.我不知道这意味着什么,因为它似乎并没有出现在MSDN上。

回答

1

尝试做

MessageBox.Show(socket.ToString()); 

以及并确保您的插座变量设置得到。

我相信错误2是“找不到文件”,这会告诉我你有一个无效的套接字ID,但我可能是错误的。

+0

它现在有一些价值,1564。 – 2009-08-20 19:40:48

+0

嗯,我设置套接字值为123,它弹出相同的错误。奇怪。所以也许它与套接字ID无效有关?我不明白为什么。 – 2009-08-20 19:43:23

0

WinSock必须被初始化,必须创建一个Socket,必须建立一个连接(除非你的套接字是SOCK_DGRAM),所以你可以发送任何东西。 除此之外,API函数旨在处理来自(char *)指针的数据,确保它正在发生。也许“ABC”被声明为WIDECHAR数组,String对象或者不是(char *)缓冲区。

有一个基本的套接字连接的完整为例这里在MSDN:http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx

+0

我想我不需要初始化任何东西,记得我正在使用已经创建的套接字的ID。 – 2009-08-20 19:39:57

+0

是的,但我认为你没有明白这一点。我不是问如何发送信息与套接字,我问hwo发送信息后,我有套接字的ID,我挂钩了另一个应用程序。 – 2009-08-20 19:42:00

+0

它应该工作得很好,如果它是一个真正的并准备好发送数据套接字。也许你做错了什么。我宁愿将自己的方法构建到APIHook的东西上,实际上我已经为游戏服务器制作了安全过滤器和反作弊解决方案,而无需访问其代码,只使用API​​Hook。 – Havenard 2009-08-20 19:50:31

0

它可能有点晚了,但问题是,你要使用在不同的进程创建套接字。 使用Deviare,您从一个进程中获得套接字标识,并且正在尝试在您的进程中使用它。这不起作用,因为套接字ID仅在创建它们的过程中有效。

相关问题