2.2 - 현재 까지 진행 상황

프로그래밍/패킷 캡쳐 2009. 6. 5. 14:45

강의식으로 포스팅을 올려놓으려니 상당히 힘드네요... 일단은 제가 힘들지 않게 포스팅을 해야 겟습니다...

소스는 필요하신분이 계시면 올리겟지만 (별로 그럴일은 없겟지만요 ^^;;) 특별한 상황이 아니면 그냥

현재 상황만 올리는 쪽으로 하려고 합니다. 그리고 현재 이 프로젝트는 모든것이 순전히 제 생각에서 나온 것이므

로 옳지 않은 것일 수 있습니다. (아마 대부분 그럴겁니다 :< ) 제 포스팅을 읽으시는분께서는 그런것을 잘 걸러서 보시면 좋을 것 같네요 ^^;



일단 목표를 다시 생각해보죠.

1. 패킷을 잡아 프로세스별로 저장한다.
2. 프로세스별로 저장된 파일을 불러와 특정한 룰에 의해 그룹을 한다.
3. 정형화된 알고리즘을 수정하여 내 의도에 맞게끔 적용시킨다.

제 프로젝트를 다음과 같이 3개의 단계로 나누고 현재는 그중에 1단계만 부분적으로 완성되었습니다.

1단계. 패킷을 잡아 프로세스별로 저장한다.  이것을 풀어서 얘기해보죠 여러가지 생각을 해봐야 할 것 같습니다.
-a. 일단 어떤 프로토콜을 잡을것인가 TCP ? UDP ? ICMP ? 등등...
-b. 얼마나 잡을 것인가? 패킷을 잡자 마자 바로 파일에 누적 시킬것인가? 10MB정도의 패킷이 쌓이면파일에 쓸 것인가?
-c. 패킷에는 프로세스의 이름 정보가 없는데 어떻게 알아낼 것인가?
-d. 파일에는 어떤 데이터를 어떻게 쓸 것인가?

이러한 의문점들이 생깁니다.  case by case 로 몇개만 집고 넘어 가보겟습니다.

-a. 일단 TCP 프로토콜만 잡으려고 합니다. 가장 많이 사용되고 잇다고 변명을 해보지만 UDP가 상당히 골치가
아픈 관계로 지금은 TCP만 해보려고 합니다. (TCP도 상당히 골치 아픈건 마찬가지입니다 ㅠ_ㅠ)

-b. 상당히 고민이 많이 되는 부분입니다. 이 부분에 대해서는 서버와 클라이언트의 연결이 설정된 뒤에
10개의 패킷 혹은 FIN 패킷이 발생될 때 까지의 데이터만 사용하기로 했습니다.

-c. iphlpapi 를 이용하였습니다. 이 라이브러리를 사용하여 도스커맨드의 "netstat -nao" 라고 입력햇을때
나오는 테이블의 내용을 얻을 수 있습니다.

-d. 데이터를 저장하기 위해 TCP TABLE이라는 구조체를 만들었습니다. TCP Table에 간단하게 설명하자면
각 노드마다 Head와 Tail이라는 데이터형을 갖고 있습니다. Head의 데이터는 두 호스트가 SYN 으로 연결을
맺을시 Packet 상태를 저장하고 해당 연결에서 발생하는 데이터들을 Tail로 명하고 Head에 줄줄이 연결
시켯습니다. 그리고 Tail이 10개가 되거나 해당 Flow에서 FIN이 발생하면 파일에 저장하는 방식을 사용했습니다.


이제 대충 1단계에 대한 정리가 된 것 같습니다. 위 내용을 플로우 차트로 그려봤습니다.


사용자 삽입 이미지

Fig. SYN Packet 이 발생햇을 경우 메커니즘



사용자 삽입 이미지
Fig. Reset Packet 혹은 Fin Packet이 발생햇을 경우의 메커니즘
-> 이 경우의 메커니즘은 약간의 수정이 필요합니다. 왜냐하면 Rst의 경우 에러의 소지가 다분하므로 해당 데이터
를 신뢰 할 수 없기 때문입니다. 하지만 지금은 테스트를 위해 넣어 뒀습니다.


사용자 삽입 이미지

Fig. ACK Packet이 들어왔을때 메커니즘



현재는 이렇게 3개의 메커니즘이 존재 합니다. 예리하신분이 계시다면 FIN+ACK가 들어 오면 어떻게 될 것인가?
라고 생각하신 분이 계실 수 있겟지만 if-else로 각각 중복되지 않게 다 처리 해놨습니다 'ㅡ'

다음은 테스트 결과 입니다.

사용자 삽입 이미지
Fig. Console 에서의 테스트


사용자 삽입 이미지

Fig. MFC에서의 테스트

역시 UI가 잇는게 데이터를 눈에 보기 좋은 것 같습니다. MFC의 경우 아래 잇는 List Control이 TCP Table이 되겟습니다.


1차적으로 Part 1부분을 완성햇다고는 하지만 아직 수정되어야 할 부분이 있습니다.

-a. 현재는 IExplorer 만 이용하여 svchost만 잡히는데 다른 프로그램도 테스트를 해봐야 합니다.
-b. 과연 SYN으로 연결된 데이터만 Tcp Table의 Head가 될 수 있는가? 프로그램이 실행되기 전에 연결을 맺고
통신하는 프로그램은 TCP Table에 등록이 안되고 등록이 안되면 계속 못잡기 때문이죠...



어찌어찌 1단계 부분은 초안은 완성 된것 같습니다. 좀더 다듬는 과정이 필요할 것 같군요.
이제 2단계 작업도 슬슬 들어 가야 하는데 어떻게 하면 효율적으로 데이터들을 그룹화 할까에 많은 시간을
할애 할 것 같습니다. ^^
: