2009-08-20 76 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僅在創建它們的過程中有效。

相關問題