簡體   English   中英

C ++在Winsock Recv鈎上繞行-自定義數據包

[英]C++ Detour on winsock recv hooking - custom packet

我正在嘗試在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;
}

msg2不是以null終止的字符串。 實際上,它具有內部null。 因此,將strlen()strcat()與它一起使用永遠不會起作用。

同樣,您既不知道也不關心buf,已經存在的內容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;         
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM