Winsock send Hook Problem

08/03/2011 18:43 kurrbis#1
Huhu,
Ich würde gerne die send(...) Mehtode hooken, um das Socket abfangen zu können, damit ich danach eigene Pakete verschicken kann.

Das Problem besteht darin, dass sobald ich die dll injecte(z.b in firefox) und ein paket versende, einmal die MessageBox erscheint, das send() aufgerufen wurde und danach das Programm abstürtzt. Zum hooken benutze ich microsoft detours 1.5 und arbeite unter win 7 64bit. Die dll compile ich als 32bit und injecte sie auch in einen 32bit prozess.

Würde mich freuen wenn jemand einen Fehler in meinem Code entdecken würde, oder mir andersweitig helfen könnte.

Schonmal danke im vorraus :)


Code:
#include "stdafx.h"
#include "detours.h"
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <Windows.h>

#pragma comment( lib, "Ws2_32.lib" )
#pragma comment( lib, "Mswsock.lib" ) 
#pragma comment( lib, "detours.lib" ) 

typedef int ( WINAPI *sendOrigT )( SOCKET s, const char *buf, int len, int flags );
sendOrigT sendOrig = NULL;

typedef int ( WINAPI *WSASendT)( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSend, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
WSASendT WSASendOrig = NULL;

int mySend(SOCKET s, const char *buf, int len, int flags)
{
	MessageBoxA(NULL,"Packet send got called","Detour",MB_OK);
	return sendOrig(s, buf, len, flags);
}


int myWSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSend, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
	return WSASendOrig(s,lpBuffers,dwBufferCount,lpNumberOfBytesSend,dwFlags,lpOverlapped,lpCompletionRoutine);
}

int Hook()
{
	sendOrig = reinterpret_cast<sendOrigT>(DetourFunction((PBYTE)send, (PBYTE)mySend));
	return 0;
}

void Unhook()
{
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)Hook,NULL,NULL,NULL);
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
	Unhook();
		break;
	}
	return TRUE;
}
08/03/2011 19:10 buFFy!#2
[Only registered and activated users can see links. Click Here To Register...]

nicht grad das best gelungenste tutorial, sollte dir aber weiter helfen.
08/03/2011 19:41 kurrbis#3
Quote:
Originally Posted by buFFy! View Post
[Only registered and activated users can see links. Click Here To Register...]

nicht grad das best gelungenste tutorial, sollte dir aber weiter helfen.
Danke für deinen Tipp, aber es hilft mir leider wenig weiter. Wenn du meinen Code und dem aus dem tut vergleichst, kannst du erkennen, dass er sich ziemlich ähnelt. Der einzige unterschied ist, dass ich ms detours nutze und keine eigene hook funktion.
08/03/2011 20:01 buFFy!#4
tja dann ^^ ollydbg ist dein freund!
08/03/2011 20:52 kurrbis#5
Soo habe es einfach noch mal mit der Detour Funktion aus dem Tutorial probiert und es klappt weiterhin nicht^^

Mit OllyDbg kenne ich mich leider nicht gut genug aus um auf dieser Ebene Fehleranalyse zu betreiben...
08/03/2011 22:24 Akorn#6
Quote:
Originally Posted by kurrbis View Post
Soo habe es einfach noch mal mit der Detour Funktion aus dem Tutorial probiert und es klappt weiterhin nicht^^

Mit OllyDbg kenne ich mich leider nicht gut genug aus um auf dieser Ebene Fehleranalyse zu betreiben...
Stell olly einfach so ein das er automatisch pausiert wen eine Dll geladen wird, dann injectest du die Dll und setzt sein Breakpoint auf den anfahng deiner mySent funktion. Dann lässte olly weiterlaufen so das er bei den PB breakt und dan kannste deine funktion durch stepen. Weil der fehler wird ja warscheinlch dan auftreten wen das programm deine mySent funktion ausführt oder wen er die original funktion aufruft.
08/03/2011 22:41 buFFy!#7
mach an die potenziellen fehlerquellen ein
Code:
__asm INT3
olly wird dort automatisch breaken
08/03/2011 23:24 kurrbis#8
ok habe das mal probiert. das problem entsteht beim aufrufen der original send funktion...das würed heißen, dass ms detours eine falsche adresse zurückgibt oder nicht?
08/03/2011 23:44 Akorn#9
Einfach nur zu wissen das es am aufruf der originalfunktion scheitert reicht nicht aus um den fehler genau zu finden. Aber du kannst deine vermutung ganz einfach prüfen indem du mitells olly einfach nochmal deine mySent funktion durchstepst und guckst ob du am ende in der Trampolin funktion die MS detours angelegt hat landest und ob du von da aus auch weiter zur original funktion direkt hinter den hook jumpst.
08/04/2011 00:31 xNopex#10
Calling Convention von deinen Funktionen falsch? Versuch es mit __stdcall.
08/04/2011 02:17 kurrbis#11
Quote:
Originally Posted by xNopex View Post
Calling Convention von deinen Funktionen falsch? Versuch es mit __stdcall.

WINAPI ist ein Makro für einen stdcall
08/04/2011 09:31 Bot_interesierter#12
Schön, du hast also die Funktionszeiger mit der richtigen Calling Convetion definiert, aber was ist mit deinen eigenen Funktionen?
Richtig, bei denen handelt es sich aller Wahrscheinlichkeit nach um __cdecl Funktionen und jetzt rate mal was dass für dich bedeutet...
08/04/2011 13:22 kurrbis#13
Quote:
Originally Posted by Bot_interesierter View Post
Schön, du hast also die Funktionszeiger mit der richtigen Calling Convetion definiert, aber was ist mit deinen eigenen Funktionen?
Richtig, bei denen handelt es sich aller Wahrscheinlichkeit nach um __cdecl Funktionen und jetzt rate mal was dass für dich bedeutet...

Danke Danke Danke :)
und thx @xNopex, du meintest glaube ich das gleiche, habe es nur falsch verstanden^^

Das habe ich komplett vergessen und jetzt funktioniert es einwandfrei
08/05/2011 21:56 uragan#14
du hast jetzt send gehooked.
Ich send zum beispiel ein packet auf n server, speicher sfort den SOCKET s und wie schaffe ich jetzt ein neues packet zu erstellen und zu verschicken auf den selben socket?
08/06/2011 00:26 kurrbis#15
Socket mySocket;

In mySend machste dann einfach: mySocket = s;

Und dann kannste die Original send Funktion mit mySocket aufrufen um Pakete an den Server zu senden