Usage:
python pid_pcap.py [PID] [INTERFACE] [FILE_NAME]
tcpdump 와 짧은 파이썬 스크립트를 이용해 특정 프로세스의 패킷만 캡쳐하도록 했다.
원래 디버깅용으로 짜려 만든거라 소스가 상당히 난잡하다.
중간고사 끝나고 strace 를 이용해 소켓 함수 후킹을 통해 raw string 을 뽑아내는 식으로도 만들어볼 예정이다.
pid_pcap.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | # -*-coding:utf-8-*- import sys def get_process_port(pid): command = 'netstat -nap | grep ' command += str(pid) import commands status, output = commands.getstatusoutput(command) addr_list = [] for i in output.split(' '): if i.find(':') == -1: pass else: addr_list.append(i) # print addr_list.split(':')[1] port_list = [] for i in addr_list: result = i.split(':') port_list.append(result[1]) del addr_list try: if port_list[len(port_list) - 1] == '*': port_list.pop() except IndexError: print "PROCESS ISN'T USING PORT! OR, WRONG PID" exit(1) return port_list def make_command(interface, port_list, file_name): comm = "sudo tcpdump -i %s -w %s " % (interface, file_name) for port in port_list: comm += "port %s or " % port comm = comm[:len(comm) - 4] return comm if __name__ == "__main__": DEBUG = False # get pid from argv try: pid = sys.argv[1] interface = sys.argv[2] file_name = sys.argv[3] except IndexError: print '%s [PID] [INTERFACE] [FILE_NAME]' % sys.argv[0] print "Ex) %s 1234 eth0 packets.pcap" % sys.argv[0] if DEBUG is True: pid = 6191 interface = "wlan0" else: exit() port_list = get_process_port(pid) comm = make_command(interface, port_list, file_name) import os os.system(comm) # sudo tcpdump -w packets.pcap -i eth0 port 8080 # sudo tcpdump -i wlan0 -w asdf.pcap port 8080 or port 80 | cs |
'Python' 카테고리의 다른 글
Ubuntu 에서 Python 버전 올리기 (2.7.6 -> 2.7.11) (0) | 2016.01.18 |
---|---|
클래스 다중상속 및 @classmethod (0) | 2015.10.14 |
스택 with Linked List (0) | 2015.05.08 |
게임서버 최종 소스 (0) | 2015.05.08 |
쓰레드를 이용한 다중 클라이언트 소켓 (0) | 2015.05.05 |