[완료]libnet 관련 질문입니다. arp 패킷을 브로드캐스트로 쏴서 살아있는 Host에게 응답받아 포트스캔 하는 주제입니다.
#include
int main(int argc, char *argv[])
{
int c; // 반환값 체크용 변수.
u_int32_t src, dst; // 발신자/수신자 IP 주소를 저장.
libnet_t *l; // libnet 객체
libnet_ptag_t t; // protocol tag..라는데.
char *device = NULL; // 네트워크 카드 이름..을 저장
u_int8_t *packet; // 패킷 데이터
u_int32_t packet_s; // 패킷 길이.
char errbuf[LIBNET_ERRBUF_SIZE]; // 에러메시지 저장용
libnet_ether_addr* src_mac_addr; // 내 컴퓨터의 mac 주소를 담을 변수.
// 브로드캐스팅은 전부 0xFF다. 숫자가 다 똑같으니 바이트오더 걱정할 필요도 없구나.
u_char broadcast_mac[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
printf("libnet 1.1 packet shaping: ARP[link -- autobuilding ethernet]\n");
if (argc > 1)
{
device = argv[1];
}
// libpcap이 그렇듯이, 관리자 권한을 얻지 못하면 실패한다.
l = libnet_init(
LIBNET_LINK_ADV, /* injection type */
device, /* network interface */
errbuf); /* errbuf */
if (l == NULL)
{
fprintf(stderr, "%s", errbuf);
exit(EXIT_FAILURE);
}
else
// 내 컴퓨터의 IP주소 구하기.
src = libnet_get_ipaddr4(l);
// 이 부분은 문제가 좀 있는데.. 인텔 CPU와 같은 바이트오더(LE)에서만 값이 제대로 들어간다.
// PPC나 뭐.. 여튼 문제가 가능성이 많지만 귀찮으니까 그냥 써야지.
// 192.168.1.101(내 놋북 IP)
dst = (192) + (168<<8) + (1<<16) + (101<<24);
// 내 컴퓨터의 mac 주소 구하기.
src_mac_addr = libnet_get_hwaddr(l);
t = libnet_autobuild_arp(
ARPOP_REQUEST, /* operation type */
src_mac_addr->ether_addr_octet, /* sender hardware addr */
(u_int8_t *)&src, /* sender protocol addr */
broadcast_mac, /* target hardware addr */
(u_int8_t *)&dst, /* target protocol addr */
l); /* libnet context */
// 이 밑으로는 전부 arp_new.c와 같음.
if (t == -1)
{
fprintf(stderr, "Can't build ARP header: %s\n", libnet_geterror(l));
goto bad;
}
t = libnet_autobuild_ethernet(
broadcast_mac, /* ethernet destination */
ETHERTYPE_ARP, /* protocol type */
l); /* libnet handle */
if (t == -1)
{
fprintf(stderr, "Can't build ethernet header: %s\n",
libnet_geterror(l));
goto bad;
}
if (libnet_adv_cull_packet(l, &packet, &packet_s) == -1)
{
fprintf(stderr, "%s", libnet_geterror(l));
}
else
{
fprintf(stderr, "packet size: %d\n", packet_s);
libnet_adv_free_packet(l, packet);
}
c = libnet_write(l);
if (c == -1)
{
fprintf(stderr, "Write error: %s\n", libnet_geterror(l));
goto bad;
}
else
{
fprintf(stderr, "Wrote %d byte ARP packet from context \"%s\"; "
"check the wire.\n", c, libnet_cq_getlabel(l));
}
libnet_destroy(l);
return (EXIT_SUCCESS);
bad:
libnet_destroy(l);
return (EXIT_FAILURE);
}
-----------------------------------------------------------------------------------
위 소스는 제가 짠게 아니고 http://hoppang.net/src/arprequest.c 의 소스입니다.
컴파일을 하려 하는데 컴파일이 되지 않네요
libnet_ether_addr* src_mac_addr; 이부분 struct libnet_ether_addr* src_mac_addr;으로 수정했
구여 gcc -o arp arp.c 일케 컴파일 했는데 되지 않네요
libnet 컴파일할때는 옵션이 따로 있는건가요?
libnet에 문외한이라서 나름 주석보면서 분석해보기는 했는데 확실하지 않아서 질문드립니다.
위 소스가 하는일이 자신의 PC가 속해있는 네트워크(서브넷) 상의 모든 pc에게 arp패킷을 생성하여
쏘는 역활을 하는 소스가 맞는지 질문드립니다.
악
제발 아시는분 리플좀 달아주세요.
급해요 :-)
컴팔할때
컴팔할때 오류메세지를 같이 올려주면 더 빠르고 정확한 답변을 받을겁니다.
소스파일올릴때
인생은 도박이다.
해결했습니다
감사합니다^^ㅎㅎ
댓글 달기