2013-12-23 26 views
0

所以我有WSASend绕道,当然可以调用它使一切正常工作,但有些数据包(在我分析它们后)我想阻止发送,所以我不能调用原创功能。调用代码似乎知道某些事情出了问题,无论我返回什么。阻止绕道WSASend中的数据包

当一切正常时,WSASend应该返回0。具有讽刺意味的是,如果我试图阻止时返回0,则调用代码似乎在等待某个事件,使所有连接延迟并最终关闭。

代码:

int WINAPI myWSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) 
{ 
    if(lpBuffers->buf[2] == 0x66 && lpBuffers->buf[3] == 0x78) 
    { 
     FILE *fp = fopen("party_sploit.txt", "a"); 
     fprintf(fp, "0x7866 catched! len: %lu\n", lpBuffers->len); 
     for (unsigned int i = 0; i < lpBuffers->len-8; i = i + 8) 
     { 
      fprintf(fp, 
       "%02X %02X %02X %02X %02X %02X %02X %02X" 
        "\t\t%c %c %c %c %c %c %c %c\n", 

       static_cast<unsigned char>(lpBuffers->buf[i]), 
       static_cast<unsigned char>(lpBuffers->buf[i+1]), 
       static_cast<unsigned char>(lpBuffers->buf[i+2]), 
       static_cast<unsigned char>(lpBuffers->buf[i+3]), 
       static_cast<unsigned char>(lpBuffers->buf[i+4]), 
       static_cast<unsigned char>(lpBuffers->buf[i+5]), 
       static_cast<unsigned char>(lpBuffers->buf[i+6]), 
       static_cast<unsigned char>(lpBuffers->buf[i+7]), 
       (drawable(lpBuffers->buf[i])) ? static_cast<unsigned char>(lpBuffers->buf[i]) : '.', 
       (drawable(lpBuffers->buf[i+1])) ? static_cast<unsigned char>(lpBuffers->buf[i+1]) : '.', 
       (drawable(lpBuffers->buf[i+2])) ? static_cast<unsigned char>(lpBuffers->buf[i+2]) : '.', 
       (drawable(lpBuffers->buf[i+3])) ? static_cast<unsigned char>(lpBuffers->buf[i+3]) : '.', 
       (drawable(lpBuffers->buf[i+4])) ? static_cast<unsigned char>(lpBuffers->buf[i+4]) : '.', 
       (drawable(lpBuffers->buf[i+5])) ? static_cast<unsigned char>(lpBuffers->buf[i+5]) : '.', 
       (drawable(lpBuffers->buf[i+6])) ? static_cast<unsigned char>(lpBuffers->buf[i+6]) : '.', 
       (drawable(lpBuffers->buf[i+7])) ? static_cast<unsigned char>(lpBuffers->buf[i+7]) : '.' 
      ); 
     } 
     fprintf(fp, "\n-------------------------------------------------------------------\n"); 
     fclose(fp); 
     if(lpBuffers->len < 26) 
     { 
      lpNumberOfBytesSent = (LPDWORD)lpBuffers->len; 
      return 0; 
     } 
     else 
     { 
      return (oWSASend)(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine); 
     } 
    } 
    else 
    { 
     //No filtered packet recieved, proceed 
     return (oWSASend)(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine); 
    } 
} 
+0

人?请即时尝试修复攻击我的游戏服务器.. – LemoniscooL

回答

0

中的answere其实很简单......我忘了取消引用指针lpNumberOfBytesSent,我还添加了一个如果 - 不空出于安全原因

if(lpBuffers->len != NULL && lpBuffers->len < 26) 
{ 
    *lpNumberOfBytesSent = lpBuffers->len; 
    return 0; 
} 
else 
{ 
    return (oWSASend)(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine); 
}