BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2];
DWORD pSend = 0,pRecv = 0,dwSize = 0;
HMODULE hLib =NULL;
hLib = LoadLibrary( "ws2_32.dll" );
pSend = (DWORD)GetProcAddress( hLib, "send" );
pRecv = (DWORD)GetProcAddress( hLib, "recv" );
::ReadProcessMemory(INVALID_HANDLE_value, (void *)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send;
::WriteProcessMemory(INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
网上看到的代码,参数INVALID_HANDLE_value什么意思?new_send该是我自己的send函数的地址吗?
请高手仔细讲讲ReadProcessMemory和WriteProcessMemory函数,谢谢~
最好有源代码 rageliu@sina.com 发给我一份 再次感谢!!我qq号 80719107
解决就给分~~大家讨论也可以~在线等.............................
具体组好自己看MSDN,ReadProcessMemory的声明为:
BOOL ReadProcessMemory(
HANDLE hProcess, // handle to the process
LPCVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
DWORD nSize, // number of bytes to read
LPDWORD lpNumberOfBytesRead // number of bytes read
);
WriteProcessMemory规格类似,就不说了。
在windows里面不能随意读写内存,比如代码段的内存,也不能读些其他进程的内存空间。当要进行这个操作的时候,就要用到这两个函数。
INVALID_HANDLE_VALUE是ms定义的宏,在这里应该是使用这段代码所用的进程。
new_send就是你自己的send,btNewBytes内存块一般是存放以下代码:
mov eax,new_send
jump eax
这样程序在执行send的时候就跳转到你自己的send里头了。
up
应该考虑SPI或是RAW SOCKET.
网游一般都是SOCKET
要考虑WSASend才是真的