¸®´ª½º¿¡¼­ ƯÁ¤ ÇÁ·Î¼¼½º¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Â
ÆÐŶ ½º´ÏÇÎ ÇÁ·Î±×·¥ Á¦ÀÛÇϱâ

 

 

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;

}