2017-03-29 15 views
2
내가 패킷을 생성하고 패킷을가 ICMP 보내 작동 스크립트에 시도
#!/usr/bin/python 

import time 
import random 
import struct 
import select 
import socket 


def chk(data): 
    x = sum(x << 8 if i % 2 else x for i, x in enumerate(data)) & 0xFFFFFFFF 
    x = (x >> 16) + (x & 0xFFFF) 
    x = (x >> 16) + (x & 0xFFFF) 
    return struct.pack('<H', ~x & 0xFFFF) 


def ping(addr, timeout=1, number=1, data=b''): 
    conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) 
    payload = struct.pack('!HH', random.randrange(0, 65536), number) + data 

    conn.connect((addr, 80)) 
    conn.sendall(b'\x08\0' + chk(b'\x08\0\0\0' + payload) + payload) 
    start = time.time() 

    while select.select([conn], [], [], max(0, start + timeout - time.time()))[0]: 
     data = conn.recv(65536) 
     if len(data) < 20 or len(data) < struct.unpack_from('!xxH', data)[0]: 
      continue 
     if data[20:] == b'\0\0' + chk(b'\0\0\0\0' + payload) + payload: 
      return time.time() - start 


if __name__ == '__main__': 
    target = raw_input("Please enter a IP Adress: ") 
    print(ping(target)) 

. 오류가 발생했습니다. 스크립트의 결과는 아래와 같습니다.역 추적 (가장 최근의 마지막 호출) 형식 오류 : 지원되지 않는 피연산자 유형 (들) +에 대한 'INT'와 'STR'

# python Pinger.py 
Please enter a IP Adress: 89.1.3.2 
Traceback (most recent call last): 
    File "Pinger.py", line 35, in <module> 
    print(ping(target)) 
    File "Pinger.py", line 22, in ping 
    conn.sendall(b'\x08\0' + chk(b'\x08\0\0\0' + payload) + payload) 
    File "Pinger.py", line 11, in chk 
    x = sum(x << 8 if i % 2 else x for i, x in enumerate(data)) & 0xFFFFFFFF 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

TypeError 및 Traceback을 해결하는 데 도움이 될 수 있습니까?

+0

'payload'의 내용은 문자열이고,'chk'에 보낸 내용의 나머지 부분은 정수로 평가되는 요소가 있고 문자열로 비트 시프트 된 정수를 추가하려고합니다. 'sum'은 무엇을하는지). 또는'sum'에 보낸 첫 번째 요소는 문자열이 될 수 있습니다.이 값을 기본 시작 값인 0에 추가하려고합니다. 아마 그럴 가능성이 큽니다. – TigerhawkT3

+0

실패 할 경우'data'의 값은 무엇입니까? –

+0

파이썬 2.7 ['struct.pack'] (https://docs.python.org/2/library/struct.html#struct.pack)은'str'을 반환합니다. 3.6에서 it [returns'bytes'] (https://docs.python.org/3/library/struct.html#struct.pack) –

답변

0

checkout this!

data = b'\0\0\0\0' 

list(enumerate(data)) 
>>> [(0, '\x00'), (1, '\x00'), (2, '\x00'), (3, '\x00')] 

당신은 + 연산자를 사용할 수 있습니다, 여기

x = sum(x << 8 if i % 2 else x for i, x in enumerate(data)) & 0xFFFFFFFF 
     ^<< also raise TypeError ^this is str 

같아요 기능 sumTypeError의 이유를 놓쳤다.

+0

enumarate (data)에서 x로 어떻게 바꿀 수 있습니까? int? x = sum (x << i % 2 if i의 경우 x, int의 x (enumerate (data))) 및 0xFFFFFFFF가 수정되지 않았습니다. – user1532437

+0

1. int로 캐스트. 'int (x)' 2.'map'을 사용합니다. '열거하십시오 (지도 (int, 자료))'. 그 전에 모든 데이터 요소를 int로 형변환 할 수 있습니다. – Ho0ony