2011년 7월 2일 토요일

Scapy 사용중 발생하는 Scapy_Exception 오류

Scapy 를 사용하다, Exception 이 발생하였는데 이상하게도 발생된 Scapy_Exception 이
정의되어 있지 않다는 다음과 같은 메시지가 나타났다.

  File "/usr/local/lib/python2.7/site-packages/scapy/utils.py", line 472, in rdpcap
    return PcapReader(filename).read_all(count=count)
  File "/usr/local/lib/python2.7/site-packages/scapy/utils.py", line 563, in __init__
    RawPcapReader.__init__(self, filename)
  File "/usr/local/lib/python2.7/site-packages/scapy/utils.py", line 492, in __init__
    raise Scapy_Exception("Not a pcap capture file (bad magic)")
NameError: global name 'Scapy_Exception' is not defined

Pcap 파일이 아니라 Exception 을 발생시키려 하였는데, 정의되어 있지 않은 것이다.
이와 관련 검색해 보니 버그로 등록되어 있었고, 일단 필자는 다음과 같이 간단히
해결하였다.

문제가 발생한 utils.py 를 열고 발생된 라인 지점을 보면 다음과 같다.
앞서 블로그에서 설명한 몇 가지 것들을 볼 수 있는데, 일단 PCAP 파일의 Magic
넘버에 대해서 설명한 적이 있고, big or little endian 안에 대해 언급한 적이 있다.

[참고]
1) 리틀엔디안(Little-endian)과 빅엔디안(Big-endian)이해하기
2) PCAP 파일을 파헤쳐 보자 - 그 첫번째 이야기


코드를 보면 magic 넘버를 비교하여 이와 맞지 않으면 Scapy_Exception 을 발생시킨다.

        if magic == "\xa1\xb2\xc3\xd4": #big endian
            self.endian = ">"
        elif  magic == "\xd4\xc3\xb2\xa1": #little endian
            self.endian = "<"
        else:
            raise Scapy_Exception("Not a pcap capture file (bad magic)")
        hdr = self.f.read(20)
        if len(hdr)<20:
            raise Scapy_Exception("Invalid pcap file (too short)")
        vermaj,vermin,tz,sig,snaplen,linktype = struct.unpack(self.endian+"HHIIII",hdr)

그런데 이 Scapey_Exception 정의가 utils.py 에 정의되어 있지 않은 것이다. utils.py 에서
아래와 같이 시작줄에서 로드해 주면 된다.

from error import Scapy_Exception,log_runtime,log_loading,log_interactive

그리고 다시 실행해 보면 이제는 이전과 다른 메시지가 나타난다.

  File "/usr/local/lib/python2.7/site-packages/scapy/utils.py", line 493, in __init__
    raise Scapy_Exception("Not a pcap capture file (bad magic)")
Scapy_Exception: Not a pcap capture file (bad magic)

즉, 정상적으로 처리된 것이다. 이제는, 사용하는 프로그램에서 해당 Exception 이
발생할 경우 어떻게 처리할 것인지만 정의해 주면, 에러없이 깔끔하게 사용이 가능하다.

가끔, 오픈 소스들을 사용하다보면 예기치 않은 문제가 발생하곤 한다. 이런 문제가
해결될때까지 기다리는 방법도 있지만, 간단한 것은 본인 스스로 직접 해결해 보려고
노력하면 해당 프로그램을 이해하는데도 좋고, 스킬업 하는데 도움이 될 것이다.

P.S 참고로 사용했던 버전은 2.1.0 이며, 최근 버전에는 이 부분이 해결되었는지 확인해 보지 못했다.

/Rigel

댓글 없음:

댓글 쓰기