<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[WSARecv() gehookt, wie richtig Informationen bekommen?]]></title><description><![CDATA[<p>Hey!</p>
<p>Habe WSARecv() eines Prozesses gehookt und möchte nun Daten auswerten. Doch schaffe ich es nicht herauszufinden von welcher IP das Paket kommt und wieviele Bytes das Paket beinhaltet.</p>
<p>zB. _WSABUF::buf ist vom Typ char*. Doch möchte ich das gesamte Array in eine Datei schreiben...</p>
<p>out &lt;&lt; wsabuf[0].buf;</p>
<p>...dann wird mir lediglich ein einziges Zeichen geschrieben. Ich könnte eine Schleife schreiben (wsabuf[0].len == 1467), aber nicht jeder buffer eines Pakets beinhaltet 1467 Elemente...</p>
<p>Wie mache ich das am besten?<br />
Wiegesagt, ich möchte durch einen WSARecv() hook folgendes wissen:</p>
<p>- IP des Senders<br />
- Anzahl der Elemente im buffer (maximal 1467, schon klar, aber wieviele sind es im aktuellen Paket?)<br />
- Größe des aktuellen Pakets in Bytes</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204149/wsarecv-gehookt-wie-richtig-informationen-bekommen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 18:15:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204149.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Jan 2008 17:05:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Wed, 30 Jan 2008 17:05:51 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>Habe WSARecv() eines Prozesses gehookt und möchte nun Daten auswerten. Doch schaffe ich es nicht herauszufinden von welcher IP das Paket kommt und wieviele Bytes das Paket beinhaltet.</p>
<p>zB. _WSABUF::buf ist vom Typ char*. Doch möchte ich das gesamte Array in eine Datei schreiben...</p>
<p>out &lt;&lt; wsabuf[0].buf;</p>
<p>...dann wird mir lediglich ein einziges Zeichen geschrieben. Ich könnte eine Schleife schreiben (wsabuf[0].len == 1467), aber nicht jeder buffer eines Pakets beinhaltet 1467 Elemente...</p>
<p>Wie mache ich das am besten?<br />
Wiegesagt, ich möchte durch einen WSARecv() hook folgendes wissen:</p>
<p>- IP des Senders<br />
- Anzahl der Elemente im buffer (maximal 1467, schon klar, aber wieviele sind es im aktuellen Paket?)<br />
- Größe des aktuellen Pakets in Bytes</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1446498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1446498</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Wed, 30 Jan 2008 17:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Fri, 01 Feb 2008 08:59:22 GMT]]></title><description><![CDATA[<p>Sorry, ich meinte WSARecv<strong>From</strong>.</p>
<p>lpNumberOfBytesRecvd ist immer entweder 0 oder 255. Aber das kann nicht sein, mit winpcap oder einem beliebigen PacketLogger haben die Pakete immer ne Größe von 36, 42, 67, 108 usw...</p>
<pre><code class="language-cpp">#define WIN32_LEAN_AND_MEAN
#include &lt;windows.h&gt;
#include &lt;detours.h&gt;
#include &lt;Winsock2.h&gt;

#include &lt;fstream&gt;
using namespace std;
ofstream out(&quot;C:\\wsLog.txt&quot;, ios::out | ios::trunc);

DETOUR_TRAMPOLINE(int WINAPI Real_WSARecvFrom(SOCKET a0, LPWSABUF a1, DWORD a2, LPDWORD a3, LPDWORD a4, sockaddr* a5, int a6, LPWSAOVERLAPPED a7, LPWSAOVERLAPPED_COMPLETION_ROUTINE a8), WSARecvFrom);
int WINAPI custom_WSARecvFrom(SOCKET a0, LPWSABUF a1, DWORD a2, LPDWORD a3, LPDWORD a4, sockaddr* a5, int a6, LPWSAOVERLAPPED a7, LPWSAOVERLAPPED_COMPLETION_ROUTINE a8);

BOOL WINAPI DllMain(HANDLE moduleHandle, DWORD reason, LPVOID)
{
	if(reason == DLL_PROCESS_ATTACH)
		DetourFunctionWithTrampoline((PBYTE)Real_WSARecvFrom, (PBYTE)custom_WSARecvFrom);
    else if(reason == DLL_PROCESS_DETACH)
		DetourRemove((PBYTE)Real_WSARecvFrom, (PBYTE)custom_WSARecvFrom);

    return true;
}

int WINAPI custom_WSARecvFrom(SOCKET a0, LPWSABUF a1, DWORD a2, LPDWORD a3, LPDWORD a4, sockaddr* a5, int a6, LPWSAOVERLAPPED a7, LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)
{
	out &lt;&lt; *a3 &lt;&lt; endl;

	return Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);
}
</code></pre>
<p>a3 ist lpNumberOfBytesRecvd.<br />
Hab auch schon versucht, len von _WSABUF auszulesen aber die ist ja immer 1467...<br />
Wie finde ich also raus, wie viele Bytes ein Paket hat?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447419</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Fri, 01 Feb 2008 08:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Fri, 01 Feb 2008 13:14:10 GMT]]></title><description><![CDATA[<p>Ich bin nicht sicher ob das jetzt stimmt aber rein logisch betrachtet schreibt ja erst der aufruf von Real_... einen Wert in a3. du kommst IMHO also nicht darum die Funktion aufzurufen und dann a3 erst auszulesen:</p>
<p>int WINAPI custom_WSARecvFrom(SOCKET a0, LPWSABUF a1, DWORD a2, LPDWORD a3, LPDWORD a4, sockaddr* a5, int a6, LPWSAOVERLAPPED a7, LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)<br />
{<br />
int iRet = Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);<br />
out &lt;&lt; *a3 &lt;&lt; endl;<br />
return iRet;<br />
}</p>
<p>und hat sich deine IP-Frage erledigt?<br />
Ich meine du hast ja a0 ... nimm doch einfach getpeername: <a href="http://msdn2.microsoft.com/en-us/library/ms738533(VS.85).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms738533(VS.85).aspx</a><br />
und hole dir die IP anhand des Socket-Handles (ich denke das ist die passende funktion dazu).</p>
<p>Und ein persönliches Interesse: gib mal DetourFunctionWithTrampoline :). Mich würde interessieren wie du das API-Hooking implementiert hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447583</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Fri, 01 Feb 2008 13:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Fri, 01 Feb 2008 18:15:48 GMT]]></title><description><![CDATA[<p>Ohne irgendetwas ausprobiert zu haben (Kann ich erst später):<br />
Ist es nicht gerade Sinn eines Hooks, die Zielfunktion abzufangen also zuerst eine eigene Funktion aufzurufen?</p>
<p>Ich möchte auch, dass bestimmte Pakete garnicht erst zu der Anwendung gelangen.</p>
<p>Danke jedenfalls.<br />
MfG</p>
<p>(Du brauchst nur MS Detours 1.5 um meinen Code zum laufen zu bekommen. Die DLL muss dann nur noch in einen Prozess eingefügt werden und fertig)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447738</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Fri, 01 Feb 2008 18:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Sun, 03 Feb 2008 07:03:48 GMT]]></title><description><![CDATA[<p>Ne, leider bekomme ich komplett falsche IP Adressen... Es waren grade 4 verschiedene Leute verbunden:</p>
<p>236.254.122.7<br />
236.254.74.7<br />
236.254.58.7<br />
236.254.90.7</p>
<p>Kann nicht sein... die haben alle ganz andere Adressen...</p>
<pre><code class="language-cpp">int WINAPI custom_WSARecvFrom(SOCKET a0, LPWSABUF a1, DWORD a2, LPDWORD a3, LPDWORD a4, sockaddr* a5, int a6, LPWSAOVERLAPPED a7, LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)
{
	sockaddr_in sa;
	int namelen = sizeof(sa);

	getpeername(a0, (SOCKADDR*)&amp;sa, &amp;namelen);
	out &lt;&lt; inet_ntoa(sa.sin_addr) &lt;&lt; endl;

	return Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);
}
</code></pre>
<p>Ich hoffe, da weiß noch jemand mehr...<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448348</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Sun, 03 Feb 2008 07:03:48 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Mon, 04 Feb 2008 11:39:27 GMT]]></title><description><![CDATA[<p>gb ma die die hook routine...<br />
bin anfänger undm ich interessiert sowas stark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448972</guid><dc:creator><![CDATA[owned778]]></dc:creator><pubDate>Mon, 04 Feb 2008 11:39:27 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Mon, 04 Feb 2008 11:41:45 GMT]]></title><description><![CDATA[<p>achso jetz hab ichs <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
is die detours ^^<br />
omg bin noch im bett</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448973</guid><dc:creator><![CDATA[owned778]]></dc:creator><pubDate>Mon, 04 Feb 2008 11:41:45 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Mon, 04 Feb 2008 22:08:33 GMT]]></title><description><![CDATA[<p>Nach getpeername() in WSARecvFrom() liefert WSAGetLastError():<br />
WSAENOTCONN - The socket is not connected</p>
<p>Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Der code steht ja weiter oben...</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449394</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Mon, 04 Feb 2008 22:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Mon, 04 Feb 2008 22:13:23 GMT]]></title><description><![CDATA[<p>hä? nimm doch a5</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449395</guid><dc:creator><![CDATA[.........]]></dc:creator><pubDate>Mon, 04 Feb 2008 22:13:23 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Tue, 05 Feb 2008 01:11:26 GMT]]></title><description><![CDATA[<pre><code>cannot convert from 'sockaddr' to 'sockaddr_in'
</code></pre>
<p>Und aus SOCKADDR bekomme ich nur Nullen.<br />
a5-&gt;sa_data[0] bis a5-&gt;sa_data[13] beinhalten alle 0...</p>
<pre><code class="language-cpp">int WINAPI custom_WSARecvFrom(SOCKET a0, LPWSABUF a1, DWORD a2, LPDWORD a3, LPDWORD a4, sockaddr* a5, int a6, LPWSAOVERLAPPED a7, LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)
{
	for(int a = 0; a &lt; 14; ++a)
		out &lt;&lt; (int)a5-&gt;sa_data[a] &lt;&lt; endl;

	out &lt;&lt; endl;

	return Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);
}
</code></pre>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449440</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 05 Feb 2008 01:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Tue, 05 Feb 2008 07:32:50 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Ohne irgendetwas ausprobiert zu haben (Kann ich erst später):<br />
Ist es nicht gerade Sinn eines Hooks, die Zielfunktion abzufangen also zuerst eine eigene Funktion aufzurufen?</p>
<p>Ich möchte auch, dass bestimmte Pakete garnicht erst zu der Anwendung gelangen.</p>
</blockquote>
<p>Naja, du musst ja Real_... aufrufen um überhaupt daten zu empfangen und um an die anzahl der elemente im buffer ranzukommen. Du musst aber nicht diese Werte der Anwendung weitergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449473</guid><dc:creator><![CDATA[123]]></dc:creator><pubDate>Tue, 05 Feb 2008 07:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Tue, 05 Feb 2008 12:08:24 GMT]]></title><description><![CDATA[<p>Wenn ich zuerst Real_... aufrufe, den Return-wert speichere, dann Daten ausgebe und anschließend den gespeicherten Return-wert zurückgebe, bricht die Internetverbindung des gehookten Programmes ab und es funktioniert kein Hook mehr bis ich den PC neustarte (Auch nicht nach neustart des Programms oder gar bei einem anderen Programm!)!</p>
<p>Winamp zB. kann ich hooken und bekomme dabei die richtige IP des verbundenen Radiosenders:</p>
<pre><code class="language-cpp">int WINAPI custom_WSARecv(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
	sockaddr_in sa;
	int namelen = sizeof(sa);
	getpeername(s, (SOCKADDR*)&amp;sa, &amp;namelen);

	WriteLog (&quot;RECV&quot; , false);
	WriteLog (inet_ntoa(sa.sin_addr), false);
	return Real_WSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);
}
</code></pre>
<p>Funktioniert einwandfrei. Hooke ich dann jedoch meinen Gameserver, bekomme ich immer dieselbe IP:</p>
<pre><code class="language-cpp">int WINAPI custom_WSARecvFrom(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, sockaddr* lpFrom, LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
	sockaddr_in sa;
	int namelen = sizeof(sa);
	getpeername(s, (SOCKADDR*)&amp;sa, &amp;namelen);

	WriteLog (&quot;RECVFROM&quot; , false);
	WriteLog (inet_ntoa(sa.sin_addr), false);
	return Real_WSARecvFrom(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpFrom, lpFromlen, lpOverlapped, lpCompletionRoutine);
}
</code></pre>
<p>Dabei mache ich doch alles gleich... Der Gameserver verwendet halt WSARecvFrom anstatt WSARecv wie bei winamp. Dabei bekomme ich bei WSARecvFrom() bei meinem Gameserver wiegesagt WSAENOTCONN, bei winamp mit WSARecv() NO ERROR...</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449660</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 05 Feb 2008 12:08:24 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Tue, 05 Feb 2008 16:25:09 GMT]]></title><description><![CDATA[<p>so gut kenne ich mich auch nicht aus, aber RecvFrom ist ja für &quot;verbindungslose&quot; sockets gedacht:</p>
<p>MSDN:<br />
The WSARecvFrom function is used primarily on a connectionless socket specified by s. The socket's local address must be known. For server applications, this is usually done explicitly through bind. Explicit binding is discouraged for client applications. For client applications using this function the socket can become bound implicitly to a local address through sendto, WSASendTo, or WSAJoinLeaf.</p>
<p>du könntest alternativ versuchen den Parameter lpFrom zu benutzen. Da dieser optional ist, schaue ob die Anwendung hier einen gültigen Puffer übergeben hat und wenn nicht übergebe deinen eigenen.</p>
<blockquote>
<p>Wenn ich zuerst Real_... aufrufe, den Return-wert speichere, dann Daten ausgebe und anschließend den gespeicherten Return-wert zurückgebe, bricht die Internetverbindung des gehookten Programmes ab</p>
</blockquote>
<p>dann muss es am Ausgeben der Daten liegen. womöglich willst du daten ausgeben die garnicht da sind. wie gibst du die daten aus?<br />
weil Real_... aurfufen, return-wert speichern und diesen dann zurückgeben dürfte eigenltich nichts ausmachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449928</guid><dc:creator><![CDATA[123]]></dc:creator><pubDate>Tue, 05 Feb 2008 16:25:09 GMT</pubDate></item><item><title><![CDATA[Reply to WSARecv() gehookt, wie richtig Informationen bekommen? on Tue, 05 Feb 2008 17:03:40 GMT]]></title><description><![CDATA[<p>Mhm jo danke erstmal.<br />
Hab grade jemanden erreicht, der schon einiges in die Richtung probiert hat und bin gerade draufgekommen, dass WSARecvFrom() meines Servers die Daten selbst nur von einem DirectPlay8 Server erhält... jetzt ist natürlich so Einiges klar...<br />
Ich werd bald einen neuen thread aufmachen, denn angeblich gibt es unterschiede zum hooken von IDirectPlay8Client::Send(), da es zu COM gehört...<br />
Diese Methode sollte mir dann alle nötigen Informationen geben, hat der Typ gemeint, darunter auch die IP eines Pakets. Weiss da jemand vllt. genaueres? Kann leider grad nicht rumprobieren, da ich keinen Serverabsturz riskieren möchte.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449963</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 05 Feb 2008 17:03:40 GMT</pubDate></item></channel></rss>