[Release] Packetlogger - By Doktor.

03/08/2014 08:08 Doktor.#1
Hab mich mal rangesetzt einen Packetlogger zu schreiben, aus Übungszwecken.
Bei Problemen o.Ä. könnt ihr euch einfach im Thread melden.

Funktionen:
- Ausgabe der gesendeten Packets
- Ausgabe der erhaltenen Packets
- Filtern der Packets
- Senden von Packets

- Braucht so schnell kein Update

[Only registered and activated users can see links. Click Here To Register...]

-------------------------------
Source zum abfangen der Packets
-------------------------------
Code:
#include <windows.h>
#include <stdio.h>

bool DetourFunc( BYTE* oldFunc, BYTE* newFunc, DWORD len )
{
	BYTE* newMem4base = NULL;
	DWORD dwOld;

	newMem4base = ( BYTE* )malloc( 5+len );

	if( newMem4base == NULL )
		return false;

	for( DWORD i = 0; i < ( len+5 ); i++ )
		newMem4base[i] = 0x90;

	VirtualProtect( oldFunc, len, PAGE_READWRITE, &dwOld );

	memcpy( newMem4base, oldFunc, len );
	oldFunc[0] = 0xE8;
	*( DWORD* )( oldFunc+0x01 ) = DWORD( newFunc-oldFunc-5 );
	oldFunc[5] = 0xE9;
	*( DWORD* )( oldFunc+0x06 ) = DWORD( newMem4base-( oldFunc+0x5 )-5 );
	newMem4base += len;
	newMem4base[0] = 0xE9;
	*( DWORD* )( newMem4base+0x01 ) = DWORD( ( oldFunc+10 )-newMem4base-5 );

	for( DWORD i = 10; i <len; i++ )
		oldFunc[i] = 0x90;

	return true;
}
bool bDataCompare(const unsigned char *pData, const unsigned char *bMask, const char *szMask)
{
	for(; *szMask; ++szMask, ++pData, ++bMask)
		if(*szMask == 'x' && *pData != *bMask )
			return false;
	return (*szMask) == 0;
}
DWORD dwFindPattern(BYTE *bMask, char *szMask)
{
	DWORD dw_Address =	0x00400000;
	DWORD dw_Len =		0x00436000;

	for(DWORD i = 0; i < dw_Len; i++)
		if(bDataCompare((unsigned char*) (dw_Address + i), bMask, szMask) )
			return (DWORD) (dw_Address + i);
	return 0;
}


void hkSend()
{
	char* packet;
	_asm
	{
		pushad 
		pushfd
		MOV packet,EDX
	}
	printf("Send: %s\n",packet);
	_asm
	{
		popfd 
		popad
	}
}
void hkRecv()
{
	char* packet;

	_asm
	{
		pushad 
		pushfd
		MOV packet,EDX
	}
	printf("Recv: %s\n",packet);
	_asm
	{
		popfd 
		popad
	}
}


DWORD WINAPI tThread(LPVOID param)
{
	AllocConsole();
	freopen("CONIN$", "r", stdin);
	freopen("CONOUT$", "w", stdout);
	freopen("CONOUT$", "w", stderr);

	/* Send */
	BYTE s_bPatter[] = {0x53, 0x56, 0x8B, 0xF2, 0x8B, 0xD8, 0xEB, 0x04};
	char *s_cPatter = "xxxxxxxx";
	DWORD dSend = dwFindPattern(s_bPatter,s_cPatter);
	/* Recv */
	BYTE r_bPatter[] = {0x55, 0x8B, 0xEC, 0x83, 0xC4, 0xF4, 0x53, 0x56, 0x57, 0x33, 0xC9, 0x89, 0x4D, 0xF4, 0x89, 0x55, 0xFC, 0x8B, 0xD8, 0x8B, 0x45, 0xFC};
	char *r_cPatter = "xxxxxxxxxxxxxxxxxxxxxx";
	DWORD dRecv = dwFindPattern(r_bPatter,r_cPatter);

	DetourFunc( ( BYTE* )dSend, ( BYTE* )&hkSend, 14 );
	DetourFunc( ( BYTE* )dRecv, ( BYTE* )&hkRecv, 14 );
	return 0x0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(nullptr, 0, tThread, nullptr, 0, nullptr);
		DisableThreadLibraryCalls(hModule);
		break;
	}
	return TRUE;
}
Mfg.
Doktor.
03/08/2014 15:47 luigi1000#2
friert beim Start und beenden Sie ein weißes Fenster

EDIT: nach 2 Minuten es funktionierte
03/08/2014 20:54 Guiso90#3
3 calls?
03/08/2014 21:49 Doktor.#4
Was meinst du mit 3 calls?
03/08/2014 23:45 Guiso90#5
Logt er alle Packete oder wie bei Elektrochemie nur die hälfte...?
03/09/2014 00:29 Doktor.#6
Sollte momentan wie bei Elektrochemie's sein.

