현재 패킷의 이더넷 헤더, IP ,헤더, TCP헤더까지 추출하는데 성공 했습니다. 문제는 응용계층의 헤더를 뽑아내고 평문을 구해야 하는데 저는 응용계층의 HTTP헤더만 뽑아내면 끝나는 게임 입니다. 그래서 HTTP헤더 까지 뽑아낸 상황이구요. 그런데 문제가 TCP 헤더 다음의 헤더가 HTTP가 붙은 헤더인지. TCP 패킷의 연장선상인지 구분하기가 모호합니다.
방법이 없을까요?
TCP 패킷의 연장선상인지 구분하고 싶다는 생각 자체가 틀렸구요. length에 관련된 필드의 값(데이터그램의 길이를 나타내는 값은 IP 헤더에 있음)을 얻어와서 그만큼의 바이트만 처리하면 됩니다.
참 쉽죠?
busker님 말대로 처리하면 TCP+HTTP 패킷 같은 경우에는 헤더내용을 추출하기가 쉽습니다.
지금 제가 고민하고 있는건 추출한 패킷이 'TCP+데이터'의 형태를 띠는지 'TCP+HTTP'인지 확실히 구분하는 기준을 잘모르겠어서 질문을 드린겁니다. ㅠ
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; }
www.gilgil.net
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
TCP 패킷에 대해 좀 더 공부해보세요.
TCP 패킷의 연장선상인지 구분하고 싶다는 생각 자체가 틀렸구요.
length에 관련된 필드의 값(데이터그램의 길이를 나타내는 값은 IP 헤더에 있음)을 얻어와서 그만큼의 바이트만 처리하면 됩니다.
참 쉽죠?
글쎼요
busker님 말대로 처리하면 TCP+HTTP 패킷 같은 경우에는 헤더내용을 추출하기가 쉽습니다.
지금 제가 고민하고 있는건 추출한 패킷이 'TCP+데이터'의 형태를 띠는지 'TCP+HTTP'인지 확실히 구분하는 기준을 잘모르겠어서 질문을 드린겁니다. ㅠ
gilgil.net
IP header + TCP header + TCP Data
로 구성이 될 대, TCP Data의 위치 및 TCP Data 길이는 다음과 같이 구현할 수 있습니다.
www.gilgil.net
댓글 달기