我是不是Hook到了recv ?可我得不到数据包的数据。我想得到数据包后,更改些数据,再让系统把数据抛给被勾的程序。
int _stdcall new_recv(SOCKET s,char FAR *buf,int len,int flags)
{
CString str1(buf);//str1一直为空,本函数也一直会被调用
TRACE("recv\n");
return 1;
return recv(s,buf,len,flags);
}
HHOOK m_hook;
DWORD dwCurrentPID = 0;
BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2];
DWORD dwSize;
DWORD pRecv = 0;
HHOOK m_hook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyWndProc,AfxGetApp()->m_hInstance,GetWindowThreadProcessId(IE,NULL));
LRESULT CALLBACK MyWndProc ( int nCode,WPARAM wParam, LPARAM lParam)
{
HINSTANCE hLib = LoadLibrary( "ws2_32.dll" );
pSend = (DWORD)GetProcAddress( hLib, "send" );
pRecv = (DWORD)GetProcAddress( hLib, "recv" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
}
int _stdcall new_recv(SOCKET s,char FAR *buf,int len,int flags)
{
CString str1(buf);//str1一直为空,本函数也一直会被调用
TRACE("recv\n");
return 1;
return recv(s,buf,len,flags);
}
HHOOK m_hook;
DWORD dwCurrentPID = 0;
BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2];
DWORD dwSize;
DWORD pRecv = 0;
HHOOK m_hook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyWndProc,AfxGetApp()->m_hInstance,GetWindowThreadProcessId(IE,NULL));
LRESULT CALLBACK MyWndProc ( int nCode,WPARAM wParam, LPARAM lParam)
{
HINSTANCE hLib = LoadLibrary( "ws2_32.dll" );
pSend = (DWORD)GetProcAddress( hLib, "send" );
pRecv = (DWORD)GetProcAddress( hLib, "recv" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
}
解决方案 »
- 怎样 实现 两个colesafearray拷贝
- 在VC中,GDI+的几个函数
- ListCtrl控件中的CheckBox问题
- 如何动态的改变位图的大小?
- 再问:如何取得当前的workspace 文件及路径?
- 紧急在线提问:如何取得,修改CListCtrl控件的值??
- 为什么CRecordset类打开的记录集为只读?
- ?父窗口对话框中列表视图clistctr中第三列的数值传递到子窗口的字符串变量,怎么传递啊,数值是一组有多行,哪位朋友帮帮我,急
- 在内存DC中创建的内存位图(卫星图象),BitBlt到窗口后却变成四幅,而绘制的地图却正常...
- 为何无人帮助我?是否可以通过Windows API函数监测到当前系统是否连接到打印机?
- PDF版的VC++技术内幕无法使用???
- 请问最近打开的文档是存在哪里的?
2.下面这个函数应该修改:
int _stdcall new_recv(SOCKET s,char FAR *buf,int len,int flags)
{
CString str1(buf);//str1一直为空,本函数也一直会被调用
TRACE("recv\n");
//恢复API头8个字节
WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_receiveAddress,
(void*)g_dwOldBytes, sizeof( DWORD )*2, NULL );
recv(s,buf,len,flags);
//写入跳转语句,继续Hook
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_receiveAddress,
(void*)g_btNewBytes, sizeof(DWORD)*2,NULL);
return 1;
}
3.最好加上同步
recv(s,buf,len,flags); 把数据得到了,保存进了buf,我更改后,如何再放进应用程序里?比如:应用程序本来接收的是'a',我就截获到数据包(按上面的方法),然后我就更改数据,把
'a'改成'b'.这样应用程序认为接收的是'b'
有些懂了我目前
int _stdcall new_recv(SOCKET s,char FAR *buf,int len,int flags)
{
//...
recv(s,buf,len,flags);
CString str1(buf);//str1一直为空。
//...
}
不知道是不是我的WriteProcessMemory参数写错了