C ++绕过winsock recv挂钩 - 自定义数据包

时间:2015-05-13 23:30:41

标签: c++ recv detours

我正在尝试在MyRecv函数中添加其他数据包,但我不知道为什么它不起作用。我试图解析传入的数据包,功能正常。 因此,我可能无法正确地向应用程序发送自定义数据包。

一般情况下,我只想将准备好的数据包发送给应用程序。 这个包是我从WPE PRO。

使用MyRecv函数的代码:

INT WINAPI MyRecv(SOCKET sock, CHAR* buf, INT len, INT flags) {
  CHAR buffer[256];

  char msg2[] = { 0x1B, 0, 0x04, 0x06, 0, 0x5A, 0x65, 0x6E, 0x74, 0x61,
                  0x78, 0x06, 0, 0x5A, 0x65, 0x6E, 0x74, 0x61, 0x78, 0x05, 0x07, 0,
                  0x66, 0x61, 0x6A, 0x6E, 0x69, 0x65, 0x65 };

  int ret = precv(sock, buf, len, flags);
  if (ret <= 0) {
    return ret;
  }

  if (fake_recv) {
    char tmp[256];
    fake_recv = false;
    printf("Fake1-> Lenght:%d Size:%d", len, strlen(buf));
    strcat(buf, msg2);
    printf("Fake2-> Lenght:%d Size:%d", len, strlen(buf));
    return ret;
  }

  return ret;
}

1 个答案:

答案 0 :(得分:0)

msg2不是以空字符结尾的字符串。实际上它有一个内部空值。因此,使用strlen()strcat()永远不会起作用。

同样地,你既不知道也不关心buf,中已有的内容,因此调用strcat()strlen()就是毫无意义和危险的:如果它根本不包含空值,那么你将会过度运行它,最好过度报告长度,最糟糕的是崩溃。

并且您没有为添加到缓冲区中的额外数据调整ret

通过声明未使用的tmp[]变量来实现无用的目的。

试试这个:

if (fake_recv) {                                        
    fake_recv = false;
    printf("Fake1-> Length:%d Received:%d", len, ret);
    int len2 = min(len-ret, sizeof msg2);
    memcpy(&buf[ret], msg2, len2);
    ret += len2;
    printf("Fake2-> Length:%d Received:%d", len, ret);
    return ret;         
}