¸®´ª½º¿¡¼ ƯÁ¤ ÇÁ·Î¼¼½º¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Â
ÆÐŶ
½º´ÏÇÎ ÇÁ·Î±×·¥ Á¦ÀÛÇϱâ
by Beist
Security Research Group
(http://beist.org)
Members of Beist Research Group : beist and anonymous people
Members of Beist Study Group : beist, dars21, obhacker, passion, p-jackpot,
jacaranda, cina
¿ä¾à: º» ¹®¼´Â
À¯Àú ·¹º§¿¡¼ ÆÐŶ Çì´õ¸¦ ºÐ¼®ÇÏ´Â ¹æ¹ý°ú ƯÁ¤ ÇÁ·Î¼¼½º¸¦ ÁöÁ¤ÇÏ¿© º¼ ¼ö ÀÖ´Â ÆÐŶ ½º´ÏÇÎ ÇÁ·Î±×·¥À» ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÕ´Ï´Ù.
1. °³¿ä
ÀÌ ¹®¼´Â ¸®´ª½º ȯ°æÀ» ´ë»óÀ¸·Î ÀÛ¼ºµÇ¾ú½À´Ï´Ù. º» ¹®¼¿¡¼ ´Ù·ê, ƯÁ¤ ÇÁ·Î¼¼½º¸¦ ÁöÁ¤ÇÏ¿© ÆÐŶÀ» ½º´ÏÇÎÇÒ ¼ö
ÀÖ´Â ÇÁ·Î±×·¥Àº ÇöÀç ½ÇÇà ÁßÀÎ ÇÁ·Î¼¼½º¿Í ½ÇÇà ½Ãų ÇÁ·Î±×·¥¿¡¼ ¹ß»ýÇÏ´Â ÆÐŶÀ» ½º´ÏÇÎÇϴµ¥ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ º» ¹®¼¿¡¼ ´Ù·ç´Â ÇÁ·Î±×·¥Àº Æ÷Æ® ±â¹ÝÀ¸·Î ¼öÇàÇÏ´Â ½º´ÏÇÎÀÌ ¾Æ´Ï¶ó ÇÁ·Î¼¼½º ±â¹ÝÀ̱⠶§¹®¿¡ ÇÑ ÇÁ·Î¼¼½º¿¡¼
¼ö½Ã·Î ´Ù¸¥ Æ÷Æ®¸¦ »ç¿ëÇÒ °æ¿ì¿¡µµ ÆÐŶ ½º´ÏÇÎÀ» Çϱâ À¯¿ëÇÕ´Ï´Ù.
º» ¹®¼¿¡¼´Â ƯÁ¤ ÇÁ·Î¼¼½º¿¡¼ »ç¿ëÇϰí ÀÖ´Â Port ¹øÈ£¸¦ ¾Ë¾Æ³»±â À§ÇÏ¿© proc file systemÀÇ ÇÁ·Î¼¼½º
Á¤º¸ µð·ºÅ丮, ³×Æ®¿öÅ· Á¤º¸ ºÐ¼® ¹æ¹ý, µ¥ÀÌÅ͸µÅ© ¾×¼¼½º
ÀÎÅÍÆäÀ̽º ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇÏ¿© ÆÐŶÀÇ Çì´õ Á¤º¸¸¦ ¾Ë¾Æ³»´Â ¹æ¹ý¿¡ ´ëÇØ ´Ù·ê °ÍÀÔ´Ï´Ù.
2. ±â¼úÀûÀÎ ³»¿ë
/proc µð·ºÅ丮¿¡¼ ÇÁ·Î¼¼½º id¿Í »ç¿ëÁßÀÎ Æ÷Æ®¹øÈ£¸¦ ÃßÃâÇÑ ÈÄ
ÇØ´ç ÇÁ·Î¼¼½º¿¡¼ ¹ß»ýÇÏ´Â ÆÐŶÀÇ Çì´õ¿Í µ¥ÀÌÅ͸¦ ºÐ¼®ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸°Ú½À´Ï´Ù. º» ¹®¼¿¡¼
¼³¸íÇÏ´Â ÇÁ·Î±×·¥Àº 2°¡Áö ¹æ½ÄÀ¸·Î ÀÛµ¿µÇ´Âµ¥, ÇÁ·Î±×·¥À»
½ÇÇàÇÒ ¶§, ÆÐŶÀ» °¨½ÃÇÒ ÇÁ·Î¼¼½º À̸§À̳ª ÇÁ·Î¼¼½º ID¸¦
ÀÔ·ÂÇÏ´Â ¹æ½ÄÀ¸·Î ÀÌ·ç¾îÁý´Ï´Ù. (¿¹:
./proc_sniff 880 or ./proc_sniff program_name) ´ÙÀ½Àº
ÇÁ·Î¼¼½º°¡ »ç¿ëÁßÀÎ Port ¹øÈ£¸¦ ¾Ë¾Æ³»´Âµ¥ ÇÊ¿äÇÑ /proc µð·ºÅ丮¿¡
´ëÇÑ ±¸Ã¼ÀûÀÎ ³»¿ëÀÔ´Ï´Ù. (º» ¹®¼¿¡¼´Â ÁÖ·Î TCP¿¡
´ëÇØ¼ ¼³¸íÇÕ´Ï´Ù.)
(1) /proc µð·ºÅ丮 ºÐ¼®
/proc µð·ºÅ丮 ³»¿¡´Â ÇÁ·Î¼¼½º Á¤º¸, Ä¿³Î Á¤º¸, ÀåÄ¡ Á¤º¸, ³×Æ®¿öÅ· Á¤º¸ µî°ú °°ÀÌ ´Ù¾çÇÑ ½Ã½ºÅÛ Á¤º¸¸¦ Æ÷ÇÔÇϰí
ÀÖÁö¸¸, ¿ì¸®°¡ °ü½É ÀÖ°Ô ºÁ¾ß ÇÒ ºÎºÐÀº /proc/PID/stat,
/proc/net/tcp ÆÄÀϰú /proc/PID/fd µð·ºÅ丮 ÀÔ´Ï´Ù. ÅØ½ºÆ® ¿¡µðÅ͸¦ »ç¿ëÇÏ¿© ÆÄÀÏÀ» Àо¸é ÇÁ·Î¼¼½º Á¤º¸¿Í ³×Æ®¿öÅ· Á¤º¸¸¦ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
1) /proc/PID/stat ÆÄÀÏ Àбâ
ÇÁ·Î±×·¥ À̸§À» ½ÇÇà ÀÎÀÚ·Î ¹Þ¾ÒÀ» °æ¿ì ½ÇÇàµÈ ÇÁ·Î±×·¥ÀÇ
ÇÁ·Î¼¼½º id °ªÀ» ÃßÃâÇϱâ À§Çؼ /proc/PID/stat ÆÄÀÏÀ»
»ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¿©±â¼ PID´Â /proc µð·ºÅ丮 ³»¿¡ ÀÖ´Â ¿©·¯ ÇÁ·Î¼¼½º ID¸¦ ¸»ÇÕ´Ï´Ù. ÇØ´ç PID(¿¹:1872) µð·ºÅ丮 ³»ÀÇ statÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇÁ·Î¼¼½º »óÅ¿¡ °ü·ÃµÈ ³»¿ëÀ» °¡Áö°í ÀÖ½À´Ï´Ù.
|
[root@localhost root]# cat /proc/1872/stat
1872 (sshd)
S 1742 1872 1872 0 -1 320 140 48 149 23 2153 982 5 0 15 0 0 0 16721 7065600
535 4294967295 134512640 1347876
80 3221219360
3221216780 3076439090 0 0 4096 73728 3222450524 0 0 17 0 0 0 2153 982 5 0
|
ÀÌ Á¤º¸¿¡¼ boldü·Î
Ç¥½ÃµÈ 2¹øÂ° Çʵ带 º¸¸é ÇÁ·Î¼¼½º À̸§ÀÌ ±â·ÏµÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ Á¤º¸¸¦ Åä´ë·Î ÇÁ·Î±×·¥ À̸§°ú /proc µð·ºÅ丮 ³»¿¡ ÀÖ´Â
¸ðµç PID µð·ºÅ丮ÀÇ stat ÆÄÀÏÀ» ºñ±³ÇÏ¿© ÇÁ·Î¼¼½º
À̸§°ú ÀÏÄ¡ÇÏ´Â ÆÄÀÏÀ» ã¾Æ ÇÁ·Î¼¼½º id¸¦ ÃßÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
2) /proc/PID/fd µð·ºÅ丮 ³» ÆÄÀÏ µð½ºÅ©¸³ÅÍ Àбâ
/proc/PID/fd µð·ºÅ丮 ³»¿¡´Â ÇØ´ç PID(¿¹:1872) ÇÁ·Î¼¼½º¿¡¼
»ç¿ëÇϰí ÀÖ´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍÀÇ Á¤º¸°¡ ÀÖ½À´Ï´Ù. ¾Æ·¡ ¿¹½Ã´Â
/proc/1872/fd µð·ºÅ丮ÀÇ ³»¿ëÀÔ´Ï´Ù.
|
[root@localhost fd]# ls –l
ÇÕ°è 0
lrwx------ 1 root root
64 3¿ù 7 19:06 0 -> /dev/null
lrwx------ 1 root root
64 3¿ù 7 19:06 1 -> /dev/null
lrwx------ 1 root root
64 3¿ù 7 19:06 2 -> /dev/null
lrwx------ 1 root root
64 3¿ù 7 19:06 3 -> socket:[2177]
|
À§ÀÇ Á¤º¸¸¦ º¸¸é 1872
ÇÁ·Î¼¼½ºÀÇ 0(Ç¥ÁØÀÔ·Â), 1(Ç¥ÁØÃâ·Â), 2(Ç¥ÁØ¿¡·¯) ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â
/dev/null·Î ¸µÅ©µÇ¾î ÀÖ½À´Ï´Ù. 3¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â ¼ÒÄÏ ÆÄÀÏ µð½ºÅ©¸³ÅÍÀ̰í
ÇØ´ç µð½ºÅ©¸³ÅÍ¿¡ ¸µÅ©µÇ¾îÀÖ´Â socket:[2177]Àº
Ä¿³Î¿¡¼ °ü¸®Çϰí ÀÖ´Â ¼ÒÄÏ ¹øÈ£ÀÎ °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹øÈ£¸¦ ÀÌ¿ëÇÏ¿© ´ÙÀ½¿¡ ¼³¸íÇÒ /proc/net µð·ºÅ丮 Á¤º¸¿Í ÇÔ²² Æ÷Æ® ¹øÈ£¸¦ ÃßÃâÇϴµ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. 1872 ÇÁ·Î¼¼½º´Â À§ÀÇ 1)¿¡¼
/proc/1872/stat ÆÄÀÏ Á¤º¸¸¦ ÅëÇØ ssh µ¥¸óÀÎ °ÍÀ» ÆÄ¾ÇÇßÀ¸¹Ç·Î 3¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â ssh Åë½ÅÀ» À§ÇÑ ÆÄÀÏ µð½ºÅ©¸³ÅÍ·Î ¿¹»óÇÒ
¼ö ÀÖ½À´Ï´Ù.
3) /proc/net Á¤º¸ ¾ò±â
IPv4¿¡ °ü·ÃµÈ /proc/net/tcp¿Í IPv6¿¡ °ü·ÃµÈ /proc/net/tcp6 ÆÄÀÏÀ» ÅëÇÏ¿© ÇöÀç Ä¿³Î¿¡¼
°ü¸® ÁßÀÎ ¼ÒÄÏÀÇ Á¤º¸¸¦ ÆÄ¾ÇÇÒ ¼ö ÀÖ½À´Ï´Ù. (º» ¹®¼´Â IPv4¸¦
´ë»óÀ¸·Î ¼³¸íÇÕ´Ï´Ù.) ´ÙÀ½ÀÇ /proc/net/tcp ÆÄÀÏÀÇ
Á¤º¸Àε¥ ssh µ¥¸ó(¼ÒÄϹøÈ£:2177)¿¡¼ »ç¿ëÇÏ´Â
¼ÒÄÏÀÇ Á¤º¸¸¸ Ç¥ÇöÇÏ°í ´Ù¸¥ ¼ÒÄÏ Á¤º¸´Â »ý·«ÇÏ¿´½À´Ï´Ù.
|
[root@localhost net]# cat tcp
0: 0100007F:0016 0100007F:0BC9 01
00000000:00000000 02:0008A351 00000000 0 0 2177 2 c2253280 43 4 1 3 -1
|
À§ÀÇ Á¤º¸¿¡¼ ÁøÇÏ°Ô ¼³Á¤µÈ ºÎºÐÀÌ ÁÖÀÇ ±í°Ô º¼ ºÎºÐÀÔ´Ï´Ù.
0100007F:0016 – ¼¹ö Ãø ³×Æ®¿öÅ© Á¤º¸¸¦ ³ªÅ¸³À´Ï´Ù.
(hex °ªÀ» 10Áø¼ö·Î
º¯È¯Çϸé 127.0.0.1:22)
0100007F:0BC9 – Ŭ¶óÀÌ¾ðÆ® Ãø ³×Æ®¿öÅ© ÁÖ¼Ò¸¦ ³ªÅ¸³À´Ï´Ù.
(hex °ªÀ» 10Áø¼ö·Î
º¯È¯Çϸé 127.0.0.1:3017)
2177 – socket ¹øÈ£ ÀÔ´Ï´Ù.
(local network¿¡¼ local networkÀ¸·Î ¿¬°áÇ߱⠶§¹®¿¡ ¼¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò°¡
°°½À´Ï´Ù.)
4) Port ¹øÈ£ ¾Ë¾Æ³»±â °úÁ¤
ÇÁ·Î±×·¥ À̸§À» ½ÇÇà ÀÎÀÚ·Î ¹Þ¾ÒÀ» °æ¿ì ÇØ´ç ÇÁ·Î±×·¥À»
½ÇÇà½ÃŲ ÈÄ¿¡, ½ÇÇàµÈ ÇÁ·Î¼¼½º°¡ »ç¿ëÇÏ´Â Port ¹øÈ£¸¦
¾Ë¾Æ³»±â À§ÇÑ ÀÛ¾÷ÀÇ °úÁ¤À» Á¾ÇÕÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.
1. ½ÇÇà ÀÎÀÚ(ÇÁ·Î±×·¥ À̸§)¿Í /proc µð·ºÅ丮¿¡ ¸ðµç /proc/PID/stat ÆÄÀÏÀÇ ÇÁ·Î¼¼½º
À̸§ Á¤º¸¸¦ ºñ±³ÇÏ¿© PID (ÇÁ·Î¼¼½º id) Á¤º¸¸¦ ¾Ë¾Æ³À´Ï´Ù..
2. ¾Ë¾Æ³½ PID(¿¹:1872)¸¦ ÅëÇØ
/proc/1872/fd ÀÇ ¼ÒÄÏ ÆÄÀÏ µð½ºÅ©¸³ÅÍ¿¡ ¸µÅ©µÈ ¼ÒÄÏ ¹øÈ£(¿¹:2177)¸¦ ¾Ë¾Æ³À´Ï´Ù.
3. /proc/net/tcp ÆÄÀÏ Á¤º¸¿¡¼ ¸µÅ©µÈ ¼ÒÄÏ ¹øÈ£(2177)À» °Ë»öÇϸé ÇØ´ç
¼ÒÄϹøÈ£ÀÇ ¼ÒÄÏ Á¤º¸¸¦ ÅëÇØ port¹øÈ£¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù. 0100007F:0016 ¿¡¼ ¡°0016¡±ÀÌ port ¹øÈ£À̰í, 10Áø¼ö·Î
º¯È¯ÇÏ¸é ¡°0022¡±°¡ port¹øÈ£ÀÓÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.
(2) Packet Çì´õ Á¤º¸ ¾ò±â
À§ÀÇ ¹æ¹ýÀ»
ÅëÇØ Port¹øÈ£¸¦ ¾Ë¾Æ³ÂÀ¸¸é ÀÌÁ¦ ÇØ´ç Port ¹øÈ£¿¡
´ëÇÑ ÆÐŶÀ» ½º´ÏÇÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ÆÐŶ Çì´õ Á¤º¸¸¦ ½º´ÏÇÎÇϱâ À§Çؼ pcap ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸, º» ¹®¼¿¡¼´Â
°ø°³µÈ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏÁö ¾Ê°í Á÷Á¢ ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇÏ¿© ÆÐŶÀÇ Çì´õ¸¦ ¼ö½ÅÇÏ´Â ¹æ¹ý¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸°Ú½À´Ï´Ù.
1) Ethernet Çì´õ ¿±â
TCP, UDP packetÀÇ °£´ÜÇÑ ±¸Á¶´Â Ethernet Çì´õ -
IP Çì´õ – TCP ȤÀº UDP Çì´õ ¼øÀ¸·Î
ÀÌ·ç¾îÁý´Ï´Ù. ¸ÕÀú ¼ÒÄÏ ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇÏ¿© ³×Æ®¿öÅ©¸¦ ÅëÇØ µé¾î¿Â ¸ðµç ÆÐŶÀ» ¼ö½ÅÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ
±¸Ã¼ÀûÀ¸·Î ¾Ë¾Æº¸°Ú½À´Ï´Ù.
Ethernet Çì´õ µ¥ÀÌÅͺÎÅÍ ¼ö½ÅÇϱâ À§Çؼ´Â ¼ÒÄÏÀ» ´ÙÀ½°ú °°Àº ¼³Á¤À¸·Î ¿ÀÇÂÇÕ´Ï´Ù.
|
sock = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL));
|
¸®´ª½º¿¡¼
Áö¿øÇÏ´Â ¸ðµç ÇÁ·ÎÅäÄÝÀ» ó¸®Çϱâ À§ÇØ socket ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÒ ¶§ 1¹øÂ° PF_PACKETÀ» ÁÝ´Ï´Ù. ´ÙÀ½Àº
¸®´ª½º¿¡¼ Áö¿øÇÏ´Â ÇÁ·ÎÅäÄÝ ÆÐ¹Ð¸®¿¡ ´ëÇÑ ¾È³»ÀÔ´Ï´Ù.
|
ÇÁ·ÎÅäÄÝ
ü°è
|
Á¤ÀÇ
|
|
PF_INET
|
IPv4 ÀÎÅÍ³Ý ÇÁ·ÎÅäÄÝ
|
|
PF_INET6
|
IPv6 ÀÎÅÍ³Ý ÇÁ·ÎÅäÄÝ
|
|
PF_LOCAL
|
Local Åë½ÅÀ» À§ÇÑ Unix ÇÁ·ÎÅäÄÝ
|
|
PF_PACKET
|
Low level socketÀ» À§ÇÑ ÀÎÅÍÆäÀ̽º
|
|
PF_IPX
|
IPX ³ëº§ ÇÁ·ÎÅäÄÝ
|
2¹øÂ° ÀÎÀÚÀÎ ¼ÒÄÏ Å¸ÀÔ¿¡´Â SOCK_PACKETÀ» ÁÝ´Ï´Ù. ÀÌ
ŸÀÔÀº ¸ðµç ÆÐŶÀ» ¼ö½ÅÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ¼ÒÄÏÀÇ µ¥ÀÌÅÍ Àü¼Û ŸÀÔÀÔ´Ï´Ù. (Âü°í·Î TCP´Â
SOCK_STREAM, UDP´Â SOCK_DGRAMÀ» »ç¿ëÇÕ´Ï´Ù.)
3¹øÂ° ÀÎÀÚÀÎ ÇÁ·ÎÅäÄÝ¿¡´Â ETH_P_ALL À» ÁÝ´Ï´Ù. ÀÌ ÇÁ·ÎÅäÄÝÀº Ethernet ÇÁ·ÎÅäÄÝÀ» Åë°·Î ´Ù·ê ¼ö ÀÖµµ·Ï
ÇÏ´Â ÇÁ·ÎÅäÄÝÀÔ´Ï´Ù. À§ÀÇ ¼ÒÄÏÀ» ÅëÇÏ¿© µ¥ÀÌÅ͸¦ ¼ö½ÅÇÒ °æ¿ì Ethernet
Çì´õ µ¥ÀÌÅ͵µ ¼ö½ÅÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.
2) IP Çì´õ, TCP Çì´õ
¿±â
1)¿¡¼ ¼³Á¤ÇÑ socket ÇÔ¼ö¸¦ ÅëÇØ ¼ö½ÅµÈ µ¥ÀÌÅÍ´Â Ethernet Çì´õ¿Í IP Çì´õ,
TCP Çì´õ µî ³»¿ë±îÁö Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. Ethernet Çì´õ ¹Ù·Î µÚ¿¡ IP Çì´õ°¡ ºÙ±â ¶§¹®¿¡ IPÇì´õ¸¦ Àоî¿À±â À§Çؼ´Â ¼ö½ÅµÈ µ¥ÀÌÅÍ¿¡¼ Ethernet Çì´õÀÇ Å©±â¸¸Å Æ÷ÀÎÅ͸¦ À̵¿ÇØ¾ß IP Çì´õÁ¤º¸¸¦
Àоî¿Ã ¼ö ÀÖ½À´Ï´Ù.
|
/* packetFirst º¯¼ö´Â ¼ö½ÅÇÑ ÆÐŶÀÇ ¼±µÎ Æ÷ÀÎÅÍ °ªÀ» °¡Áö°í ÀÖÀ½ */
packetPointer =
packetFirst;
/* Ethernet Çì´õ Å©±â¸¸Å À̵¿ */
packetPointer =
packetPointer + sizeof (struct ether_header);
struct ip *ip_header
= (struct ip *) packetPointer;
|
2-1) ip_header
Æ÷ÀÎÅÍ º¯¼ö¸¦ ÅëÇØ ´ÙÀ½°ú °°Àº ip ±¸Á¶Ã¼ÀÇ
¸â¹öº¯¼ö µ¥ÀÌÅ͸¦ ¾ò¾î ¿Ã ¼ö ÀÖ½À´Ï´Ù.
|
/* Çì´õÀÇ À§Ä¡´Â
¡°/usr/include/netinet/¡± ÀÔ´Ï´Ù */
#include <netinet/ip.h>
ip_header->ip_hl
/* Çì´õ±æÀÌ */
ip_header->ip_v;
/* ¹öÀü */
ip_header->ip_tos; /*
type of service */
ip_header->ip_len; /*
Àüü ±æÀÌ */
ip_header->ip_id; /* ½Äº°id */
ip_header->ip_off; /* fragment ¿É¼Â Çʵå */
ip_header->ip_ttl;
/* time to live */
ip_header->ip_p; /* protocol */
ip_header->ip_sum; /*
checksum */
ip_header->ip_src
/* Ãâ¹ß ipÁÖ¼Ò */
ip_header->ip_dst; /* µµÂø ipÁÖ¼Ò */
|
IP Çì´õÀÇ Å©±â¸¸Å Æ÷ÀÎÅ͸¦ À̵¿Çϸé TCP Çì´õ Á¤º¸¸¦ Àоî¿Ã
¼ö ÀÖ½À´Ï´Ù. IP Çì´õÀÇ Å©±â´Â ip_header->ip_hlÀ»
ÅëÇØ ¾Ë¾Æ³¾ ¼ö Àִµ¥ ÀÌ Çʵå´Â 4ºñÆ® ±æÀ̸¦ °®Áö¸¸ ´ÜÀ§°¡ 4¹ÙÀÌÆ®
´ÜÀ§·Î µÇ¾î Àֱ⠶§¹®¿¡ ip_header->ip_hl °ª¿¡ 4¸¦
°öÇØÁØ °ªÀÌ IP Çì´õÀÇ Å©±â°¡ µË´Ï´Ù. ÀϹÝÀûÀ¸·Î Ưº°ÇÑ
¿É¼ÇÀÌ ¾ø´Â ÇÑ ip_header->ip_hlÀÇ °ªÀº 5ÀÔ´Ï´Ù. Áï ÀÌ °ª¿¡ 4¸¦ °öÇϸé IP Çì´õÀÇ
Å©±â´Â 20¹ÙÀÌÆ® Å©±âÀÎ °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.
|
/* packetPointer º¯¼ö´Â ÇöÀç IP Çì´õÁ¤º¸¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ °ªÀ» °¡Áö°í
ÀÖÀ½ */
/* IP Çì´õ Å©±â¸¸Å À̵¿ */
packetPointer =
packetPointer + ((int)(ip->ip_hl) << 2); /* °öÀ» ½¬ÇÁÆ® ¿¬»êÀ¸·Î Ç¥Çö */
tcp_header =
(struct tcphdr *) packetPointer;
|
2-2) tcp_header
Æ÷ÀÎÅÍ º¯¼ö¸¦ ÅëÇØ ´ÙÀ½°ú °°Àº tcphdr ±¸Á¶Ã¼ÀÇ
¸â¹ö º¯¼ö µ¥ÀÌÅ͸¦ ¾ò¾î ¿Ã ¼ö ÀÖ½À´Ï´Ù.
|
/* Çì´õÀÇ À§Ä¡´Â
¡°/usr/include/netinet/¡± ÀÔ´Ï´Ù */
#include <netinet/tcp.h>
tcp_header->th_sport; /*
Ãâ¹ßÁö port */
tcp_header->th_dport; /*
¸ñÀûÁö port */
tcp_header->th_seq;
/* sequence ¹øÈ£ */
tcp_header->th_ack;
/* acknowledgement ¹øÈ£ */
tcp_header->th_x2;
/* (unused) */
tcp_header->th_off;
/* µ¥ÀÌÅÍ ¿É¼Â*/
tcp_header->th_flags;
/* Á¦¾î Ç÷¡±× */
tcp_header->th_win;
/* window °ª*/
tcp_header->th_sum;
/* checksum °ª*/
tcp_header->th_urp;
/* ±ä±Þ Æ÷ÀÎÅÍ */
|
TCP Çì´õ ÀÌÈÄ¿¡ ¿À´Â ³»¿ëÀº ½ÇÁ¦ µ¥ÀÌÅÍ ºÎºÐÀÌ µË´Ï´Ù.
2-3) UDP Çì´õÀÏ °æ¿ì
udp_header Æ÷ÀÎÅÍ º¯¼ö¸¦ »ç¿ëÇÏ¿© ´ÙÀ½°ú °°Àº udphdr ±¸Á¶Ã¼ÀÇ
¸â¹öº¯¼ö µ¥ÀÌÅ͸¦ ¾ò¾î ¿Ã ¼ö ÀÖ½À´Ï´Ù.
|
/* Çì´õÀÇ À§Ä¡´Â
¡°/usr/include/netinet/¡± ÀÔ´Ï´Ù */
#include <netinet/udp.h>
udp_header->uh_sport; /*
Ãâ¹ßÁö port */
udp_header->uh_dport; /*
¸ñÀûÁö port */
udp_header->uh_ulen;
/* udp ±æÀÌ*/
udp_header->uh_sum;
/* udp üũ¼¶*/
|
2-4)
´ÙÀ½Àº
TCP Çì´õ, UDP Çì´õ µÚ¿¡ ºÙ´Â ½ÇÁ¦ µ¥ÀÌÅÍ
Æ÷ÀÎÅÍ À§Ä¡¸¦ °¡Á®¿À´Â ºÎºÐ¿¡ ´ëÇÑ ¼³¸íÀÔ´Ï´Ù.
TCP Çì´õÀÏ
°æ¿ì TCP Çì´õÀÇ Å©±â¸¦ ±¸Çϱâ À§Çؼ tcphdr ±¸Á¶Ã¼ÀÇ th_off ±¸Á¶Ã¼ º¯¼ö¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ º¯¼ö °ªÀÇ ¼öÄ¡ ´ÜÀ§´Â 4¹ÙÀÌÆ®À̹ǷΠ4¸¦ °öÇÏ¿© tcp Çì´õÀÇ
Å©±â¸¦ ±¸ÇÕ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÇöÀç packetPointer Æ÷ÀÎÅÍÀÇ
À§Ä¡¸¦ tcpÇì´õÀÇ Å©±â¸¸Å ¿Å±â¸é packetPointer Æ÷ÀÎÅÍ
º¯¼ö´Â ½ÇÁ¦ µ¥ÀÌÅÍÀÇ ¼±µÎ À§Ä¡¸¦ °¡¸®Å°°Ô µË´Ï´Ù.
|
packetPointer =
packetPointer + ((int)(tcp->th_off) << 2);
|
UDP Çì´õ´Â tcpÇì´õ¿Í ´Ù¸£°Ô ÇöÀç packetPointer Æ÷ÀÎÅÍÀÇ À§Ä¡¸¦ udphdrÇì´õÀÇ »çÀÌÁŠ¿Å±â¸é packetPointer Æ÷ÀÎÅÍ
º¯¼ö´Â ½ÇÁ¦ µ¥ÀÌÅÍÀÇ ¼±µÎ À§Ä¡¸¦ °¡¸®Å°°Ô µË´Ï´Ù.
´ÙÀ½°ú °°ÀÌ ÇöÀç packetPointer Æ÷ÀÎÅÍÀÇ À§Ä¡¸¦ UDPÇì´õÀÇ Å©±â¸¸Å ¿Å±â¸é packetPointer Æ÷ÀÎÅÍ º¯¼ö´Â
½ÇÁ¦ µ¥ÀÌÅÍÀÇ ¼±µÎ À§Ä¡¸¦ °¡¸®Å°°Ô µË´Ï´Ù.
|
packetPointer =
packetPointer + sizeof(struct udphdr);
|
(3) ÇÁ·Î¼¼½º°¡ »ç¿ë ÁßÀÎ Port ¹øÈ£¸¦ ÃßÃâÇÏ´Â ¼Ò½º ¼³¸í
´ÙÀ½ ¼Ò½º´Â
¡°(1) /proc µð·ºÅ丮 ºÐ¼®¡± ¿¡¼ ¾ð±ÞÇÏ¿´´ø /proc µð·ºÅ丮 ºÐ¼®À» ÅëÇÏ¿© ÇÁ·Î¼¼½º¿¡¼ »ç¿ëÇÏ´Â port ¹øÈ£¸¦ ÃßÃâÇÏ´Â ºÎºÐ¿¡ ´ëÇÑ ¼Ò½ºÄÚµåÀÔ´Ï´Ù.
|
1 /*
2
/proc/net/tcp Á¤º¸¿¡¼ ¼ÒÄÏ device °ª°ú ºñ±³ÇÏ¿© ÇØ´ç ¼ÒÄÏÀÇ port¹øÈ£¸¦
3 ¾ò¾î¿Â´Ù
4 */
5
int SockMapPort(char* ProcTcp, char* sockdevnum, unsigned short* processPortNum)
6 {
7
DIR *directory;
8
struct dirent *entry = NULL;
9
char buffer[256];
10
char *parsing;
11
char hexPortNum[40];
12
int culcount;
13
int linecount;
14
int find;
15
FILE *fp;
16
17
culcount = linecount = find = 0;
18
fp = fopen(ProcTcp, "r");
19
if (fp == NULL)
20
{
21
perror("/proc/net/tcp(6) error");
22
exit(0);
23
}
24
25
linecount = 0;
26
while(fgets(buffer,256, fp) != NULL)
27
{
28
if(linecount == 0)
29
{
30
linecount++;
31
continue;
32
}
33
culcount = 0;
34
parsing = strtok(buffer, ": ");
35
while((parsing = strtok(NULL, ": ")) != NULL)
36
{
37
if(culcount == 1)
38
{
39
strcpy(hexPortNum, parsing);
40
}
41
42
if(!strncmp(parsing, sockdevnum, strlen(sockdevnum)))
43
{
44
/*puts("µ¿ÀÏ");
45
printf("p %s s %s\n", parsing, sockdevnum);*/
46
find = 1;
47
break;
48
}
49
else
50
{
51
}
52
culcount++;
53
}
54
if(find) break;
55
}
56
57
if(find){
58
*processPortNum
= HexToDecimal(hexPortNum);
59
return 1;
60
}
61
else
62
return 0;
63 }
64
65 unsigned short FindPortNum(char*
processID)
66 {
67
DIR *directory;
68
struct dirent *entry = NULL;
69
char procBuff[40];
70
char sockBuff[40];
71
char retBuff[40];
72
char *sockdev;
73
char *sockdevnum;
74
char ProcTcp[20];
75
int ret;
76
unsigned short processPortNum;
77
78
79
sprintf(procBuff,"/proc/%s/fd", processID);
80
81
if ((directory = opendir(procBuff)) == NULL)
82
{
83
perror("/proc opendir error");
84
exit(0);
85
}
86
87
while((entry = readdir(directory)) != NULL)
88
{
89
if (strcmp(entry->d_name, ".") !=0 &&
strcmp(entry->d_name, "..") != 0 &&
90
strcmp(entry->d_name, "0") != 0 &&
strcmp(entry->d_name, "1") !=0 &&
strcmp(entry->d_name, "2") != 0
91 {
92
sprintf(sockBuff,"/proc/%s/fd/%s", processID,
entry->d_name);
93
readlink(sockBuff, retBuff, sizeof(retBuff));
94
sockdev = strtok(retBuff, ":[");
95
if(strcmp(sockdev, "socket"))
96
continue;
97
98
sockdevnum = strtok(NULL, ":[]");
99
break;
100
}
101
}
102
103
sprintf(ProcTcp, "/proc/net/tcp");
104
ret = SockMapPort(ProcTcp, sockdevnum, &processPortNum);
105
if(ret == 0) // "/proc/net/tcp"¿¡ Á¤º¸°¡ ¾øÀ» °æ¿ì
106
{
107
sprintf(ProcTcp, "/proc/net/tcp6");
108
SockMapPort(ProcTcp, sockdevnum, &processPortNum);
109
}
110
111
closedir(directory);
112
return processPortNum;
113 }
114
115
/*
116 * ÇÁ·Î¼¼½º Á¤º¸¸¦ °¡Á®¿Â´Ù.
117 * ±×·¯±â À§Çؼ
/proc/[PID]/statÆÄÀÏÀ» ÀоîµéÀ̰í À̸¦
118 * Çʵ庰·Î ÆÄ½ÌÇÑ´Ù. ÆÄ½ÌÀº " "¹®ÀÚ¸¦ ±âÁØÀ¸·Î ÇÑ´Ù.
119 * ¶ÇÇÑ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ À¯Àú À̸§µµ ¾ò¾î¿Â´Ù.
120 */
121
unsigned short FindProcInfo(char* process)
122
{
123 DIR
*directory;
124
struct dirent *entry = NULL;
125 char
proc_file[40];
126 char
proc_name[20];
127 int
processFlag = 0;
128
unsigned short port;
129
130 if
(IsDigit(process)) //process°¡ ¼ýÀÚÀ̸é
131 {
132 processFlag
= 1;
133 }
134 else
135 {
136
sprintf(proc_name, "(%s)", process);
137 }
138
139
140
if(processFlag == 0) //½ÇÇàÀÎÀÚ°¡ ÇÁ·Î¼¼½º¸íÀÏ °æ¿ì
141 {
142
system(process); //½ÇÇàÀÎÀÚ ÇÁ·Î±×·¥À» ½ÇÇà ½ÃÅ´
143
144
// proc µð·ºÅ丮¸¦ ¿¾î¼ ÆÄÀÏ(µð·ºÅ丮Æ÷ÇÔ)ÀÇ ¸®½ºÆ®¸¦
145
// ¾ò¾î¿Â´Ù.
146
if ((directory = opendir("/proc")) == NULL)
147
{
148
perror("/proc opendir error");
149
exit(0);
150
}
151
152
while((entry = readdir(directory)) != NULL)
153
{
154
if (strcmp(entry->d_name, ".") !=0 && strcmp(entry->d_name,
"..") != 0)
155
{
156
sprintf(proc_file,"/proc/%s/stat", entry->d_name);
157
// stat ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇϰí È®ÀÎÇϰí
158
if (access(proc_file, F_OK) != 0)
159
{
160
continue;
161
}
162
163
// µð·ºÅ丮 À̸§ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù.
164
// µð·ºÅ丮 À̸§ÀÌ
¼ýÀÚ¶ó¸é À̸¦ ÆÄ½ÌÇÑ´Ù.
165
if (IsDigit(entry->d_name))
166
{
167
if(ProcParser(proc_file, proc_name)) //µð·ºÅ丮°¡ ÇÁ·Î¼¼½ºÀÇ µð·ºÅ丮 Á¤º¸ÀÎÁö¸¦ È®ÀÎ
168
{
169
port = FindPortNum(entry->d_name);
170
printf("processName : %s\nport : %d\n", process, port);
171
break;
172
}
173
}
174
else
175
{
176
}
177
}
178
}
179
180
closedir(directory);
181
}
182 else
//½ÇÇàÀÎÀÚ°¡ ÇÁ·Î¼¼½ºidÀÏ °æ¿ì
183
{
184
port = FindPortNum(process);
185
printf("processID : %s\nport : %d\n", process, port);
186
}
187
188
return port;
189
}
190
191 /*
192 * ÆÄÀÏÀ̸§ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù.
193 */
194 int IsDigit(char *str)
195
{
196
int i;
197
for (i = 0; i < strlen(str); i++)
198
{
199
if (isdigit(str[i])==0)
200
return 0;
201
}
202
return 1;
203
}
204
205 /*
206 "/proc/pid/fd/stat"¿¡¼ ÇÁ·Î¼¼½º¸í Á¤º¸¸¦ ºñ±³ÇÔ
207 */
208
int ProcParser(char *proc_file, char *proc_name)
209
{
210
FILE *fp;
211
char buf[512] = {0x00,}; 212
int pid;
213
char *pname;
214
215
fp = fopen(proc_file, "r");
216
if (fp == NULL)
217
{
218
perror("error : ");
219
exit(0);
220
}
221
222
fgets(buf, 511, fp);
223
pid = atoi(strtok(buf, " "));
224
pname = (char*)strtok(NULL, " ");
225 fclose(fp);
226
if(strncmp(pname, proc_name, strlen(proc_name)))
227
{
228
return 0; //ÇÁ·Î¼¼½ºÀ̸§°ú ÀÏÄ¡ÇÏÁö ¾ÊÀ½
229
}
230
else
231
{
232
return 1; //ÇÁ·Î¼¼½ºÀ̸§°ú ÀÏÄ¡
233
}
234
235
}
|
1) ÇÔ¼ö ¿ä¾à ¼³¸í
- FindProcInfo : ÇÁ·Î¼¼½º id¸¦
¸Å°³º¯¼ö·Î ¹Þ¾ÒÀ» °æ¿ì¿¡´Â ¹Ù·Î FindPortNum ÇÔ¼ö¿¡ ÇÁ·Î¼¼½º id¸¦ ³Ñ°Ü Æ÷Æ®¹øÈ£¸¦ ÃßÃâÇÕ´Ï´Ù. ÇÁ·Î±×·¥ ¸íÀ» ¸Å°³º¯¼ö·Î ¹Þ¾ÒÀ» °æ¿ì¿¡´Â ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í, /proc µð·ºÅ丮¸¦
°Ë»öÇÏ¿© ProcParser ÇÔ¼ö·Î ÇÁ·Î¼¼½º id¸¦ ¾Ë¾Æ³À´Ï´Ù.
ÀÌ ÇÁ·Î¼¼½º id¸¦ FindPortNum ÇÔ¼ö¿¡ ´ëÀÔÇÏ¿© port ¹øÈ£¸¦ ÃßÃâÇÕ´Ï´Ù.
- FindPortNum : Àμö·Î ¹ÞÀº ÇÁ·Î¼¼½º
id¸¦ Åä´ë·Î /proc/pid/fd µð·ºÅ丮¸¦ Àоîµé¿©
0, 1, 2 ±âº» ÆÄÀÏ µð½ºÅ©¸³Å͸¦ Á¦¿ÜÇÑ ÆÄÀÏ µð½ºÅ©¸³ÅÍ Áß¿¡ ½Éº¼¸¯ ¸µÅ©µÈ °ªÀÌ socketÀ¸·Î
¸µÅ©µÈ µð¹ÙÀ̽º ¹øÈ£¸¦ SockMapPort
ÇÔ¼ö¿¡ ¸Å°³º¯¼ö·Î ³Ñ°Ü ¼ÒÄÏÀÇ Æ÷Æ® ¹øÈ£¸¦ ÃßÃâÇÕ´Ï´Ù.
- SockMapPort : /proc/net/tcp³ª /proc/net/tcp6 ÆÄÀÏÀ» ÇÑ ¶óÀξ¿ ÀÐ¾î µé¿© ÀÎÀÚ·Î ¹ÞÀº µð¹ÙÀ̽º ¹øÈ£¿Í ÀÏÄ¡ÇÑ ¶óÀÎÀ» ã½À´Ï´Ù. ãÀº ¶óÀÎÀÇ 3¹øÂ° ÇÊµå °ªÀÌ Æ÷Æ® ¹øÈ£ÀÔ´Ï´Ù. ÀÌ °ªÀº 16Áø¼ö·Î µÇ¾î Àֱ⠶§¹®¿¡ 10Áø¼ö·Î º¯È¯ ÈÄ Æ÷Æ®¹øÈ£¸¦ ¸®ÅÏÇÕ´Ï´Ù.
- ProcParser : Àμö·Î ¹ÞÀº /proc/pid/fd/stat ÆÄÀÏÀÇ
µ¥ÀÌÅÍ¿¡ ÇÁ·Î¼¼½º À̸§ÀÌ ÀÏÄ¡ÇÏ´Â È®ÀÎÇÏ¿© ÇÁ·Î¼¼½º id¸¦ ã½À´Ï´Ù.
- IsDigit : Àμö·Î ¹ÞÀº strÀÌ
¼ýÀÚÀÎÁö È®ÀÎÇÕ´Ï´Ù.
2) ¼Ò½º ÇØ¼³
5Çà : SockMapPort ÇÔ¼ö´Â ¡°/proc/net/tcp¡±³ª ¡°/proc/net/tcp6¡±À» °¡¸®Å°´Â ¹®ÀÚ¿°ú ¼ÒÄÏ µð¹ÙÀ̽º ¹øÈ£, ÀúÀåµÉ
ÇÁ·Î¼¼½º Æ÷Æ® ¹øÈ£ º¯¼ö¸¦ Àμö·Î ¹Þ½À´Ï´Ù.
18Çà : ¡°/proc/net/tcp¡± ÆÄÀÏÀ» ¿ÀÇÂÇÕ´Ï´Ù.
26Çà ~ 55Çà : ¡°/proc/net/tcp¡± ÀÇ µ¥ÀÌÅ͸¦ ÇÑ ¶óÀξ¿ Àоîµé¿© ¡°:¡±·Î ÅäÅ«ÇÑ °ª Áß¿¡ ¼ÒÄÏ µð¹ÙÀ̽º °ª°ú ÀÏÄ¡ÇÏ´ÂÁö ºñ±³Çϰí, ÀÏÄ¡ÇÏ´Â
°ªÀ» ãÀ¸¸é ÀúÀåÇØ ³õÀº hexPortNum °ªÀÌ 16Áø¼ö·Î
Ç¥ÇöµÈ Æ÷Æ®¹øÈ£ÀÔ´Ï´Ù.
57Çà ~ 60Çà : 16Áø¼ö·Î Ç¥ÇöµÈ Æ÷Æ®¹øÈ£¸¦
10Áø¼ö·Î º¯°æÇÕ´Ï´Ù.
65Çà : FindPortNum ÇÔ¼ö´Â ¹®ÀÚ¿·Î Ç¥ÇöµÈ ÇÁ·Î¼¼½º id¸¦ Àμö·Î ¹Þ½À´Ï´Ù.
79Çà : ÇÁ·Î¼¼½ºid ¹®ÀÚ¿À»
Ãß°¡ÇÏ¿© ¡°/proc/pid/fd¡± ¹®ÀÚ¿ °ªÀÎ procBuf¸¦
¸¸µì´Ï´Ù.
81Çà : opendir ÇÔ¼ö·Î procBuff µð·ºÅ丮¸¦
¿ÀÇÂÇÏ¿© µð·ºÅ丮 Æ÷ÀÎÅ͸¦ directory º¯¼ö¿¡ ÀúÀåÇÕ´Ï´Ù.
87Çà ~ 101Çà : readdir ÇÔ¼ö·Î directory
º¯¼öÀÇ µð·ºÅ丮 ³»¿¡ ÀÖ´Â ÆÄÀÏÀ» ÀÐ¾î µéÀÔ´Ï´Ù. ÆÄÀÏÀ̸§ÀÌ ¡°.¡±, ¡°..¡±, ¡°0¡±, ¡°1¡±, ¡°2¡±¸¦ Á¦¿ÜÇÑ ÆÄÀÏÀ» readlink ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ½Éº¼¸¯ ¸µÅ©µÈ °ªÀ» retBuff¿¡
ÀúÀåÇÕ´Ï´Ù. retBuff¿¡ ÀúÀåµÈ °ªÀÌ ¼ÒÄÏ µð¹ÙÀ̽º¸é ¡°socket:[802831]¡±·Î Ç¥ÇöµÇ±â ¶§¹®¿¡ ¡°:[]¡±·Î ÅäÅ«ÇÏ¿©
Áß°ýÈ£ ¾È¿¡ ÀÖ´Â ¼ÒÄÏ µð¹ÙÀ̽º °ªÀ» sockdevnum º¯¼ö¿¡ ÀúÀåÇÕ´Ï´Ù.
103Çà : ¡°/proc/net/tcp¡± ¹®ÀÚ¿À» ProcTcp º¯¼ö¿¡
ÀúÀåÇÕ´Ï´Ù.
104Çà : ÇÁ·Î¼¼½º°¡ »ç¿ëÁßÀÎ Æ÷Æ®¹øÈ£¸¦ ÃßÃâÇϱâ À§ÇØ SockMapPort ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
105Çà ~ 109Çà : ¼ÒÄÏ µð¹ÙÀ̽º ¹øÈ£¿Í ¸ÊÇÎ µÈ Æ÷Æ®¹øÈ£°¡ ¾øÀ¸¸é ¡°/proc/net/tcp6¡±¸¦ ù¹øÂ° ¸Å°³º¯¼ö·Î SockMapPort¸¦
ÀçÈ£ÃâÇÕ´Ï´Ù.
111Çà : ¿ÀÇÂÇÑ µð·ºÅ丮¸¦ ´Ý½À´Ï´Ù.
112Çà : ÇÁ·Î¼¼½º°¡ »ç¿ë ÁßÀÎ Æ÷Æ® ¹øÈ£¸¦ ¸®ÅÏÇÕ´Ï´Ù.
121Çà : FindProcInfo ÇÔ¼ö´Â ÇÁ·Î±×·¥ ¸íÀ̳ª
process id¸¦ ÀÎÀÚ·Î ¹Þ½À´Ï´Ù.
130Çà ~ 137Çà : IsDigit ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© Àμö·Î ¹ÞÀº process °ªÀÌ ¼ýÀÚÀÎÁö üũÇÕ´Ï´Ù. ¼ýÀÚÀ̸é ÇÁ·Î¼¼½º idÀ̱⠶§¹®¿¡ processFlag °ªÀ» 1·Î ¼³Á¤ÇÑ´Ù. ¼ýÀÚ°¡ ¾Æ´Ï¸é ÇÁ·Î±×·¥ ¸íÀ̹ǷΠ³ªÁß¿¡ proc/pid/stat¿Í ºñ±³ °úÁ¤¿¡¼ ÇÁ·Î¼¼½º id¸¦ ¾Ë¾Æ³»±â À§ÇØ
ÇÁ·Î±×·¥ ¸í¿¡ ¡°()¡±¸¦ Ãß°¡ÇÕ´Ï´Ù.
142Çà : ÀÎÀÚ·Î ¹ÞÀº process
º¯¼öÀÇ µ¥ÀÌÅͰ¡ ÇÁ·Î±×·¥ ¸íÀÎ °æ¿ì¿¡´Â ÇÁ·Î±×·¥À» ½ÇÇà ½Ãŵ´Ï´Ù.
146Çà ~ 149Çà : opendirÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¡°/proc¡±
µð·ºÅ丮¸¦ ¿ÀÇÂÇÕ´Ï´Ù.
152Çà ~ 178Çà : ¡°/proc¡± µð·ºÅ丮¸¦ ÀÐ¾î µé¿©
ProcParser ÇÔ¼ö¿¡ ¡°/proc¡± µð·ºÅ丮 ³»¿¡
¡°/proc/pid/stat¡±
ÆÄÀϰú ÇÁ·Î¼¼½º À̸§À» ¸Å°³º¯¼ö·Î
³Ñ°Ü ÇÁ·Î¼¼½º id¸¦ ã½À´Ï´Ù. ÇÁ·Î¼¼½º
Id ¸¦ ãÀ¸¸é
FindPortNum ÇÔ¼ö¿¡ ÇÁ·Î¼¼½º id¸¦ ¸Å°³º¯¼ö·Î ³Ñ°Ü Æ÷Æ®¹øÈ£¸¦ ÃßÃâÇÕ´Ï´Ù.
180Çà : ¿ÀÇÂÇÑ ¡°/proc¡± µð·ºÅ丮¸¦
´Ý½À´Ï´Ù.
182Çà ~ 186Çà : ÀÎÀÚ·Î ¹ÞÀº
process º¯¼öÀÇ µ¥ÀÌÅͰ¡ ÇÁ·Î¼¼½º id À̹ǷΠ¹Ù·Î
FindPortNum
ÇÔ¼ö¿¡ ÇÁ·Î¼¼½º id¸¦ ¸Å°³º¯¼ö·Î ³Ñ°Ü Æ÷Æ®¹øÈ£¸¦ ÃßÃâÇÕ´Ï´Ù.
188Çà : Æ÷Æ®¹øÈ£¸¦ ¹ÝȯÇÕ´Ï´Ù.
194Çà ~ 203Çà : ÀÎÀÚ·Î ¹ÞÀº str º¯¼öÀÇ
µ¥ÀÌÅͰ¡ ¼ýÀÚ ¹®ÀÚ¿ÀÎÁö¸¦ üũÇÕ´Ï´Ù.
208Çà : ProcParser ÇÔ¼ö´Â ¡°/proc/pid/fd/stat¡±
¹®ÀÚ¿À» °¡¸®Å°´Â º¯¼ö¿Í ÇÁ·Î±×·¥ ¸íÀ» ÀÎÀÚ·Î ¹Þ½À´Ï´Ù.
215Çà : ¡°/proc/pid/fd/stat¡± ÆÄÀÏÀ» ¿ÀÇÂÇÕ´Ï´Ù.
222Çà ~ 224Çà : ¿ÀÇÂÇÑ ÆÄÀÏ Æ÷ÀÎÅͷκÎÅÍ µ¥ÀÌÅ͸¦ ÀÐ¾î µé¿© °ø¹éÀ» ±¸ºÐÀÚ·Î 2¹ø ÆÄ½ÌÇÕ´Ï´Ù. ù ¹øÂ° ÆÄ½ÌÇÏ¿© ¾òÀº µ¥ÀÌÅÍ´Â pid À̰í, µÎ ¹øÂ° ÆÄ½ÌÇÏ¿© ¾òÀº µ¥ÀÌÅÍ´Â ÇÁ·Î¼¼½º À̸§ÀÔ´Ï´Ù.
226Çà ~ 233Çà : ÆÄ½ÌÇÏ¿© ¾òÀº ÇÁ·Î¼¼½º¸í(pname)°ú
ÇÁ·Î±×·¥ ¸í(proc_name)ÀÌ ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎÇÏ¿© ÀÏÄ¡ ¿©ºÎ¸¦ ¹ÝȯÇÕ´Ï´Ù.
(4) Packet Header ÃßÃâÇÏ´Â ºÎºÐ ¼Ò½º ¼³¸í
´ÙÀ½ ¼Ò½º´Â
¡°(2) Packet Çì´õ Á¤º¸ ¾ò±â¡± ¿¡¼ ¾ð±ÞÇÏ¿´´ø ¼ÒÄÏÀ» ÅëÇØ ethernet Çì´õºÎÅÍ ¼ö½ÅÇÑ µ¥ÀÌÅ͸¦
ºÐ¼®ÇÏ´Â ºÎºÐ¿¡ ´ëÇÑ ¼Ò½ºÄÚµåÀÔ´Ï´Ù.
|
1 void
packetCapture(unsigned short portnum, FILE *wfp)
2 {
3
struct ether_header *eth;
4 struct ether_arp *arp;
5
struct ip *ip;
6
struct icmp *icmp;
7
struct tcphdr *tcp;
8
struct udphdr *udp;
9
int s;
10
int len;
11
int c;
// getopt()¿¡¼ ÃëµæÇÑ ¹®ÀÚ
12
char buff[MAXSIZE]; // µ¥ÀÌÅÍ ¼ö½Å ¹öÆÛ
13
char *packetPointer; // Çì´õÀÇ ¼±µÎ¸¦ ³ªÅ¸³»´Â ÀÛ¾÷¿ë Æ÷ÀÎÅÍ
14
char *packetFirst; //
ÆÐŶÀÇ ¼±µÎ¸¦ ³ªÅ¸³»´Â Æ÷ÀÎÅÍ
15
char buf[BUFSIZE];
16
int i;
17
char data[BUFSIZE];
18
19
if ((s = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) < 0) {
20
perror("socket");
21
exit(1);
22
}
23
24
while (1){
25
if ((len = read(s, buff, MAXSIZE)) < 0) {
26
perror("read");
27
exit(1);
28
}
29
/* Ethernet Çì´õ¼±µÎ¿¡ Æ÷ÀÎÅ͸¦ ¼¼Æ® */
30
packetPointer = packetFirst = buff;
31
32
eth = (struct ether_header *) packetPointer;
33
packetPointer = packetPointer + sizeof (struct ether_header);
34
35
36
if (ntohs(eth->ether_type) == ETHERTYPE_IP) {
37
ip = (struct ip *) packetPointer;
38
39
packetPointer = packetPointer + ((int)(ip->ip_hl) << 2);
40
41
switch (ip->ip_p) {
42
case IPPROTO_TCP:
43
tcp = (struct tcphdr *) packetPointer;
44
if((portnum ==
ntohs(tcp->th_sport))
|| (portnum ==
ntohs(tcp->th_dport))){
45
46
print_ip(ip, wfp);
47
print_tcp(tcp, wfp);
48
dump_packet(packetFirst,
len, wfp);
49
printf("\n");
50
sprintf(buf, "\n");
51
fputs(buf, wfp);
52
fflush(stdout);
53
}
54
break;
55
case IPPROTO_UDP:
56
udp
= (struct udphdr *) packetPointer;
57
packetPointer = packetPointer
+ sizeof(struct
udphdr);
58
if((portnum == ntohs(udp->uh_sport))
|| (portnum ==
ntohs(udp->uh_dport))){
59
print_ip(ip, wfp);
60
print_udp(udp);
61
dump_packet(packetFirst, len, wfp);
62
printf("\n");
63
sprintf(buf, "\n");
64
fputs(buf, wfp);
65
fflush(stdout);
66
}
67
break;
68
}
69
}
70
}
71
72 }
73
74
75
76 void
dump_packet(unsigned char *buff, int len, FILE *fp)
77 {
78 int i, j;
79
char buf[BUFSIZE];
80
81
printf("Packet Dump:\n");
82
sprintf(buf, "Packet Dump\n");
83
fputs(buf, fp);
84
for (i = 0; i < len; i += 16) {
85
// 16Áø¼ö ´ýÇÁ
86
for (j = i; j < i + 16 && j < len; j++) {
87
printf("%02x", buff[j]);
88
sprintf(buf, "%02x", buff[j]);
89
fputs(buf, fp);
90
91
if
(j % 2 == 1){
92
printf(" ");
93
sprintf(buf, " ");
94
fputs(buf, fp);
95
}
96
}
97
98
// Á¦ÀÏ ¸¶Áö¸· ÇàÀÇ ³¡ ¼ö¸¦ Á¤·Ä
99
if (j == len && len % 16 != 0)
100
for (j = 0; j < 40 - (len % 16)*2.5; j++){
101
printf(" ");
102
sprintf(buf, " ");
103
fputs(buf, fp);
104
}
105
printf(": ");
106
sprintf(buf, ": ");
107
fputs(buf, fp);
108
109
// ¾Æ½ºÅ° ¹®ÀÚ
Ç¥½Ã
110
for (j = i; j < i + 16 && j < len; j++) {
111
if ((buff[j] >= 0x20) && (buff[j] <= 0x7e)){
112
putchar(buff[j]);
113
sprintf(buf, "%c", buff[j]);
114
fputs(buf,
fp);
115
}
116
else{
117
printf(".");
118
sprintf(buf, ".");
119
fputs(buf, fp);
120
}
121
}
122
printf("\n");
123
fputs("\n", fp);
124
}
125 }
126
127
128 void tcp_ftoa(int
flag, char *str)
129 {
130
static char f[][3] = {"URG", "ACK",
"PSH", "RST", "SYN", "FIN"}; //tcpÇ÷¡±×¸¦ ³ªÅ¸³»´Â ¹®ÀÚ
131
int length = 0;
132
u_int mask = 1 << 5;
133
int i;
134
135
for(i = 0;i<6;i++) {
136
if (((flag << i) & mask) != 0)
137
{
138
strncat(str, f[i], 3);
139
strncat(str, " ", 1);
140
}
141
else
142
{
143
144
}
145
}
146
147
length = strlen(str);
148
str[length] = '\0';
149
150 }
151
152
153
154 void print_ip(struct
ip *ip, FILE *fp)
155 {
156
char buf[BUFSIZE];
157
printf("Protocol: IP\n");
158
sprintf(buf, "Protocol: IP\n");
159
fputs(buf, fp);
160
printf("+-------------------------+--------+----------------+\n");
161
sprintf(buf,
"+-------------------------+--------+----------------+\n");
162
fputs(buf, fp);
163
printf("| Identifier:
%5u| TTL:%3u| Checksum: %5u|\n",
164
ntohs(ip->ip_id), ip->ip_ttl, ntohs(ip->ip_sum));
165
sprintf(buf, "| Identifier:
%5u| TTL:%3u| Checksum: %5u|\n",
166
ntohs(ip->ip_id), ip->ip_ttl, ntohs(ip->ip_sum));
167
fputs(buf, fp);
168
printf("+------------+------------+-------------------------+\n");
169
sprintf(buf,
"+------------+------------+-------------------------+\n");
170
fputs(buf, fp);
171
printf("| Source IP Address:
%15s|\n",
172
inet_ntoa(*(struct in_addr *)&(ip->ip_src)));
173
sprintf(buf, "| Source IP Address:
%15s|\n",
174
inet_ntoa(*(struct in_addr *)&(ip->ip_src)));
175
fputs(buf, fp);
176
printf("+---------------------------------------------------+\n");
177
sprintf(buf,
"+---------------------------------------------------+\n");
178
fputs(buf, fp);
179
printf("| Destination IP Address:
%15s|\n",
180
inet_ntoa(*(struct in_addr *)&(ip->ip_dst)));
181
sprintf(buf, "| Destination IP Address:
%15s|\n",
182
inet_ntoa(*(struct in_addr *)&(ip->ip_dst)));
183
fputs(buf, fp);
184
printf("+---------------------------------------------------+\n");
185
sprintf(buf,
"+---------------------------------------------------+\n");
186
fputs(buf, fp);
187 }
|
1) ÇÔ¼ö ¿ä¾à ¼³¸í
- packetCapture : ¼ÒÄÏÀ» Ethernet Çì´õºÎÅÍ
¼ö½ÅÇÒ ¼ö ÀÖ´Â ¿É¼ÇÀ¸·Î ¿ÀÇÂÇϰí, ¼ö½ÅÇÑ µ¥ÀÌÅ͸¦ °¢ Çì´õ º°·Î Æ÷ÀÎÅÍ º¯¼ö¸¦ ÀÌ¿ëÇÏ¿© ºÐ¸®ÇÕ´Ï´Ù. Ip Çì´õ Æ÷ÀÎÅ͸¦ ÅëÇØ ip¸¦ üũÇϰí, tcp Çì´õ Æ÷ÀÎÅ͸¦ ÅëÇØ Æ÷Æ®¹øÈ£¸¦ üũÇÏ¿© print_ip, print_tcp, dump_packet ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© °¢°¢ÀÇ Çì´õ¿Í µ¥ÀÌÅÍ ³»¿ëÀ» Ç¥ÁØÃâ·Â°ú ÀÎÀÚ·Î ¹ÞÀº ÆÄÀÏÆ÷ÀÎÅÍ·Î Ãâ·ÂÇÕ´Ï´Ù. (ÆÄÀÏ¸í ¿¹ : process_9553) – ¼ýÀÚ´Â pid ³ªÅ¸³À´Ï´Ù.
- dump_packet : 16Áø¼ö·Î Ç¥ÇöµÈ ÆÐŶÀÇ µ¥ÀÌÅÍ ¹öÆÛÀÇ ³»¿ëÀ» ASCII ¹®ÀÚ·Î º¯È¯ÇÏ¿© Ç¥ÁØÃâ·Â°ú ÀÎÀÚ·Î ¹ÞÀº ÆÄÀÏÆ÷ÀÎÅÍ·Î Ãâ·ÂÇÕ´Ï´Ù.
- tcp_ftoa : tcp Çì´õ Áß¿¡ Á¦¾î Ç÷¡±× ºñÆ®¸¦ Ç÷¡±× ¹®ÀÚ¿·Î º¯°æÇÕ´Ï´Ù.
- print_ip : ip ±¸Á¶Ã¼ÀÇ ¸â¹öº¯¼ö¸¦ Ç¥ÁØÃâ·Â°ú ÆÄÀÏ Æ÷ÀÎÅÍ·Î Ãâ·ÂÇÕ´Ï´Ù.
2) ¼Ò½º ÇØ¼³
1Çà : packetCaptureÇÔ¼ö´Â Æ÷Æ®¹øÈ£¿Í ¼ö½ÅÇÑ ÆÐŶ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ÆÄÀÏ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ¹Þ½À´Ï´Ù.
19Çà : ÆÐŶÀÇ Ethernet Çì´õºÎÅÍ ¼ö½Å Çϱâ À§ÇØ socket ÇÔ¼ö¿¡ SOCK_PACKET, ETH_P_ALL¿É¼ÇÀ» ¸Å°³º¯¼ö·Î ´ëÀÔÇÕ´Ï´Ù.
25Çà : ¿ÀÇÂÇÑ ¼ÒÄÏÀ» ÅëÇÏ¿© µ¥ÀÌÅ͸¦ ¼ö½ÅÇÏ¿© buff¿¡ ÀúÀåÇÕ´Ï´Ù.
30Çà : Ethernet Çì´õ µ¥ÀÌÅͺÎÅÍ Àбâ À§ÇØ buffÀÇ ¼±µÎ ÁÖ¼Ò¿Í packetPointer Æ÷ÀÎÅ͸¦ ÀÏÄ¡½Ãŵ´Ï´Ù.
32Çà : ÇöÀç packetPointer Æ÷ÀÎÅÍ º¯¼ö´Â Ethernet Çì´õ µ¥ÀÌÅ͸¦ °¡¸®Å°°í Àֱ⠶§¹®¿¡ ether_header ±¸Á¶Ã¼
Æ÷ÀÎÅͷΠij½ºÆÃ ÇÏ¿© ether_header ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÎ eth Æ÷ÀÎÅÍ
º¯¼ö¿¡ ´ëÀÔÇÕ´Ï´Ù.
33Çà : Ethernet Çì´õ ´ÙÀ½¿¡ À§Ä¡ÇÑ ip Çì´õ µ¥ÀÌÅ͸¦ °¡¸®Å°µµ·Ï Çϱâ À§ÇØ ether_header ±¸Á¶Ã¼ Å©±â¸¸Å packetPointer Æ÷ÀÎÅ͸¦
À̵¿½Ãŵ´Ï´Ù.
36Çà : ethrnet ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÎ ethÀÇ Å¸ÀÔÀÌ
ETHERTYPE_IP(IPŸÀÔ)ÀÎÁö È®ÀÎÇÑ´Ù. ipŸÀÔ
ÀÌ ¿Ü¿¡ arp ŸÀÔÀÎ °æ¿ìµµ ÀÖ½À´Ï´Ù.
37Çà : ÇöÀç packetPointer Æ÷ÀÎÅÍ º¯¼ö´Â ip Çì´õ µ¥ÀÌÅ͸¦ °¡¸®Å°°í Àֱ⠶§¹®¿¡ ip ±¸Á¶Ã¼ Æ÷ÀÎÅͷΠij½ºÆÃÇÏ¿© ip ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÎ ip Æ÷ÀÎÅÍ º¯¼ö¿¡ ´ëÀÔÇÕ´Ï´Ù.
39Çà : ip Çì´õ ´ÙÀ½¿¡ À§Ä¡ÇÑ tcp Çì´õ¸¦ °¡¸®Å°µµ·Ï Çϱâ À§ÇØ ip Çì´õ ±æÀ̸¸Å Æ÷ÀÎÅ͸¦ À̵¿ ½Ãŵ´Ï´Ù. Ip Çì´õ ±æÀÌ´Â ip ±¸Á¶Ã¼ÀÇ ip_hl ¸â¹ö º¯¼ö¿¡ °ªÀ» 4¹è ÇÑ °ªÀÔ´Ï´Ù.
42Çà ~ 43Çà : ip ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÎ ipÀÇ
ÇÁ·ÎÅäÄÝ Å¸ÀÔÀÌ TCPŸÀÔ(IPPROTO_TCP)ÀÏ °æ¿ì
ÇöÀç packetPointer Æ÷ÀÎÅÍ º¯¼ö´Â tcp Çì´õ
µ¥ÀÌÅ͸¦ °¡¸®Å°°í Àֱ⠶§¹®¿¡ tcphdr ±¸Á¶Ã¼ Æ÷ÀÎÅͷΠij½ºÆÃÇÏ¿© tcphdr ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÎ tcp Æ÷ÀÎÅÍ º¯¼ö¿¡ ´ëÀÔÇÕ´Ï´Ù.
44Çà ~ 54Çà : tcphdr ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÇ Ãâ¹ßÁö Æ÷Æ®¹øÈ£(th_sport)¿Í ¸ñÀûÁö Æ÷Æ®¹øÈ£(th_dport)°¡ ÀÎÀÚ·Î ¹ÞÀº
¸ð´ÏÅ͸µ ÇÒ Æ÷Æ®¹øÈ£(portnum)¿Í ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎÇÕ´Ï´Ù. µ¿ÀÏ
Æ÷Æ®¹øÈ£¸¦ ´ãÀº ÆÐŶ µ¥ÀÌÅÍÀ̸é print_ipÇÔ¼ö¸¦
»ç¿ëÇÏ¿© ipÇì´õ¸¦ Ãâ·ÂÇϰí, print_tcp ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© tcpÇì´õ¸¦ Ãâ·ÂÇÕ´Ï´Ù. dump_packet ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¼ö½Å¹ÞÀº ¸ðµç ¹öÆÛÀÇ ³»¿ëÀ» 16Áø¼ö¿Í ASCII °ªÀ¸·Î Ç¥ÁØÃâ·Â°ú ÆÄÀÏ Æ÷ÀÎÅÍ·Î Ãâ·ÂÇÕ´Ï´Ù.
55Çà ~ 56Çà : ip ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÎ ipÀÇ
ÇÁ·ÎÅäÄÝ Å¸ÀÔÀÌ UDPŸÀÔ(IPPROTO_UDP)ÀÏ °æ¿ì
ÇöÀç packetPointer Æ÷ÀÎÅÍ º¯¼ö´Â udp Çì´õ
µ¥ÀÌÅ͸¦ °¡¸®Å°°í Àֱ⠶§¹®¿¡ udphdr ±¸Á¶Ã¼ Æ÷ÀÎÅͷΠij½ºÆÃÇÏ¿© udphdr ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÎ udp Æ÷ÀÎÅÍ º¯¼ö¿¡ ´ëÀÔÇÕ´Ï´Ù.
58Çà ~ 67Çà : udphdr ±¸Á¶Ã¼ Æ÷ÀÎÅÍÀÇ Ãâ¹ßÁö Æ÷Æ®¹øÈ£(th_sport)¿Í ¸ñÀûÁö Æ÷Æ®¹øÈ£(th_dport)°¡ ÀÎÀÚ·Î ¹ÞÀº
¸ð´ÏÅ͸µ ÇÒ Æ÷Æ®¹øÈ£(portnum)¿Í ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎÇÕ´Ï´Ù. µ¿ÀÏ
Æ÷Æ®¹øÈ£¸¦ ´ãÀº ÆÐŶ µ¥ÀÌÅÍÀ̸é print_ipÇÔ¼ö¸¦
»ç¿ëÇÏ¿© ipÇì´õ¸¦ Ãâ·ÂÇϰí, print_udp¸¦ »ç¿ëÇÏ¿© udpÇì´õ¸¦ Ãâ·ÂÇÕ´Ï´Ù. dump_packet ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¼ö½Å¹ÞÀº ¸ðµç ¹öÆÛÀÇ ³»¿ëÀ» 16Áø¼ö¿Í ASCII °ªÀ¸·Î Ç¥ÁØÃâ·Â°ú ÆÄÀÏ Æ÷ÀÎÅÍ·Î Ãâ·ÂÇÕ´Ï´Ù.
76Çà : dump_packet ÇÔ¼ö´Â ÆÐŶ Çì´õ¿Í µ¥ÀÌÅÍÀÇ ³»¿ëÀ» °¡¸®Å°°í ÀÖ´Â buff Æ÷ÀÎÅÍ¿Í buffÀÇ ³»¿ëÀ» ÀúÀåÇÒ ÆÄÀÏ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ¹Þ½À´Ï´Ù.
84Çà ~ 123Çà : 16¹ÙÀÌÆ®¸¦ °£°ÝÀ¸·Î ¼ö½ÅÇÑ µ¥ÀÌÅÍ Å©±â¸¸Å Ethernet Çì´õºÎÅÍ µ¥ÀÌÅÍ ³»¿ë±îÁö 16Áø¼ö¿Í ASCII ¹®ÀڷΠǥÁØÃâ·Â°ú ÀÎÀÚ·Î ¹ÞÀº ÆÄÀÏ Æ÷ÀÎÅÍ·Î Ãâ·ÂÇÕ´Ï´Ù.
128Çà : tcp_ftoa ÇÔ¼ö´Â tcp Çì´õÀÇ Á¦¾î Ç÷¡±× ºñÆ® °ª°ú Á¦¾î Ç÷¡±× ¹®ÀÚ¿À» ÀúÀåÇÒ
¹®ÀÚ¿ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ¹Þ½À´Ï´Ù.
130Çà : tcp Á¦¾î Ç÷¡±×ÀÎ "URG", "ACK",
"PSH", "RST", "SYN", "FIN" ¹®ÀÚ¿À» f¹è¿¿¡ ÀúÀåÇÕ´Ï´Ù.
132Çà : Tcp Á¦¾î Ç÷¡±×´Â 6ºñÆ®·Î Ç¥ÇöµÇ±â ¶§¹®¿¡
6¹øÂ° ºñÆ®¸¦ ±âÁØÀ¸·Î AND ¸¶½ºÅ©ÇÒ º¯¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù.
135Çà ~ 145Çà : flag º¯¼ö¸¦ 0ºÎÅÍ 5±îÁö ¿ÞÂÊ ½¬ÇÁÆ®ÇÏ¿© mask º¯¼ö·Î AND ¸¶½ºÅ©ÇÏ¸é ¾î´À ºñÆ®°¡ 1·Î ¼¼ÆÃ µÇ¾ú´ÂÁö È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. 1·Î ¼¼ÆÃµÈ Á¦¾î Ç÷¹±×¸¦ ¸ÊÇÎµÈ tcpÇ÷¡±× ¹®ÀÚ¿·Î ¹Ù²Ù¾î str ¹®ÀÚ¿ º¯¼ö¿¡ º¹»çÇÕ´Ï´Ù.
154Çà : print_ip ÇÔ¼ö´Â ip ±¸Á¶Ã¼ Æ÷ÀÎÅÍ º¯¼ö¿Í ipÇì´õÀÇ
³»¿ëÀ» ÀúÀåÇÒ ÆÄÀÏ Æ÷ÀÎÅÍ º¯¼ö¸¦ ÀÎÀÚ·Î ¹Þ½À´Ï´Ù.
163Çà : ipÇì´õÀÇ identifier, TTL, Checksum ³»¿ëÀ» ip ±¸Á¶Ã¼ÀÇ ¸â¹ö º¯¼ö¸¦ ÅëÇØ ÃßÃâÇÕ´Ï´Ù. °¢°¢ÀÇ µ¥ÀÌÅÍ¿¡´Â ip±¸Á¶Ã¼ÀÇ ip_id, ip_ttl, ip_sum ¸â¹ö º¯¼ö °ªÀÌ
´ëÀԵ˴ϴÙ.
171Çà ~ 179Çà : ipÇì´õÀÇ Ãâ¹ßÁö ip, ¸ñÀûÁö ip ³»¿ëÀ» ip±¸Á¶Ã¼ÀÇ ¸â¹ö º¯¼ö¸¦ ÅëÇØ ÃßÃâÇÕ´Ï´Ù. °¢°¢ÀÇ µ¥ÀÌÅÍ¿¡´Â ip±¸Á¶Ã¼ÀÇ
ip_src, ip_dst ¸â¹öº¯¼ö °ªÀÌ ´ëÀԵ˴ϴÙ.
3. ¸ÎÀ½¸»
Áö±Ý±îÁö /proc µð·ºÅ丮¿¡ ´ã±ä Á¤º¸¸¦ ºÐ¼®, ÀÌ¿ëÇÏ¿© ƯÁ¤ ÇÁ·Î¼¼½º°¡
»ç¿ë ÁßÀÎ Æ÷Æ® ¹øÈ£¸¦ ÃßÃâÇÏ´Â ¹æ¹ý°ú socket ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇÏ¿© TCP/IP Çì´õ¿Í ½ÇÁ¦ µ¥ÀÌÅ͸¦ ºÐ¼®ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ °øºÎÇϰí, ½ÇÁ¦
±¸ÇöÇÏ´Â ¹æ¹ý±îÁö ¾Ë¾Æº¸¾Ò½À´Ï´Ù. º» ÇÁ·Î±×·¥Àº /proc µð·ºÅ丮ÀÇ
ÇÁ·Î¼¼½º Á¤º¸¿Í ³×Æ®¿öÅ© Á¤º¸¸¸À» ´Ù·ç¾úÁö¸¸ /proc µð·ºÅ丮¿¡´Â ½Ã½ºÅÛ¿¡ °ü·ÃµÈ °ÅÀÇ ´ëºÎºÐÀÇ Á¤º¸¸¦
°¡Áö°í Àֱ⠶§¹®¿¡ ½Ã½ºÅÛ ¸ð´ÏÅ͸µ ÇÁ·Î±×·¥À̳ª ½Ã½ºÅÛ ¼º´É ºÐ¼® ÇÁ·Î±×·¥ µîÀ» °³¹ßÇϴµ¥ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.
º» ¹®¼¿¡¼´Â
ÀÌ¿Í À¯»çÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇÑ Á¦ÀÛ °úÁ¤À» ¼Ò°³Çϱâ À§ÇÑ ¸ñÀûÀ¸·Î ÀÛ¼ºµÇ¾ú±â ¶§¹®¿¡ ±â´ÉÀÌ ¹Ì¾àÇÏ°í ºÒ¾ÈÀüÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¹®¼¿¡¼ ¼³¸íÇÑ ÇÁ·Î±×·¥¿¡ ½º´ÏÇÎ µÈ ÆÐŶµéÀÇ µ¥ÀÌÅ͸¦ ÇÁ·ÎÅäÄÝ, IP ÁÖ¼Ò
º°·Î ºÐ·ùÇϰųª ±âŸ Åë°è ±â´É µîÀ» Ãß°¡ÇÑ´Ù¸é ´õ¿í À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀ¸·Î »ý°¢ÇÕ´Ï´Ù.
----------- Àüü ¼Ò½ºÄÚµå -----------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <netdb.h>
#include <dirent.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#define
__FAVOR_BSD
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <netinet/if_ether.h>
#include <arpa/inet.h>
#include <linux/sockios.h>
#define MAXSIZE 4096
#define BUFSIZE 128
void tcp_ftoa(int flag, char *str);
void print_ip(struct ip *ip, FILE *fp);
void print_tcp(struct tcphdr *tcp, FILE *fp);
void print_udp(struct udphdr *udp);
void dump_packet(unsigned char *buff, int len, FILE *fp);
int ProcParser(char *proc_file, char *proc_name);
int IsDigit(char *str);
int HexToDecimal(char *buffer);
int SockMapPort(char* ProcTcp, char* sockdevnum, unsigned
short* processPortNum);
unsigned short FindPortNum(char* processID);
unsigned short FindProcInfo(char* process);
void packetCapture(unsigned short portnum, FILE *wfp);
void help(char *cmd);
int main(int argc, char **argv)
{
int c;
char data[BUFSIZE];
unsigned short portnum;
FILE
*wfp;
while ((c = getopt(argc, argv, "i:p:")) != EOF) {
switch (c) {
case 'i':
portnum = FindProcInfo(argv[2]);
break;
case 'p' :
portnum = FindProcInfo(argv[2]);
break;
case 'h':
help(argv[0]);
default:
help(argv[0]);
exit(1);
break;
}
}
if(argc < 2) {
fprintf(stderr, "parameter errror!\n");
help(argv[0]);
exit(1);
}
sprintf(data, "process_%s", argv[2]);
if((wfp = fopen(data, "wa"))==NULL) {
perror("file open error\n");
exit(0);
}
packetCapture(portnum, wfp);
fclose(wfp);
return 0;
}
void tcp_ftoa(int flag, char *str)
{
static
char f[][3] = {"URG", "ACK", "PSH",
"RST", "SYN", "FIN"};
int length = 0;
u_int mask = 1 << 5;
int i;
for(i = 0;i<6;i++) {
if (((flag << i) & mask) != 0)
{
strncat(str, f[i], 3);
strncat(str, " ", 1);
}
}
length = strlen(str);
str[length] = '\0';
}
void print_ip(struct ip *ip, FILE *fp)
{
char buf[BUFSIZE];
printf("Protocol: IP\n");
sprintf(buf, "Protocol: IP\n");
fputs(buf, fp);
printf("+-------------------------+--------+----------------+\n");
sprintf(buf,
"+-------------------------+--------+----------------+\n");
fputs(buf, fp);
printf("| Identifier: %5u|
TTL:%3u| Checksum: %5u|\n",
ntohs(ip->ip_id), ip->ip_ttl, ntohs(ip->ip_sum));
sprintf(buf, "| Identifier: %5u|
TTL:%3u| Checksum: %5u|\n",
ntohs(ip->ip_id), ip->ip_ttl, ntohs(ip->ip_sum));
fputs(buf, fp);
printf("+------------+------------+-------------------------+\n");
sprintf(buf,
"+------------+------------+-------------------------+\n");
fputs(buf, fp);
printf("| Source IP Address:
%15s|\n",
inet_ntoa(*(struct in_addr *)&(ip->ip_src)));
sprintf(buf, "| Source IP Address:
%15s|\n",
inet_ntoa(*(struct in_addr *)&(ip->ip_src)));
fputs(buf, fp);
printf("+---------------------------------------------------+\n");
sprintf(buf, "+---------------------------------------------------+\n");
fputs(buf, fp);
printf("| Destination IP Address:
%15s|\n",
inet_ntoa(*(struct in_addr *)&(ip->ip_dst)));
sprintf(buf, "| Destination IP Address:
%15s|\n",
inet_ntoa(*(struct in_addr *)&(ip->ip_dst)));
fputs(buf, fp);
printf("+---------------------------------------------------+\n");
sprintf(buf,
"+---------------------------------------------------+\n");
fputs(buf, fp);
}
void print_tcp(struct tcphdr *tcp, FILE *fp)
{
char buf[BUFSIZE];
char str[17];
memset(str, 0, sizeof(str));
printf("protocol: TCP\n");
sprintf(buf, "protocol: TCP\n");
fputs(buf, fp);
printf("+-------------------------+-------------------------+\n");
sprintf(buf,
"+-------------------------+-------------------------+\n");
fputs(buf, fp);
printf("| Source
Port: %5u| Destination Port: %5u|\n",
ntohs(tcp->th_sport), ntohs(tcp->th_dport));
sprintf(buf, "| Source
Port: %5u| Destination Port: %5u|\n",
ntohs(tcp->th_sport), ntohs(tcp->th_dport));
fputs(buf, fp);
printf("+-------------------------+-------------------------+\n");
sprintf(buf,
"+-------------------------+-------------------------+\n");
fputs(buf, fp);
printf("| Sequence Number:
%10lu|\n",
(u_long)ntohl(tcp->th_seq));
sprintf(buf, "| Sequence Number:
%10lu|\n",
(u_long)ntohl(tcp->th_seq));
fputs(buf, fp);
printf("+---------------------------------------------------+\n");
sprintf(buf,
"+---------------------------------------------------+\n");
fputs(buf, fp);
tcp_ftoa(tcp->th_flags, str);
printf("| Ack Number: %10lu| Flag:
%10s|\n",
(u_long)ntohl(tcp->th_ack), str);
sprintf(buf, "| Ack Number: %10lu| Flag:
%10s|\n",
(u_long)ntohl(tcp->th_ack), str);
fputs(buf, fp);
printf("+-------------------------+-------------------------+\n");
sprintf(buf,
"+-------------------------+-------------------------+\n");
fputs(buf, fp);
printf("| Checksum:
%5u| Urgent Pointer:
%5u|\n",
ntohs(tcp->th_sum), ntohs(tcp->th_urp));
sprintf(buf, "| Checksum:
%5u| Urgent Pointer:
%5u|\n",
ntohs(tcp->th_sum), ntohs(tcp->th_urp));
fputs(buf, fp);
printf("+-------------------------+-------------------------+\n");
sprintf(buf, "+-------------------------+-------------------------+\n");
fputs(buf, fp);
}
void print_udp(struct udphdr *udp)
{
printf("Protocol: UDP\n");
printf("+-------------------------+-------------------------+\n");
printf("|Source
Port: %5u|
Dest Port:
%5u|\n",
ntohs(udp->uh_sport), ntohs(udp->uh_dport));
printf("+-------------------------+-------------------------+\n");
printf("|Length:
%5u| Ckecksum:
%5u|\n",
ntohs(udp->uh_ulen), ntohs(udp->uh_sum));
printf("+-------------------------+-------------------------+\n");
}
void dump_packet(unsigned char *buff, int len, FILE *fp)
{
int i, j;
char buf[BUFSIZE];
printf("Packet Dump:\n");
sprintf(buf, "Packet Dump\n");
fputs(buf, fp);
for (i = 0; i < len; i += 16) {
for (j = i; j < i + 16 && j < len; j++) {
printf("%02x", buff[j]);
sprintf(buf, "%02x", buff[j]);
fputs(buf, fp);
if (j % 2 == 1){
printf(" ");
sprintf(buf, " ");
fputs(buf, fp);
}
}
if (j == len && len % 16 != 0)
for (j = 0; j < 40 - (len % 16)*2.5; j++){
printf(" ");
sprintf(buf, " ");
fputs(buf, fp);
}
printf(": ");
sprintf(buf, ": ");
fputs(buf, fp);
for (j = i; j < i + 16 && j < len; j++) {
if ((buff[j] >= 0x20) && (buff[j] <= 0x7e)){
putchar(buff[j]);
sprintf(buf, "%c", buff[j]);
fputs(buf, fp);
}
else{
printf(".");
sprintf(buf, ".");
fputs(buf, fp);
}
}
printf("\n");
fputs("\n", fp);
}
}
void help(char *cmd)
{
fprintf(stderr, "usage: %s [-i processid] [-p
processname] \n", cmd);
}
void packetCapture(unsigned short portnum, FILE *wfp)
{
struct ether_header *eth;
struct ether_arp *arp;
struct ip *ip;
struct icmp *icmp;
struct tcphdr *tcp;
struct udphdr *udp;
int s;
int len;
int c;
char buff[MAXSIZE];
char *packetPointer;
char *packetFirst;
char buf[BUFSIZE];
int i;
char data[BUFSIZE];
if ((s = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) <
0) {
perror("socket");
exit(1);
}
while (1){
if ((len = read(s, buff, MAXSIZE)) < 0) {
perror("read");
exit(1);
}
packetPointer = packetFirst = buff;
eth = (struct ether_header *) packetPointer;
packetPointer = packetPointer + sizeof (struct
ether_header);
printf("ether : %d\n", sizeof(struct
ether_header));
if (ntohs(eth->ether_type) == ETHERTYPE_IP) {
ip = (struct ip *) packetPointer;
printf("ip : %d\n", sizeof(struct ip));
packetPointer = packetPointer + ((int)(ip->ip_hl)
<< 2);
switch (ip->ip_p) {
case IPPROTO_TCP:
tcp = (struct tcphdr *) packetPointer;
if((portnum ==
ntohs(tcp->th_sport))
|| (portnum == ntohs(tcp->th_dport))){
cketPointer = packetPointer + ((int)(tcp->th_off)
<< 2);
print_ip(ip, wfp);
print_tcp(tcp, wfp);
dump_packet(packetFirst, len, wfp);
printf("\n");
sprintf(buf, "\n");
fputs(buf, wfp);
fflush(stdout);
}
break;
case IPPROTO_UDP:
udp = (struct udphdr *) packetPointer;
if((portnum == ntohs(udp->uh_sport))
|| (portnum == ntohs(udp->uh_dport))){
print_ip(ip, wfp);
print_udp(udp);
dump_packet(packetFirst, len, wfp);
printf("\n");
sprintf(buf, "\n");
fputs(buf, wfp);
fflush(stdout);
}
break;
}
}
}
}
int ProcParser(char *proc_file, char *proc_name)
{
FILE
*fp;
char buf[512] = {0x00,};
int pid;
char *pname;
fp = fopen(proc_file, "r");
if (fp == NULL)
{
perror("error : ");
exit(0);
}
fgets(buf, 511, fp);
pid = atoi(strtok(buf, " "));
pname = (char*)strtok(NULL, " ");
if(strncmp(pname, proc_name, strlen(proc_name)))
{
return
0;
}
else
{
return
1;
}
fclose(fp);
}
int IsDigit(char *str)
{
int i;
for (i = 0; i < strlen(str); i++)
{
if (isdigit(str[i])==0)
return 0;
}
return 1;
}
int HexToDecimal(char *buffer)
{
int count=0, decimal=0;
for(count =0;count<4;count++)
{
if(buffer[count]>='0' && buffer[count]<='9')
{
decimal *= 16;
decimal += buffer[count] - '0';
}
else if(buffer[count]>='A' &&
buffer[count]<='F')
{
decimal *= 16;
decimal += buffer[count] - 'A' + 10;
}
}
return decimal;
}
int SockMapPort(char* ProcTcp, char* sockdevnum, unsigned
short* processPortNum)
{
DIR
*directory;
struct dirent *entry = NULL;
char buffer[256];
char *parsing;
char hexPortNum[40];
int culcount;
int linecount;
int find;
FILE
*fp;
culcount = linecount = find = 0;
fp = fopen(ProcTcp, "r");
if (fp == NULL)
{
perror("/proc/net/tcp(6) error");
exit(0);
}
linecount = 0;
while(fgets(buffer,256, fp) != NULL)
{
if(linecount == 0)
{
linecount++;
continue;
}
culcount = 0;
parsing = strtok(buffer, ": ");
while((parsing = strtok(NULL, ": ")) != NULL)
{
if(culcount == 1)
{
strcpy(hexPortNum, parsing);
}
if(!strncmp(parsing, sockdevnum, strlen(sockdevnum)))
{
find = 1;
break;
}
else
{
}
culcount++;
}
if(find) break;
}
if(find){
*processPortNum
= HexToDecimal(hexPortNum);
return 1;
}
else
return 0;
}
unsigned short FindPortNum(char* processID)
{
DIR
*directory;
struct dirent *entry = NULL;
char procBuff[40];
char sockBuff[40];
char retBuff[40];
char *sockdev;
char *sockdevnum;
char ProcTcp[20];
int ret;
unsigned short processPortNum;
sprintf(procBuff,"/proc/%s/fd", processID);
if ((directory = opendir(procBuff)) == NULL)
{
perror("/proc opendir error");
exit(0);
}
while((entry = readdir(directory)) != NULL)
{
if (strcmp(entry->d_name, ".") !=0 &&
strcmp(entry->d_name, "..") != 0
&& strcmp(entry->d_name, "0") != 0 &&
strcmp(entry->d_name, "1") !=0
&& strcmp(entry->d_name, "2") != 0)
{
sprintf(sockBuff,"/proc/%s/fd/%s", processID,
entry->d_name);
readlink(sockBuff, retBuff, sizeof(retBuff));
sockdev = strtok(retBuff, ":[");
if(strcmp(sockdev, "socket"))
continue;
sockdevnum = strtok(NULL, ":[]");
break;
}
}
sprintf(ProcTcp, "/proc/net/tcp");
ret = SockMapPort(ProcTcp, sockdevnum, &processPortNum);
if(ret == 0)
{
sprintf(ProcTcp, "/proc/net/tcp6");
SockMapPort(ProcTcp, sockdevnum, &processPortNum);
}
closedir(directory);
return processPortNum;
}
unsigned short FindProcInfo(char* process)
{
DIR
*directory;
struct dirent *entry = NULL;
char proc_file[40];
char proc_name[20];
int processFlag = 0;
unsigned short port;
if (IsDigit(process))
{
processFlag
= 1;
}
else
{
sprintf(proc_name,
"(%s)", process);
}
if(processFlag == 0)
{
system(process);
if
((directory = opendir("/proc")) == NULL)
{
perror("/proc opendir error");
exit(0);
}
while((entry
= readdir(directory)) != NULL)
{
if (strcmp(entry->d_name, ".") !=0 &&
strcmp(entry->d_name, "..") != 0)
{
sprintf(proc_file,"/proc/%s/stat",
entry->d_name);
if
(access(proc_file, F_OK) != 0)
{
continue;
}
if
(IsDigit(entry->d_name))
{
if(ProcParser(proc_file, proc_name))
{
port = FindPortNum(entry->d_name);
printf("processName : %s\nport : %d\n", process,
port);
break;
}
}
else
{
}
}
}
closedir(directory);
}
else
{
port
= FindPortNum(process);
printf("processID
: %s\nport : %d\n", process, port);
}
return port;
}