繁体   English   中英

修改recv的buffer数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM