[英]Modify buffer data of recv
我正在制作一个应用程序来操作发送和接收,用发送来做这件事很容易,但我不知道如何伪造或替换接收。
例如,我想要做的是,如果程序收到"Hello"
,过滤它并使程序相信它收到了"Bye"
。
这是我尝试过滤 recv 的代码部分:
int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags)
{
int i = 0;
int ret = pRecv(s, buf, len, flags);
while (i < ret && buf)
{
if (strncmp(buf, "Hello\0", 5) == 0)
{
strcpy(buf,"Bye\0");
}// End of if
int len = strlen(buf) +1;
buf += len;
i += len;
}//End of While
return ret;
}//End of Function
实际上这种工作,但是在收到"Hello"
之后尝试在下一个调用中执行它,这不是意图,我想替换包含"Hello"
的实际数据包并将其更改为"Bye"
通过注入 DLL 并将原始函数绕道到您的钩子函数来钩子函数。 这是我使用的 x86 绕行代码的示例。
const void* DetourFunc(BYTE* const src, const BYTE* dest, const DWORD length)
{
BYTE* jump = new BYTE[length + 5];
for (int i = 0; i < sizeof(detourBuffer) / sizeof(void*); ++i)
{
if (!detourBuffer[i])
{
detourBuffer[i] = jump;
break;
}
}
DWORD dwVirtualProtectBackup;
VirtualProtect(src, length, PAGE_READWRITE, &dwVirtualProtectBackup);
memcpy(jump, src, length);
jump += length;
jump[0] = 0xE9;
*(DWORD*)(jump + 1) = (DWORD)(src + length - jump) - 5;
src[0] = 0xE9;
*(DWORD*)(src + 1) = (DWORD)(dest - src) - 5;
VirtualProtect(src, length, dwVirtualProtectBackup, &dwVirtualProtectBackup);
return jump - length;
}
如果你无法弄清楚,最好开始研究。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.