|
From: <ma...@us...> - 2002-10-03 05:27:14
|
Update of /cvsroot/decaldev/source/DecalNet
In directory usw-pr-cvs1:/tmp/cvs-serv9262
Modified Files:
ProtocolStack.h ProtocolStack.cpp NetService.h NetService.cpp
Log Message:
Updated for direct AC message hook
Index: ProtocolStack.h
===================================================================
RCS file: /cvsroot/decaldev/source/DecalNet/ProtocolStack.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** ProtocolStack.h 28 Sep 2001 04:20:38 -0000 1.2
--- ProtocolStack.h 3 Oct 2002 05:27:12 -0000 1.3
***************
*** 5,8 ****
--- 5,10 ----
#define __PROTOCOLSTACK_H
+ #include "ACMessage.h"
+
#define DEFAULT_HEADER_SIZE 16
#define FRAGMENT_SIZE 448
***************
*** 38,42 ****
#pragma pack( pop )
! class cMessage
{
protected:
--- 40,44 ----
#pragma pack( pop )
! class cProtocolMessage : public ACMessage
{
protected:
***************
*** 46,52 ****
public:
! cMessage( BYTE *pbData );
! cMessage( const cMessage &msg );
! ~cMessage();
cMessageHeader *getMessageHeader() const
--- 48,54 ----
public:
! cProtocolMessage( BYTE *pbData );
! cProtocolMessage( const cProtocolMessage &msg );
! ~cProtocolMessage();
cMessageHeader *getMessageHeader() const
***************
*** 55,74 ****
}
! cMessage &operator= ( const cMessage &msg );
! BYTE *getBody() const
! {
return m_pbData + sizeof( cMessageHeader );
! }
! DWORD getBodyLength() const
! {
return getMessageHeader()->m_wFragmentLength - sizeof( cMessageHeader );
! }
! DWORD getMessageCode() const
! {
return *reinterpret_cast< DWORD * >( m_pbData + sizeof( cMessageHeader ) );
! }
bool isComplete() const;
--- 57,77 ----
}
! cProtocolMessage &operator= ( const cProtocolMessage &msg );
! // ACMessage interface implementation for protocol stack
! virtual BYTE *getData ()
! {
return m_pbData + sizeof( cMessageHeader );
! }
! virtual DWORD getSize ()
! {
return getMessageHeader()->m_wFragmentLength - sizeof( cMessageHeader );
! }
! virtual DWORD getType ()
! {
return *reinterpret_cast< DWORD * >( m_pbData + sizeof( cMessageHeader ) );
! }
bool isComplete() const;
***************
*** 80,94 ****
};
- // Objects wishing to receive
- class cCallback
- {
- public:
- virtual void onMessage( cMessage & ) = 0;
- };
-
private:
! typedef std::list< cMessage > cMessageList;
! cCallback *m_pCallback;
cMessageList m_messages;
--- 83,90 ----
};
private:
! typedef std::list< cProtocolMessage > cMessageList;
! ACMessageSink *m_pCallback;
cMessageList m_messages;
***************
*** 97,101 ****
~cMessageStack();
! void start( cCallback * );
void stop();
--- 93,97 ----
~cMessageStack();
! void start( ACMessageSink * );
void stop();
Index: ProtocolStack.cpp
===================================================================
RCS file: /cvsroot/decaldev/source/DecalNet/ProtocolStack.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** ProtocolStack.cpp 28 Mar 2002 14:55:33 -0000 1.3
--- ProtocolStack.cpp 3 Oct 2002 05:27:12 -0000 1.4
***************
*** 5,9 ****
#include "ProtocolStack.h"
! cMessageStack::cMessage::cMessage( BYTE *pbData )
: m_pbData( NULL ),
m_pbReceived( NULL ),
--- 5,9 ----
#include "ProtocolStack.h"
! cMessageStack::cProtocolMessage::cProtocolMessage( BYTE *pbData )
: m_pbData( NULL ),
m_pbReceived( NULL ),
***************
*** 31,35 ****
}
! cMessageStack::cMessage::cMessage( const cMessage &msg )
: m_pbData( msg.m_pbData ),
m_bOwn( msg.m_bOwn ),
--- 31,35 ----
}
! cMessageStack::cProtocolMessage::cProtocolMessage( const cProtocolMessage &msg )
: m_pbData( msg.m_pbData ),
m_bOwn( msg.m_bOwn ),
***************
*** 41,45 ****
}
! cMessageStack::cMessage::~cMessage()
{
if( m_bOwn )
--- 41,45 ----
}
! cMessageStack::cProtocolMessage::~cProtocolMessage()
{
if( m_bOwn )
***************
*** 50,54 ****
}
! cMessageStack::cMessage &cMessageStack::cMessage::operator= ( const cMessage &msg )
{
if( &msg == this )
--- 50,54 ----
}
! cMessageStack::cProtocolMessage &cMessageStack::cProtocolMessage::operator= ( const cProtocolMessage &msg )
{
if( &msg == this )
***************
*** 73,77 ****
}
! bool cMessageStack::cMessage::isComplete() const
{
if( m_pbReceived == NULL )
--- 73,77 ----
}
! bool cMessageStack::cProtocolMessage::isComplete() const
{
if( m_pbReceived == NULL )
***************
*** 91,95 ****
}
! bool cMessageStack::cMessage::fragmentMatch( BYTE *pFragmentStart )
{
cMessageHeader *pThis = getMessageHeader(),
--- 91,95 ----
}
! bool cMessageStack::cProtocolMessage::fragmentMatch( BYTE *pFragmentStart )
{
cMessageHeader *pThis = getMessageHeader(),
***************
*** 101,105 ****
#define MESSAGE_BODY 448
! void cMessageStack::cMessage::insertFragment( BYTE *pFragmentStart )
{
cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart );
--- 101,105 ----
#define MESSAGE_BODY 448
! void cMessageStack::cProtocolMessage::insertFragment( BYTE *pFragmentStart )
{
cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart );
***************
*** 119,123 ****
}
! DWORD cMessageStack::cMessage::calcMessageLength( BYTE *pFragmentStart )
{
cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart );
--- 119,123 ----
}
! DWORD cMessageStack::cProtocolMessage::calcMessageLength( BYTE *pFragmentStart )
{
cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart );
***************
*** 138,142 ****
}
! void cMessageStack::start( cCallback *pCallback )
{
// Setting this enables messages
--- 138,142 ----
}
! void cMessageStack::start( ACMessageSink *pCallback )
{
// Setting this enables messages
***************
*** 221,225 ****
// Ok, we have a new fragment on our hands - generate the fragment object
! cMessage msg( iFrag );
if( msg.isComplete() )
--- 221,225 ----
// Ok, we have a new fragment on our hands - generate the fragment object
! cProtocolMessage msg( iFrag );
if( msg.isComplete() )
Index: NetService.h
===================================================================
RCS file: /cvsroot/decaldev/source/DecalNet/NetService.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** NetService.h 20 Jul 2002 06:20:50 -0000 1.3
--- NetService.h 3 Oct 2002 05:27:12 -0000 1.4
***************
*** 19,23 ****
public IDecalServiceImpl< cNetService >,
public IDecalDirectory,
! public cMessageStack::cCallback
{
public:
--- 19,23 ----
public IDecalServiceImpl< cNetService >,
public IDecalDirectory,
! public ACMessageSink
{
public:
***************
*** 36,41 ****
static fn_recvfrom g_fn_recvfrom;
! // cMessageStack::cCallback overrides
! virtual void onMessage( cMessageStack::cMessage & );
// The network filter list
--- 36,41 ----
static fn_recvfrom g_fn_recvfrom;
! // ACMessageSink overrides
! virtual void onMessage (ACMessage&);
// The network filter list
Index: NetService.cpp
===================================================================
RCS file: /cvsroot/decaldev/source/DecalNet/NetService.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** NetService.cpp 20 Jul 2002 06:20:50 -0000 1.7
--- NetService.cpp 3 Oct 2002 05:27:12 -0000 1.8
***************
*** 5,11 ****
--- 5,21 ----
#include "Message.h"
+ #include "ProtocolHook.h"
#include <ApiHook.h>
#include "FilterAdapterV1.h"
+
+ extern DWORD HookCall (DWORD dwCallAddress, DWORD dwReplacement);
+ extern void PacketComplete ();
+
+ static long g_lPacketCompleteCallLocation = 0;
+ static long g_lPacketCompleteProc = 0;
+ static long g_lPacketDataOffset = 0;
+ static long g_lPacketSizeOffset = 0;
+
/////////////////////////////////////////////////////////////////////////////
// cNetService
***************
*** 21,38 ****
HRESULT cNetService::onInitialize()
{
! if( g_pService == NULL )
! {
! g_pService = this;
! hookFunctions( _hooks, 2, true );
! if( _hooks[ 0 ].m_pOldFunction != 0 )
! g_fn_recvfrom = reinterpret_cast< fn_recvfrom >( _hooks[ 0 ].m_pOldFunction );
! else if( _hooks[ 1 ].m_pOldFunction != 0 )
! g_fn_recvfrom = reinterpret_cast< fn_recvfrom >( _hooks[ 1 ].m_pOldFunction );
! else
! _ASSERTE( 1 );
! }
! m_stack.start( this );
// Start all of the network filters
--- 31,66 ----
HRESULT cNetService::onInitialize()
{
! if( g_pService == NULL )
! {
! g_pService = this;
! CComPtr<IACHooks> pHooks;
! m_pDecal->get_Hooks( &pHooks );
! pHooks->QueryMemLoc (_bstr_t ("PacketComplete"), &g_lPacketCompleteCallLocation);
! pHooks->QueryMemLoc (_bstr_t ("PacketDataOffset"), &g_lPacketDataOffset);
! pHooks->QueryMemLoc (_bstr_t ("PacketSizeOffset"), &g_lPacketSizeOffset);
!
! if (g_lPacketCompleteCallLocation && g_lPacketDataOffset && g_lPacketSizeOffset)
! {
! g_lPacketCompleteProc = HookCall ((DWORD) g_lPacketCompleteCallLocation, (DWORD) PacketComplete);
! }
! else
! {
! g_lPacketCompleteCallLocation = 0; // just in case.
! hookFunctions( _hooks, 2, true );
! if( _hooks[ 0 ].m_pOldFunction != 0 )
! g_fn_recvfrom = reinterpret_cast< fn_recvfrom >( _hooks[ 0 ].m_pOldFunction );
! else if( _hooks[ 1 ].m_pOldFunction != 0 )
! g_fn_recvfrom = reinterpret_cast< fn_recvfrom >( _hooks[ 1 ].m_pOldFunction );
! else
! _ASSERTE( false );
! }
! }
!
! if (!g_lPacketCompleteCallLocation)
! {
! m_stack.start( this );
! }
// Start all of the network filters
***************
*** 89,115 ****
void cNetService::onTerminate()
{
! m_pMessage->term();
! // The release should destroy it
! m_pMessage->Release();
! m_pMessage = NULL;
! // Kill all of the network filters in reverse order
! while( !m_filters.empty() )
! {
! cFilterList::iterator i_end = ( -- m_filters.end() );
! i_end->m_p->Terminate();
! m_filters.erase( i_end );
! }
! m_filters.clear();
! m_stack.stop();
! if( g_pService == this )
! {
! hookFunctions( _hooks, 2, false );
! g_pService = NULL;
! }
}
--- 117,154 ----
void cNetService::onTerminate()
{
! m_pMessage->term();
! // The release should destroy it
! m_pMessage->Release();
! m_pMessage = NULL;
! // Kill all of the network filters in reverse order
! while( !m_filters.empty() )
! {
! cFilterList::iterator i_end = ( -- m_filters.end() );
! i_end->m_p->Terminate();
! m_filters.erase( i_end );
! }
! m_filters.clear();
! if (!g_lPacketCompleteCallLocation)
! {
! m_stack.stop();
! }
! if( g_pService == this )
! {
! if (g_lPacketCompleteCallLocation)
! {
! HookCall (g_lPacketCompleteCallLocation, g_lPacketCompleteProc);
! }
! else
! {
! hookFunctions( _hooks, 2, false );
! }
!
! g_pService = NULL;
! }
}
***************
*** 129,137 ****
cNetService::fn_recvfrom cNetService::g_fn_recvfrom = NULL;
! void cNetService::onMessage( cMessageStack::cMessage &msg )
{
_ASSERTE( m_pMessage != NULL );
! DWORD dwMessageCode = msg.getMessageCode();
if( dwMessageCode == 0xF7C7 )
m_pDecal->StartPlugins();
--- 168,176 ----
cNetService::fn_recvfrom cNetService::g_fn_recvfrom = NULL;
! void cNetService::onMessage( ACMessage &msg )
{
_ASSERTE( m_pMessage != NULL );
! DWORD dwMessageCode = msg.getType();
if( dwMessageCode == 0xF7C7 )
m_pDecal->StartPlugins();
***************
*** 139,143 ****
m_pDecal->StopPlugins();
! m_pMessage->crackMessage( msg.getBody(), msg.getBodyLength() );
// Dispatch the message to all of the network filters
--- 178,182 ----
m_pDecal->StopPlugins();
! m_pMessage->crackMessage( msg.getData (), msg.getSize () );
// Dispatch the message to all of the network filters
***************
*** 267,269 ****
--- 306,383 ----
return m_pDecal->get_Object ( strPath, IID_IDispatch, reinterpret_cast< LPVOID * > ( pVal ) );
+ }
+
+
+ void __stdcall OnPacketComplete (DWORD *pStructure)
+ {
+ static bool sFirst = true;
+
+ if (sFirst)
+ {
+ sFirst = false;
+ _ASSERTE (false);
+ }
+
+ LPBYTE pPacket = (LPBYTE) (pStructure [g_lPacketDataOffset]);
+ DWORD dwSize = pStructure [g_lPacketSizeOffset];
+ if (cNetService::g_pService)
+ {
+ HookedMessage msg (pPacket, dwSize);
+ cNetService::g_pService->onMessage (msg);
+ }
+ }
+
+ void __declspec (naked) PacketComplete ()
+ {
+ _asm
+ {
+ push ecx
+
+ push ecx
+ call OnPacketComplete
+
+ pop ecx
+
+ jmp g_lPacketCompleteProc
+ }
+ }
+
+ // Returns the function which previously was being called, after replacing it with the new call.
+ DWORD HookCall (DWORD dwCallAddress, DWORD dwReplacement)
+ {
+ DWORD* pTemp = (DWORD *) (dwCallAddress + 1);
+
+ HANDLE hProcess = OpenProcess
+ (
+ PROCESS_VM_WRITE | PROCESS_VM_OPERATION,
+ FALSE,
+ GetCurrentProcessId ()
+ );
+
+ DWORD dwOriginal = 0;
+
+ if (hProcess)
+ {
+ dwOriginal = (*pTemp) + dwCallAddress + 5;
+
+ DWORD dwTemp = dwReplacement - (dwCallAddress + 5);
+ if (WriteProcessMemory
+ (
+ hProcess,
+ pTemp,
+ &dwTemp,
+ sizeof (DWORD),
+ NULL
+ ))
+ {
+ }
+ else
+ {
+ dwOriginal = 0;
+ }
+
+ CloseHandle (hProcess);
+ }
+
+ return dwOriginal ;
}
|