WinpCap을 이용해서 WireShark를 만드는데...TCP 패킷 다

bm4875의 이미지

현재 패킷의 이더넷 헤더, IP ,헤더, TCP헤더까지 추출하는데 성공 했습니다.
문제는 응용계층의 헤더를 뽑아내고 평문을 구해야 하는데
저는 응용계층의 HTTP헤더만 뽑아내면 끝나는 게임 입니다.
그래서 HTTP헤더 까지 뽑아낸 상황이구요.
그런데 문제가 TCP 헤더 다음의 헤더가 HTTP가 붙은 헤더인지.
TCP 패킷의 연장선상인지 구분하기가 모호합니다.

방법이 없을까요?

busker의 이미지

TCP 패킷의 연장선상인지 구분하고 싶다는 생각 자체가 틀렸구요.
length에 관련된 필드의 값(데이터그램의 길이를 나타내는 값은 IP 헤더에 있음)을 얻어와서 그만큼의 바이트만 처리하면 됩니다.

참 쉽죠?

익명 사용자의 이미지

busker님 말대로 처리하면 TCP+HTTP 패킷 같은 경우에는 헤더내용을 추출하기가 쉽습니다.

지금 제가 고민하고 있는건 추출한 패킷이 'TCP+데이터'의 형태를 띠는지 'TCP+HTTP'인지 확실히 구분하는 기준을 잘모르겠어서 질문을 드린겁니다. ㅠ

gilgil의 이미지

IP header + TCP header + TCP Data
로 구성이 될 대, TCP Data의 위치 및 TCP Data 길이는 다음과 같이 구현할 수 있습니다.

bool SnoopTCP::isData(IP_HDR* ipHdr, TCP_HDR* tcpHdr, char** tcpData, int* tcpDataLen)
{
  int   tcpHdrLen   = tcpHdr->th_off * 4;
  char* _tcpData    = (char*)(tcpHdr) + tcpHdrLen;
  int   _tcpDataLen = ntohs(ipHdr->ip_len) - sizeof(IP_HDR) - tcpHdrLen;
 
  if (_tcpDataLen > 0)
  {
    if (tcpData != NULL)
      *tcpData = _tcpData;
    if (tcpDataLen != NULL)
      *tcpDataLen = _tcpDataLen;
    return true;
  }
  return false;
}