2012-10-18 11 views

답변

2

설명서는 숫자로 임의의 옵션을 설정하는 방법을 설명하지 않습니다.

str 대신 int을 전달하면 코드를 찾아 보니 TCPOptionsField.i2m처럼 보이게 할 수 있습니다. 따라서 28과 같은 곳에 MSS을 사용해보세요. 나머지 옵션 필드를 길이, 즉 UTO + 입상의 상위 바이트, 그 다음 하위 바이트로 문자열로 구성해야합니다.

또는 그냥 처리하는 코드를 수정 :

내가 당신이 원하는 것은 TCPOptions이 scapy/층/inet.py에 튜플 생각 :

TCPOptions = (
      { 0 : ("EOL",None), 
      ... 
      28 : ("UserTimeout",!H) 
      }, 
      { "EOL":0, 
      ... 
      "UserTimeout":28, 
      }) 

이 그럼 당신은 (희망)을 설정할 수 있습니다 UTO는 MSS를 설정하는 것과 같은 방법입니다.

어느 쪽이든, 결과를 옵션 값으로 전달하기 전에 1 비트 단위 및 15 비트 시간 초과를 작성해야합니다. 그러나 bool과 tuple의 튜플을 변경하는 것보다 간단하다고 생각합니다. int를 옵션 값으로 사용하고 TCP 내에서 구성합니다.

물론 양쪽 모두에서 커널을 패치하고 간섭을 일으키지 않는 네트워크에 알 수없는 TCP 옵션을 설치하거나 삭제하는 장치가 없으면 매우 흥미 롭습니다.

+0

코드를 조사해 주셔서 감사합니다. 나는 scapy 소스 코드를 변경하지 않고 이것을 할 수있는 더 쉬운 방법이 있기를 희망했다. 내 장치 중 하나에있는 스택이 정확히이 옵션을 들여다보아야한다는 요구 사항이 있습니다. 그저 작동하는지 확인하고 싶습니다. 나는 이것을 시도하고 그것이 효과가 있기를기도 할 것이다. – user1295872

+0

또한 값을 문자열로 전달해야한다고 말하면 16 진수 블록을 의미합니까? 예를 들어, 30 초의 시간 초과를 원한다면, 옵션 필드의 16 진수 값은 9E (4의 길이, 0의 입상 비트, 30의 제한 시간 뒤에 있음)가됩니다. 그렇다면 옵션 값을 '0x9E'로 설정하면됩니까? – user1295872

+0

첫째, scapy 소스 코드를 변경할 필요가 없습니다. 옵션을'int'로 전달할 수 있습니다; 근원을 바꾸는 것이 더 쉬울 것 같았습니다. 둘째, 9E는 어디서 얻었습니까? 8 비트 길이 4, 1 비트 0, 15 비트 30이 있습니다. 40001E입니다. 세 번째로, 아니요, string에 의해, 실제 바이트 문자열을 의미합니다. 3 바이트 문자열' '\ x40 \ x00 \ x1E' '과 8 바이트 문자열' '0x40001E'이 아닙니다. – abarnert