问:怎么将截获的网络数据提交给应用程序
问:如何将截获的网络数据提交给应用程序?
各位大虾好,小弟有个问题要请教各位:
我写了个HOOK,是HOOK SDK中的recv(SOCKET s,char *buf,int len,int flags)函数的,现在的问题是我HOOK成功了,数据也截获了,但是怎么将截获的数据提交给原来的应用程序呢?
我的Recv函数如下:
//当调用SDK中的recv函数时,会改成调用我的这个函数
int _stdcall hook_receive(SOCKET s,char * buf,int len,int flags)
{
int nRet;
struct sockaddr_in m_remoteHostInformation;
int m_len;
TRACE( "进入hook_receive函数\n ");
WaitForSingleObject( g_hReceiveEvent, INFINITE );
//恢复API头8个字节
WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_receiveAddress,
( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
m_len=sizeof(m_remoteHostInformation);
int msg=::getpeername(s,(struct sockaddr* )&m_remoteHostInformation,&m_len);
TRACE( "msg=%d\n ",msg);
TRACE( "远程计算机的IP是:%s\n ",inet_ntoa(m_remoteHostInformation.sin_addr));
TRACE( "远程计算机所用的端口为:%d\n ",m_remoteHostInformation.sin_port);
//调用系统SDK的recv函数接受数据,当然这句应该放在本函数开头,这里不做讨论.
nRet=::recv(s,buf,len,flags);
TRACE( "接收到的字节数nRet=%d\n ",nRet);
TRACE( "SOCKET=0x%8x\n ",s);
TRACE( "len=%d\n ",len);
//???????????????????????????????????????????????????????
/*
*如何将buf中的数据提交给它本来的进程呢?
*
*/
//????????????????????????????????????????????????????????
//写入跳转语句,继续Hook
WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_receiveAddress,
( void* )g_btNewBytes, sizeof( DWORD )*2, NULL );
SetEvent( g_hReceiveEvent );
return nRet;
}
------解决方案--------------------
ouyh12345(五岭散人) ( ) 信誉:100 Blog 2007-03-16 16:04:20 得分: 0
截获的ip包里有目的地址和目的端口,把数据包发过去
光发数据包就可以吗? 如何解析?
顺利问 呵呵~
------解决方案--------------------
数据包的解析要看是什么协议了
一般是先解IP包
判断是什么应用层协议,在具体解包
------解决方案--------------------
在你的要接受的程序里创建一个内存影射区比如名字叫share,
然后在拦截函数里用CreateMapFile指定名字为share来打开该映射内存,如果有多个进程同时要往里写数据的话,最好再创建个互斥体来调节以下他们的顺序。
比如在你的拦截函数中:
HANDLE hHookMainAliveEvent = pfnCreateEvent(NULL, TRUE, TRUE, szHookMainAliveEvent); //这里就是你创建的内存隐射的名字,
pfnWriteProcessMemory(CurrentProcessHandle, Rpm-> lpFunAddr, (LPCVOID)Rpm-> szOldCode, 12, NULL);//直接往里写你拦截到的数据就可以了。
具体可以到我的blog看看去吧。
各位大虾好,小弟有个问题要请教各位:
我写了个HOOK,是HOOK SDK中的recv(SOCKET s,char *buf,int len,int flags)函数的,现在的问题是我HOOK成功了,数据也截获了,但是怎么将截获的数据提交给原来的应用程序呢?
我的Recv函数如下:
//当调用SDK中的recv函数时,会改成调用我的这个函数
int _stdcall hook_receive(SOCKET s,char * buf,int len,int flags)
{
int nRet;
struct sockaddr_in m_remoteHostInformation;
int m_len;
TRACE( "进入hook_receive函数\n ");
WaitForSingleObject( g_hReceiveEvent, INFINITE );
//恢复API头8个字节
WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_receiveAddress,
( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
m_len=sizeof(m_remoteHostInformation);
int msg=::getpeername(s,(struct sockaddr* )&m_remoteHostInformation,&m_len);
TRACE( "msg=%d\n ",msg);
TRACE( "远程计算机的IP是:%s\n ",inet_ntoa(m_remoteHostInformation.sin_addr));
TRACE( "远程计算机所用的端口为:%d\n ",m_remoteHostInformation.sin_port);
//调用系统SDK的recv函数接受数据,当然这句应该放在本函数开头,这里不做讨论.
nRet=::recv(s,buf,len,flags);
TRACE( "接收到的字节数nRet=%d\n ",nRet);
TRACE( "SOCKET=0x%8x\n ",s);
TRACE( "len=%d\n ",len);
//???????????????????????????????????????????????????????
/*
*如何将buf中的数据提交给它本来的进程呢?
*
*/
//????????????????????????????????????????????????????????
//写入跳转语句,继续Hook
WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_receiveAddress,
( void* )g_btNewBytes, sizeof( DWORD )*2, NULL );
SetEvent( g_hReceiveEvent );
return nRet;
}
------解决方案--------------------
ouyh12345(五岭散人) ( ) 信誉:100 Blog 2007-03-16 16:04:20 得分: 0
截获的ip包里有目的地址和目的端口,把数据包发过去
光发数据包就可以吗? 如何解析?
顺利问 呵呵~
------解决方案--------------------
数据包的解析要看是什么协议了
一般是先解IP包
判断是什么应用层协议,在具体解包
------解决方案--------------------
在你的要接受的程序里创建一个内存影射区比如名字叫share,
然后在拦截函数里用CreateMapFile指定名字为share来打开该映射内存,如果有多个进程同时要往里写数据的话,最好再创建个互斥体来调节以下他们的顺序。
比如在你的拦截函数中:
HANDLE hHookMainAliveEvent = pfnCreateEvent(NULL, TRUE, TRUE, szHookMainAliveEvent); //这里就是你创建的内存隐射的名字,
pfnWriteProcessMemory(CurrentProcessHandle, Rpm-> lpFunAddr, (LPCVOID)Rpm-> szOldCode, 12, NULL);//直接往里写你拦截到的数据就可以了。
具体可以到我的blog看看去吧。