#Update - V1.1
- Crashes gefixed
- Keine Lags mehr bei zu vielen Packets
03/09/2014 01:52 Shıgeo#7
Wird es auch einen Source geben?
Wäre super :D
03/09/2014 01:58 BladeTiger12#8
Die Source wird es nicht geben.
Das musst du selbst packen :D.
Ich glaube (fast-)jeder würde sich über die Source freuen.
03/09/2014 02:00 Shıgeo#9
Okay. Dennoch gut.
Weiter so.
03/09/2014 11:14 aiimsh0ckz#10
Gibt ja eine SRC zu einem Packetlogger. Sufu hilft!
03/09/2014 12:44 luigi1000#11
Sie können nichts tun, um "send x times" und "send infinite" mit Intervallzeit in ms?
03/09/2014 13:40 Guiso90#12
Also der selbe packetlogger wie von Elektrochemie nur mit anderen Design?....
03/09/2014 14:21 Doktor.#13
Momentan ja, aber bin an den anderen Packets dran, hab sie auch schon. Aber anscheint hab ich grad einen Fehler im Code und komme momentan einfach nicht dahinter. :b

@luigi1000
Nein, bau ich aber noch ein.
03/09/2014 14:24 Guiso90#14
aso dann werd ich mal schauen was du so daraus machst (:
03/11/2014 07:44 Doktor.#15
Code:
#include <windows.h>
#include <stdio.h>

bool DetourFunc( BYTE* oldFunc, BYTE* newFunc, DWORD len )
{
	BYTE* newMem4base = NULL;
	DWORD dwOld;

	newMem4base = ( BYTE* )malloc( 5+len );

	if( newMem4base == NULL )
		return false;

	for( DWORD i = 0; i < ( len+5 ); i++ )
		newMem4base[i] = 0x90;

	VirtualProtect( oldFunc, len, PAGE_READWRITE, &dwOld );

	memcpy( newMem4base, oldFunc, len );
	oldFunc[0] = 0xE8;
	*( DWORD* )( oldFunc+0x01 ) = DWORD( newFunc-oldFunc-5 );
	oldFunc[5] = 0xE9;
	*( DWORD* )( oldFunc+0x06 ) = DWORD( newMem4base-( oldFunc+0x5 )-5 );
	newMem4base += len;
	newMem4base[0] = 0xE9;
	*( DWORD* )( newMem4base+0x01 ) = DWORD( ( oldFunc+10 )-newMem4base-5 );

	for( DWORD i = 10; i <len; i++ )
		oldFunc[i] = 0x90;

	return true;
}
bool bDataCompare(const unsigned char *pData, const unsigned char *bMask, const char *szMask)
{
	for(; *szMask; ++szMask, ++pData, ++bMask)
		if(*szMask == 'x' && *pData != *bMask )
			return false;
	return (*szMask) == 0;
}
DWORD dwFindPattern(BYTE *bMask, char *szMask)
{
	DWORD dw_Address =	0x00400000;
	DWORD dw_Len =		0x00436000;

	for(DWORD i = 0; i < dw_Len; i++)
		if(bDataCompare((unsigned char*) (dw_Address + i), bMask, szMask) )
			return (DWORD) (dw_Address + i);
	return 0;
}


void hkSend()
{
	char* packet;
	_asm
	{
		pushad 
		pushfd
		MOV packet,EDX
	}
	printf("Send: %s\n",packet);
	_asm
	{
		popfd 
		popad
	}
}
void hkRecv()
{
	char* packet;

	_asm
	{
		pushad 
		pushfd
		MOV packet,EDX
	}
	printf("Recv: %s\n",packet);
	_asm
	{
		popfd 
		popad
	}
}


DWORD WINAPI tThread(LPVOID param)
{
	AllocConsole();
	freopen("CONIN$", "r", stdin);
	freopen("CONOUT$", "w", stdout);
	freopen("CONOUT$", "w", stderr);

	/* Send */
	BYTE s_bPatter[] = {0x53,0x56,0x8B,0xF2,0x8B,0xD8,0xEB,0x04};
	char *s_cPatter = "xxxxxxxx";
	DWORD dSend = dwFindPattern(s_bPatter,s_cPatter);
	/* Recv */
	BYTE r_bPatter[] = {0x55,0x8B,0xEC,0x83,0xC4,0xF4,0x53,0x56,0x57,0x33,0xC9,0x89,0x4D,0xF4,0x89,0x55,0xFC,0x8B,0xD8,0x8B,0x45,0xFC};
	char *r_cPatter = "xxxxxxxxxxxxxxxxxxxxxx";
	DWORD dRecv = dwFindPattern(r_bPatter,r_cPatter);

	DetourFunc( ( BYTE* )dSend, ( BYTE* )&hkSend, 14 );
	DetourFunc( ( BYTE* )dRecv, ( BYTE* )&hkRecv, 11 );
	return 0x0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(nullptr, 0, tThread, nullptr, 0, nullptr);
		DisableThreadLibraryCalls(hModule);
		break;
	}
	return TRUE;
}
Evtl. haben ja einige dafür Verwendung. :)