1.
¼Ò°³
¾²·¹µå »ý¼ºÀº ÇÁ·Î¼¼½º »ý¼º¿¡ ºñÇØ ½Ã½ºÅÛ ÀÚ¿øÀ» ¸¹ÀÌ ¼ÒºñÇÏÁö
¾Ê°í °¡º±°Ô µ¿ÀÛÇϱ⠶§¹®¿¡ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼ ´ÙÁß Á¢¼ÓÀ» ó¸® ÇÒ ¶§³ª ÇÁ·Î¼¼¼ ³»ÀÇ µ¿ÀÏ ÀÛ¾÷À» º´·ÄÀûÀ¸·Î ó
¸®ÇÒ ¶§ ¸¹ÀÌ »ç¿ëµÇ´Â ±â¹ýÀÔ´Ï´Ù.
Port Scan ÀÛ¾÷Àº ¸ñÇ¥ ³×Æ®¿öÅ©¸¦ °ø·«Çϱâ À§ÇÑ Áß¿äÇÑ ÀÛ¾÷
Áß¿¡ ÇϳªÀε¥ ³×Æ®¿öÅ© ȯ°æ¿¡ µû¶ó Scan ÀÛ¾÷ÀÌ ±²ÀåÈ÷ ¿À·¡ °É¸®´Â °æ¿ì°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù
. ƯÈ÷ Å« ´ë¿ªÀ» ScanÇÒ ¶§ µî ¾ÆÁÖ ¸¹Àº Port¸¦ °Ë»öÇÒ ¶§ ¹®Á¦°¡ µÉ ¼ö ÀÖ½À´Ï´Ù. º» ¹®¼´Â ÀÌ·¯ÇÑ ¹®Á¦Á¡À»
±Øº¹Çϱâ À§ÇÑ ¹æ¾ÈÀ¸·Î ¾²·¹µå¸¦ Port Scan¿¡ µµÀÔÇÏ´Â
³»¿ë¿¡ ´ëÇØ¼ ´Ù·ê °ÍÀÔ´Ï´Ù. ¶ÇÇÑ º» ¹®¼´Â Port Scan¿¡
¾²·¹µå ±â´ÉÀ» µµÀÔÇÏ¿© Scan ½Ã°£À» ³¶ºñÇÏÁö ¾Êµµ·Ï
ÇÏ´Â °ÍÀÌ ¸ñÇ¥À̹ǷΠ¸¹Àº ³»¿ëÀ» ´Ù·çÁö ¾Ê°í Scan ÀÛ¾÷¿¡ Á÷Á¢ÀûÀ¸·Î °ü·ÃµÈ ¾²·¹µå¸¸À» ¼³¸íÇÒ °ÍÀÔ´Ï´Ù.
2.
±â¼úÀûÀÎ
³»¿ë
(1) ¾²·¹µå¶õ
¾²·¹µå´Â ÈçÈ÷ °æ·® ÇÁ·Î¼¼½º, ¼¼¹Ì
ÇÁ·Î¼¼½º¶ó ÁöĪÇϴµ¥, ÇÁ·Î±×·¥¿¡¼ ¼öÇàÇÏ´Â ¸í·ÉÀÇ È帧À» µ¿½Ã¿¡ ó¸®Çϵµ·Ï ÇÏ´Â °ÍÀÌ °¡Àå
Å« Ư¡ÀÔ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î¼¼½ºÀÇ °æ¿ì ÇÁ·Î±×·¥ ¸í·ÉµéÀÌ ´ÜÀÏÀûÀ¸·Î ȤÀº ¼øÂ÷ÀûÀ¸·Î 󸮵ÇÁö¸¸, ¾²·¹µå¸¦ »ç¿ëÇÏ°Ô µÇ¸é ÇÁ·Î±×·¥ ¸í·ÉµéÀ» º´·ÄÀûÀ¸·Î ó¸®ÇÒ ¼ö
Àֱ⠶§¹®¿¡ ¸Å¿ì ºü¸¥ ¼Óµµ·Î µ¿ÀÛÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î ¼öÇàÇØ¾ß ÇÒ ÀÛ¾÷ÀÌ ¸¹Àº ÇÁ·Î±×
·¥ÀÏ
°æ¿ì ¾²·¹µå »ç¿ë ¿©ºÎ¿¡ µû¶ó ó¸® ¼Óµµ°¡ ´ë·« ½º¹« ¹è ÀÌ»ó Â÷À̰¡ ³¯ ¼ö ÀÖ½À´Ï´Ù. À̿ܿ¡µµ ¾²·¹µå °£¿¡´Â °øÀ¯ ¸Þ¸ð¸® °ø°£À» °®°í Àֱ⠶§¹®¿¡
ÇÁ·Î±×·¥ ±¸ÇöÀÌ Æí¸®ÇÏ´Ù´Â ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù.
¾²·¹µåÀÇ ´ÜÁ¡À¸·Î, ÀÛ¾÷À»
¼öÇàÇÏ´Â µµÁß, µ¿½Ã¿¡ ƯÁ¤ ¸Þ¸ð¸®¿¡ Á¢±ÙÇßÀ» ¶§ ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼öµµ ÀÖ½À´Ï´Ù. ¶Ç µ¿ÀÛÁßÀÎ ¿©·¯ °³ÀÇ ¾²·¹µå Áß Çϳª¶óµµ À߸øµÈ ¿¬»êÀ» ÇϰÔ
µÉ °æ¿ì ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ ÇÁ·Î¼¼½º Àüü°¡ Á×°Ô µË´Ï´Ù. ±×¸®°í, ¿©·¯
¸í·ÉÀÌ µ¿½Ã¿¡ ½ÇÇàµÇ±â ¶§¹®¿¡ µð¹ö±ë ÀÛ¾÷ÀÌ ¾î·Æ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù.
(2) ¾²·¹µå
API
º» ¹®¼¿¡¼ ´Ù·ç°Ô µÉ ¾²·¹µå
API´Â POSIX ¾²·¹µåÀε¥ ¿î¿µÃ¼Á¦¿¡
°ü°è¾øÀÌ »ç¿ëµÉ ¼ö Àִ ȣȯ¼ºÀÌ ÁÁÀº ¶óÀ̺귯¸®·Î pthread(Posix ThreadÀÇ ÁÙÀÓ¸»)ÀÔ´Ï´Ù.
1) ¾²·¹½º »ý¼º
|
#include<pthread.h>
int pthread_create(pthread_t
*thread, pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
|
• thread : ¾²·¹µå
½Äº°ÀÚ. ´Ù¸¥ ¾²·¹µå¿Í
±¸ºÐµÉ ¼ö ÀÖ´Â ID¸¦ ÇÒ´ç¹Þ°Ô µË´Ï´Ù.
• attr : »ý¼ºµÇ´Â ¾²·¹µåÀÇ Æ¯¼ºÀ» Á¤Çϱâ À§ÇØ
»ç¿ëµÇ´Âµ¥, ÀϹÝÀûÀ¸·Î NULLÀ» »ç¿ëÇÕ´Ï´Ù.
• start_routine :
¸®ÅÏ Å¸ÀÔÀÌ void*À̰í
ÀÎÀÚµµ void*ÀÎ ÇÔ¼ö Æ÷ÀÎÅÍ·Î ¾²·¹µå°¡ ½ÇÇà½Ãų¾²·¹µå ÇÔ¼öÀÔ´Ï´Ù.
• arg : ¾²·¹µå¿¡ ÀÇÇØ È£ÃâµÇ´Â ÇÔ¼ö(start_routine Æ÷ÀÎÅÍ¿¡ ´ëÀÔµÈ ÇÔ¼ö)¿¡ ÀüµÉµÇ´Â ÇÔ¼ö ÀÎÀÚ ÀÔ´Ï´Ù.
ÀÌ ÇÔ¼ö¿¡¼ Áß¿äÇÑ ÀÎÀÚ´Â ¾²·¹µå ½Äº°ÀÚ(thread)¿Í, ¾²·¹µå »ý¼º½Ã È£ÃâµÇ´Â ÇÔ¼ö(start_routine)ÀÔ´Ï´Ù.
2) ¾²·¹µå ±â´Ù¸²
|
#include<pthread.h>
int pthread_join(pthread_t
th, void **thread_return);
|
• th : ¾²·¹µå°¡ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸®´Â ¾²·¹µå ½Äº°ÀÚÀÔ´Ï´Ù.
• thread_return :
¾²·¹µå°¡ Á¾·á½Ã ¹ÝȯÇÏ´Â °ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â
Æ÷ÀÎÅÍÀÔ´Ï´Ù.
»ý¼ºµÈ ¾²·¹µå°¡ Á¾·áµÉ ¶§±îÁö ±â´Ù¸®±â À§ÇÑ ÇÔ¼öÀÔ´Ï´Ù. ¸¸¾à ÇÁ·Î¼¼½º°¡
¾²·¹µå¸¦ »ý¼ºÇÑ ÈÄ¿¡ ¾²·¹µå°¡ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸®Áö
¾Ê°í ÇÁ·Î¼¼½º¸¦ Á¾·áÇÏ¸é ¾²·¹µåµµ µ¿½Ã¿¡ ¸ðµÎ Á¾·áµÇ±â ¶§¹®¿¡ ¸ðµç ¾²·¹µå¸¦ ¾ÈÀüÇÏ°Ô ½ÇÇà½Ã۱â À§Çؼ ¹Ýµå½Ã »ç¿ëµÇ¾î¾ß ÇÏ´Â ÇÔ¼ö ÀÔ´Ï´Ù.
3) ¾²·¹µå ½Äº°ÀÚ ¹Ýȯ
|
#include<pthread.h>
int pthread_self();
|
pthread_self ÇÔ¼ö¸¦ ½ÇÇàÇϸé ÇØ´ç ¾²·¹µåÀÇ ½Äº°ÀÚ¸¦ ¹ÝÈ¯ÇØÁÝ´Ï´Ù.
4) ¾²·¹µå ºÐ¸®
|
#include<pthread.h>
int pthread_detach(pthread_t
th);
|
• th : ¸ÞÀÎ ¾²·¹µå¿¡¼ ºÐ¸®ÇÒ ¾²·¹µå ½Äº°ÀÚÀ̰í, ¾²·¹µå°¡ ºÐ¸®µÇ¸é Á¾·áµÇ¸é¼ ÀÚ¿øÀ» Áï½Ã ÇØÁ¦½ÃÄÑ ÁÝ´Ï´Ù.
5) ¾²·¹µå Á¾·á
|
#include<pthread.h>
int pthread_exit(void *retval);
|
ÇöÀç ½ÇÇà ÁßÀÎ ¾²·¹µå¸¦ Á¾·á½Ãų ¶§ »ç¿ëµÇ´Â ÇÔ¼öÀÔ´Ï´Ù. Á¾·á ÈÄ¿¡ pthread_joinÇÔ¼ö¸¦
ÅëÇÏ¿© ¸ðµç ÀÚ¿øÀ» ÇØÁ¦ ½Ãŵ´Ï´Ù.
(3) ¾²·¹µå µ¿±âÈ API
¾²·¹µå´Â ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼ ³ª´µ¾îÁø °ÍÀ¸·Î µ¥ÀÌÅ͸¦ °øÀ¯ÇÒ ¼ö
ÀÖ´Ù°í ÇÏ¿´½À´Ï´Ù. ¿©·¯ °³ÀÇ ¾²·¹µå°¡ Àü¿ª º¯¼ö¿¡ Á¢±ÙÇÏ´Â
°æ¿ì¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö Àִµ¥ À̰ÍÀ» ÀÓ°è ¿µ¿ª(Critical Section)À¸·Î º¼ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹®¼¿¡¼´Â ¹ÂÅØ½º(mutex)¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅÍ µ¿½Ã Á¢±Ù ¹®Á¦¸¦ ÇØ°áÇÕ´Ï´Ù. ¹ÂÅØ½º¸¦ Áö¿øÇÏ´Â pthreadÀÇ
ÇÔ¼ö¸¦ ¾Ë¾Æº¸°Ú½À´Ï´Ù.
|
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t
*mutex, const pthread_mutexattr_t
*mutexattr);
int pthread_mutex_lock(pthread_mutex_t
*mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
|
• pthread_mutex_init : ¹ÂÅØ½º¸¦ »ç¿ëÇϱâ Àü¿¡ ÃʱâÈ °úÁ¤À» °ÅÄ¡±â
À§ÇÑ ÇÔ¼öÀÔ´Ï´Ù. ù ¹øÂ° ÀÎÀÚ¿¡´Â ÃʱâÈÇϰíÀÚ ÇÏ´Â ¹ÂÅØ½º
Æ÷ÀÎÅ͸¦ ³Ñ±â°í, µÎ ¹øÂ° ÀÎÀÚ¿¡´Â ¹ÂÅØ½º ¼Ó¼º(attribute)¸¦ ¼³Á¤ÇÒ ¶§ »ç¿ëÇÕ´Ï´Ù. ¼Ó¼ºÀ» »ç¿ëÇÏÁö ¾ÊÀ»
¶§´Â NULLÆ÷ÀÎÅ͸¦ ³Ñ±é´Ï´Ù.
• pthread_mutex_lock : ¹ÂÅØ½º¸¦ °É¾î Àá±Û ¶§(lock) »ç¿ëÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ¹ÂÅØ½º¸¦ °É¾î Àá±×¸é ÈÄ¿¡ ÁøÀÔÇÏ´Â ¾²·¹µå´Â ¹ÂÅØ½º°¡ Ç®¸± ¶§±îÁö ´ë±âÇÏ°Ô µË´Ï´Ù.
• pthread_mutex_unlock : ¹ÂÅØ½º¸¦ Ç®¾îÁÙ ¶§ »ç¿ëÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ¹ÂÅØ½º¸¦ Àá±×¸é ¹Ýµå½Ã Ç®¾îÁà¾ß ´Ù¸¥ ¾²·¹µåµéÀÌ ÁøÀÔÇÒ ¼ö ÀÖ½À´Ï´Ù.
• pthread_mutex_destroy : ´õ ÀÌ»ó ¹ÂÅØ½º¸¦ »ç¿ëÇÏÁö ¾Ê°í ÀÌ¿Í
°ü·ÃµÈ ¸®¼Ò½º¸¦ ÇØÁ¦ÇÒ ¶§ »ç¿ëµÇ´Â ÇÔ¼öÀÔ´Ï´Ù.
(4) ¸ÖƼ ¾²·¹µå ±¸Çö ¿¹ (Æ÷Æ®½ºÄµ ÇÁ·Î±×·¥)
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹Ö ¸ðµ¨Àº ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼ äÆÃ ¼¹ö
µî, ´ÙÁß Á¢¼Ó 󸮸¦ À§ÇÑ ¸ñÀûÀ¸·Î ¸¹ÀÌ »ç¿ëµË´Ï´Ù. º»
¹®¼¿¡¼´Â À̰ÍÀ» ÀÀ¿ëÇÏ¿© ¸ñÇ¥ ¼¹öÀÇ Æ÷Æ®(65535°³) Áß¿¡
¾î¶² Æ÷Æ®°¡ ¿·ÁÀÖ´ÂÁö ºü¸¥ ½Ã°£ ¾È¿¡ È®ÀÎÇÒ ¼ö ÀÖ´Â Æ÷Æ®½ºÄµ ÇÁ·Î±×·¥À» Á¦ÀÛÇÏ´Â °úÁ¤À¸·Î ¿¹¸¦ µé¾î ¼³¸íÇϰڽÀ´Ï´Ù
.
¿¹Á¦ ÇÁ·Î±×·¥ÀÎ Æ÷Æ®½ºÄµ ÇÁ·Î±×·¥¿¡¼ 65535°³ÀÇ Æ÷Æ®¸¦ º´·ÄÀûÀ¸·Î
°Ë»öÇϱâ À§ÇØ ¸ÖƼ ¾²·¹µå¸¦ »ç¿ëÇÕ´Ï´Ù. ½Ã½ºÅÛ ÀÚ¿øÀÇ
ÇÑ°è ¹®Á¦Á¡À¸·Î ÀÎÇØ ÀϹÝÀûÀ¸·Î ÇÁ·Î¼¼½º´ç ¾²·¹µå »ý¼º°³¼ö°¡ Á¦ÇѵǾî ÀÖ½À´Ï´Ù. ¶ÇÇÑ °úµµÇÑ ¾²·¹µå¸¦ »ý¼ºÇÒ °æ¿ì ÇÁ·Î±×·¥ÀÌ Á¤»óÀûÀ¸·Î ÀÛµ¿µÇÁö
¾Ê´Â °æ¿ì°¡ Àִµ¥ º» ¹®¼¿¡¼´Â ÀÌ ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇØ ¾²·¹µå¸¦ »ý¼ºÇÑ ÈÄ, ¾²·¹µå »ý¼º°³¼ö(thread_cont)¸¦ Áõ°¡½ÃŰ´Â ºÎºÐÀ» ÀӰ迵¿ªÀ¸·Î ÁöÁ¤ÇÏ°í ¹ÂÅØ½º Àá±ÝÀ» ÅëÇØ Á¦ÇÑµÈ ¼ö(1000°³)¸¦ ³ÑÁö ¾Êµµ·Ï Çϰí ÀÖ½À´Ï´Ù. (1000°³ ¼öÄ¡´Â ½Ã½ºÅÛ¸¶´Ù À¯¿¬ÇϰÔ
¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.)
¸ÞÀÎ ÇÔ¼ö¿¡ ´ëÇÑ ³»¿ëÀº »ý·«ÇÏ°í ¾²·¹µå¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö¿Í ¾²·¹µå¿¡¼ ½ÇÇàÇÒ ³»¿ë¿¡ ´ëÇØ¼¸¸ ¼³¸íÇϰڽÀ´Ï´Ù. ¸ÞÀÎ ÇÔ¼öÀÇ ¿ªÇÒÀº
ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§ ÀÔ·ÂÇÏ´Â ¸í·É Àμö·ÎºÎÅÍ(argument) ¸ñÇ¥ ½Ã½ºÅÛÀÇ IPÁÖ¼Ò¸¦ ¾ò¾î¿Í thread_scan(¾²·¹µå¸¦ »ý¼ºÇÒ ÇÔ¼ö) ÇÔ¼ö¸¦
È£ÃâÇÏ´Â °Í ÀÔ´Ï´Ù.
|
1
2 #define ENDPORT 65535
3 int thread_count; //¾²·¹µå »ý¼º °³¼ö¸¦
³ªÅ¸³»´Â º¯¼ö
4 int dst_ip; //½ºÄµ´ë»ó ip
5 int flag = 1;
6
7 void thread_scan() //¾²·¹µå¸¦
»ý¼ºÇÒ ÇÔ¼ö
8 {
9 int i, start_port;
10 pthread_t thread_id[ENDPORT];
11 void*
t_return;
12 int value[ENDPORT];
13 struct sockaddr_in sock;
14 if(pthread_mutex_init(&mutex,
NULL)) fprintf(stderr, "mutex init
error\n");
15 printf("\nStart PortScan..........\n");
16 printf("port\tstate\n");
17 for(i=0, start_port = 0;i<ENDPORT;i++){
18
value[i]=++start_port;
19 pthread_mutex_lock(&mutex);
20 while(1){
21 if(thread_count < 1000){
22 if(pthread_create(&thread_id[i], NULL, tcpportscan,
(void*)&value[i])<0)
23
fprintf(stderr, "create
error\n");
24
thread_count++;
25
break;
26 }
27 else{
28
usleep(10);
29
continue;
30 }
// if(thread_count<1000)
31 }
// while()
32 pthread_mutex_unlock(&mutex);
33 }
//for
34 if(flag)
35
printf("All port close..........\n");
36 }
37
38
39 void *tcpportscan(void* arg) //¾²·¹µå¿¡¼ ½ÇÇàÇÒ ÇÔ¼ö
40
{
41 struct sockaddr_in dest; //¼ÒÄÏ ¾îµå·¹½º
42 int sockfd; //¼ÒÄÏ µð½ºÅ©¸³Æ®
43 int scanport;
44 int value;
45 int Error, ErrorLength;
46 struct timeval tv;
47 fd_set readfd, writefd;
48 pthread_t th;
49 th = pthread_self();
50 scanport= *(int*)arg;
51 memset((char*)&dest, 0, sizeof(dest));
52 dest.sin_family = AF_INET;
53 dest.sin_port = htons(scanport);
54 dest.sin_addr.s_addr = htonl(dst_ip);
55
56 if((sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0){
57
fprintf(stderr, "¼ÒÄÏ¿¡·¯\n");
58
close(sockfd);
59
pthread_detach(th);
60 }
61 value
= fcntl(sockfd, F_GETFL);
62 fcntl(sockfd, F_SETFL, value |
O_NONBLOCK);
63 if(connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) == 0){
64
printf("connect¿¡·¯");
65
close(sockfd);
66
pthread_detach(th);
67 }
68 //select
ŸÀӾƿô ¼³Á¤
69 tv.tv_sec = 2; //´ë±â½Ã°£ 2ÃÊ ¼³Á¤
70 tv.tv_usec = 0;
71 //select¿¡¼
°Ë»çÇÏ´Â µð½ºÅ©¸³Æ® ¼³Á¤
72 FD_ZERO(&readfd);
73 FD_ZERO(&writefd);
74 FD_SET(sockfd, &readfd);
75 FD_SET(sockfd, &writefd);
76
77 if(select(sockfd+1,
&readfd, &writefd,
NULL, &tv) <= 0) ;
78
else{
79 if(FD_ISSET(sockfd, &readfd) ||
FD_ISSET(sockfd, &writefd)){
80
ErrorLength = sizeof(Error);
81 if(getsockopt(sockfd, SOL_SOCKET,
SO_ERROR, &Error, &ErrorLength) == 0) {
82
if(Error == 0){
83 &
nbsp;
flag = 0; //¿¸° Æ÷Æ® ÀÖ´Ù´Â flag ¼³Á¤
84
&nb
sp;
printf("%d\topen\n",
scanport);
85
}
86 }//getsock
87 }//fd_isset
88 }//else
89 close(sockfd);
90 thread_count--;
91 pthread_detach(th);
92 }
|
ÇÁ·Î±×·¥ ÇØ¼³
2Çà : ÃÖ´ë Æ÷Æ®ÀÇ ÇÒ´ç °³¼ö°¡ 65535À̹ǷÎ
°Ë»öÆ÷Æ®ÀÇ °³¼ö¸¦ 65535°³·Î ÁöÁ¤Çϰí ÀÖ½À´Ï´Ù.
4Çà~5Çà : ¸ðµç ¾²·¹µå¿¡¼ ÂüÁ¶ ÇÒ ¼ö ÀÖµµ·Ï ½ºÄµ ´ë»ó È£½ºÆ® IP¸¦ Àü¿ª¹ø¼ö·Î ¼±¾ðÇϰí, °Ë»öµÈ
Æ÷Æ®°¡ ¾øÀ» ¶§ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇØÁÖ±â À§ÇÑ flag¸¦ ¼±¾ðÇÕ´Ï´Ù.
14Çà : µ¿±âÈ¿¡
ÇÊ¿äÇÑ ¹ÂÅØ½º¸¦ »ç¿ëÇϱâ À§ÇØ pthread_initÇÔ¼ö¸¦
È£ÃâÇϰí ÀÖ´Ù.
17Çà~33Çà : for¹®À» ÅëÇØ 65535±îÁö
port¹øÈ£¸¦ ´ëÀÔÇÏ´Â °úÁ¤À» ¹Ýº¹ÇÕ´Ï´Ù.
ÇÑ ÇÁ·Î¼¼½ºÀÇ ¾²·¹µå »ý¼º °³¼ö°¡ Á¦ÇѵǾî Àֱ⠶§¹®¿¡ ¹«Á¦ÇÑÀ¸·Î ¾²·¹µå¸¦ »ý¼ºµÇ´Â °Í
À» ¹æÁöÇϱâ À§ÇØ ¹ÂÅØ½º¸¦ »ç¿ëÇÕ´Ï´Ù. for¹®
½ÃÀÛ ºÎºÐ¿¡¼ ¹ÂÅØ½º Àá±ÝÇÔ¼öÀÎ pthread
_mutex_lockÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÀӰ迵¿ªÀ¸·Î
¼³Á¤ÇÏ°í ¾²·¹µå »ý¼º°³¼ö°¡ 1000°³ ÀÌÇÏÀÎÁö
¸¦ üũÇÕ´Ï´Ù. ¸¸¾à ¾²·¹µå »ý¼º°³¼ö°¡ 1000°³ ÀÌÇÏÀ̸é pthread_createÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿©
¾²·¹µå¸¦ »ý¼ºÇÏ°í ¼¼ ¹øÂ° ÀÎÀÚ¿¡ ½ÇÇàµÉ ¾²·¹µå ÇÔ¼ö·Î tcpportscanÇÔ¼ö¸¦ ´ëÀÔÇÏ¿´½À
´Ï´Ù. ¶ÇÇÑ,
tcpportscanÇÔ¼ö¿¡ ÇÒ´çµÉ ÀÎÀڷδ value¹è¿ÀÇ
°ªÀ¸·Î ´ëÀÔÇÏ¿´½À´Ï´Ù.
¾²·¹µå¸¦ »ý¼ºÇÏ°í ³ ÈÄ¿¡´Â pthread_mutex_unlockÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¹ÂÅØ½º
Àá±ÝÀ» Ç®¾î
ÁÝ´Ï´Ù.
¹Ý¸é¿¡ ¾²·¹µå
»ý¼º°³¼ö°¡ 1000°³¸¦ ³Ñ°Ô µÇ¸é ´Ù¸¥ ¾²·¹µå¿¡¼ ¾²·¹µå°¡ Á¾·áµÉ ¶§±îÁö
±â´Ù¸®µµ·Ï ÇÕ´Ï´Ù.
34Çà~35Çà : ¿·ÁÀÖ´Â Æ÷Æ®°¡ ¾øÀ» °æ¿ì Ãâ·ÂÇØÁÖ´Â ¸Þ½ÃÁöÀÔ´Ï´Ù.
39Çà : ¾²·¹µå ¸¶Áö¸· ºÎºÐ¿¡¼ pthread_detachÇÔ¼öÀÇ
ÀÎÀÚ·Î »ç¿ëÇϱâ À§ÇØ ¾²·¹µå ½Äº°ÀÚ¸¦ ¾ò¾î¿À´Â pthread_selfÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
50Çà : ¾²·¹µå ½ÇÇàÇÒ ÇÔ¼ö(tcpportscan)¸¦
È£ÃâÇÒ ¶§ ³Ñ¾î¿Â ÀÎÀÚ °ªÀ¸·Î port¹øÈ£ÀÔ´Ï´Ù.
56Çà :
socketÇÔ¼ö¸¦ ÅëÇØ ¼ÒÄÏ ÆÄÀϵð½ºÅ©¸³Å͸¦ »ý¼ºÇÕ´Ï´Ù.
59Çà, 66Çà, 92Çà : ¾²·¹µå¸¦ Á¾·áÇϰí ÀÚ¿øÀ» ÇØÁ¦Çϱâ À§ÇØ pthread_detachÇÔ¼ö¸¦
È£ÃâÇÕ´Ï´Ù.
61Çà~62Çà : fcntl´Â ¼ÒÄÏÆÄÀÏ ÁöÁ¤ÀÚ ÇÔ¼ö·Î F_GETFL¸¦ ÅëÇØ ÆÄÀÏ ÁöÁ¤ÀÚ Ç÷¡±×¸¦ Àоî¿À°í, F_SETFL·Î O_NONBLOCK
Ç÷¡±×¸¦ ÁöÁ¤ÇÏ¿© ¼ÒÄÏÀÌ ºí·ÏÅ·µÇÁö ¾Êµµ·Ï ÇÕ´Ï´Ù.
63Çà :
connect ÇÔ¼ö¸¦ ÅëÇØ Æ÷Æ®¿¡ ¿¬°á ¿äûÇÕ´Ï´Ù.
69Çà~70Çà : selectÇÔ¼ö°¡ ±â´Ù¸®´Â ŸÀӾƿô
½Ã°£(2ÃÊ ¼³Á¤)À» ÁöÁ¤ÇÕ´Ï´Ù.
72Çà~75Çà : FD_·Î ½ÃÀÛÇÏ´Â ÇÔ¼ö´Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ Á¦¾îÇϱâ À§ÇÑ ÇÔ¼ö·Î, FD_ZERO¸¦ ÅëÇØ ÀԷ°ú Ãâ·ÂÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ Å×À̺íÀ» 0À¸·Î ÃʱâÈ Çϰí, FD_SET¸¦ ÅëÇØ ¼ÒÄÏÀ» ÀԷ°ú Ãâ·ÂÀÇ ÆÄÀÏ
µð½ºÅ©¸³ÅÍ Å×ÀÌºí¿¡ ¼³Á¤ÇÕ´Ï´Ù.
77Çà :
selectÇÔ¼ö¸¦ ÅëÇØ tv±¸Á¶Ã¼ º¯¼ö¿¡
¼³Á¤µÈ ½Ã°£µ¿¾È ÆÄÀÏ µð½ºÅ©¸³ÅÍ Å×À̺íÀ» °Ë»çÇÕ´Ï´Ù.
78Çà~88Çà : FD_ISSET¸ÅÅ©·Î¸¦ ÅëÇØ ´Ù½Ã Çѹø ¼ÒÄÏÀÇ ÀÔ,Ãâ·ÂÀÇ º¯ÈÀÎÁö
È®ÀÎÇÕ´Ï´Ù. ±×¸®°í, getsockoptÇÔ¼ö¿¡ SO_ERROR ¿É¼ÇÀ» ÁöÁ¤ÇØ ¼ÒÄÏ ¿¡·¯ »óŸ¦ ¹ÝÈ¯ÇØÁִµ¥, ¹Ýȯ
°ªÀÌ 0À̰í, Errorº¯¼ö¿¡ 0ÀÌ ÇÒ´çµÇ¸é ¿¡·¯°¡ ¾ø´Â °ªÀ̹ǷΠÁ¤»óÀûÀÎ ¼ÒÄÏÀÇ ÀÔ, Ãâ·Â º¯È¶ó°í
ÆÇ´ÜÇÏ°í ¿·ÁÀÖ´Â Æ÷Æ®¹øÈ£¸¦ Ãâ·ÂÇØÁÝ´Ï´Ù. flagº¯¼ö´Â ¸ðµç Æ÷Æ®°¡ ´ÝÇôÀÖÀ» ¶§ÀÇ Ãâ·Â¹®À» À§ÇÑ º¯¼öÀÔ´Ï´Ù.
3. ¸¶Ä¡´Â ¸»
Áö±Ý±îÁö ¸ÖƼ ¾²·¹µå¿¡ ´ëÇÑ °³³ä°ú ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÀÀ¿ëÇÏ¿© Æ÷Æ®
½ºÄµ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸¾Ò½À´Ï´Ù. ¿¹Á¦ ÇÁ·Î±×·¥Ã³·³ ¸ÖƼ ¾²·¹µåÀÇ ÀåÁ¡À» Àß È°¿ëÇÏ¿© ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀ» ÇÑ´Ù¸é ÇÁ·Î¼¼½º¸¸À¸·Î ½ÇÇàÇÏ´Â ÇÁ·Î±×·¥º¸´Ù ÈÎ
¾À ´õ ÁÁÀº
¼º´ÉÀ» ¹ßÈÖÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥À» ±â´ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¤¹üÀ§ÇÑ
IP ´ë¿ªÀ» ScanÇÒ ¶§ ¾²·¹µå¸¦ »ç¿ëÇÏÁö
¾Ê´Â´Ù¸é ±²ÀåÈ÷ ¿À·£ ½Ã°£ÀÌ °É¸± °ÍÀÔ´Ï´Ù.
¸ÖƼ ¾²·¹µå¸¦ »ç¿ëÇÒ ¶§´Â Ç×»ó °øÀ¯ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â °Í¿¡ ÁÖÀÇÇØ¾ß Çϰí, µ¿±â
È
¹®Á¦¸¦ Àß °í·ÁÇØ¼ ÇÁ·Î±×·¡¹ÖÀ» ÇØ¾ß ¾ÈÀüÇÏ°Ô ÀÛµ¿µÉ ¼ö ÀÖ½À´Ï´Ù. º» ¹®¼¿¡¼´Â ¾²·¹µå¿¡ ´ëÇÑ ³»¿ëÀ» ¾ÆÁÖ ±âº»ÀûÀÎ ºÎºÐ¸¸ ´Ù·ç¾ú±â ¶§¹®¿¡ ¾²·¹µå¸¦
º¸´Ù ´É¼÷ÇÏ°Ô »ç¿ëÇϱâ À§Çؼ´Â µð¹ö±ë°ú ½Ç½Ã°£ ½ºÄÉÁÙ¸µ, °í±Þ µ¿±âÈ, °øÀ¯ ¸Þ¸ð¸®¿¡ ´ëÇØ ´õ¿í ±íÀº ÀÌÇØ°¡ ÇÊ¿äÇÕ´Ï´Ù.