************************************************************************ Á¦¸ñ: Ä¿³Î ÇØÅ·¿¡¼­ÀÇ ¹ßÀü(ÇÁ·¢ 58È£) ¹ø¿ª: vangelis(http://www.wowhacker.org) * Ȥ½Ã¶óµµ ¿À¿ªÀ̳ª ¿ÀŸ ÀÖÀ¸¸é ¸»¾¸ÇØÁÖ½Ã±æ ¹Ù¶ø´Ï´Ù. ½Ã°£Àû ¿©À¯ ¾øÀÌ ÇѰŶó .... ************************************************************************ ==Phrack Inc.== Volume 0x0b, Issue 0x3a, Phile #0x06 of 0x0e |=-------=[ Sub proc_root Quando Sumus (Ä¿³Î ÇØÅ·¿¡¼­ÀÇ ¹ßÀü) ]=------=| |=-----------------------------------------------------------------------=| |=-----------------=[ palmers ]=-----------------=| --[ ³»¿ë 1 - µµÀÔ 2 - VFS ¹× Proc Primer 2.1 - VFS ±×¸®°í ¿Ö ProcÀΰ¡? 2.2 - proc_fs.h 2.3 - proc_root 3 - ¾îµð·Î °¥ °ÍÀΰ¡? 3.1 - º¸¾ÈÇϱâ? 3.2 - ¼­ºñ½º °ÅºÎ 3.3 - ¿¬°á ¼û±â±â 3.4 - ±ÇÇÑ »ó½Â 3.5 - ÇÁ·Î¼¼½º ¼û±â±â 3.6 - ´Ù¸¥ ¾îÇø®ÄÉÀ̼ǵé 4 - °á·Ð 5 - Âü°í¹®Çå »öÀÎ A: prrf.c --[ 1 - ¼Ò°³ "19¼¼±â°¡ ³¶¸¸ÁÖÀǸ¦ ½È¾îÇÏ´Â °ÍÀº °Å¿ï·Î ±× ÀÚ½ÅÀÇ ¾ó±¼À» ¹Ù¶óº» CalibanÀÇ ºÐ³ëÀÌ´Ù. 19¼¼±â°¡ ¸®¾ó¸®ÁòÀ» ½È¾îÇÏ´Â °ÍÀº °Å¿ï·Î ±× ÀÚ½ÅÀÇ ¾ó±¼À» ¹Ù¶óº¸Áö ¾Ê´Â CalibanÀÇ ºÐ³ëÀÌ´Ù. - Oscar Wilde, "The picture of Dorian Gray"ÀÇ ¼­¹® ¿©±â¼­ ³ªÀÇ °ü½ÉÀº ¹®ÇÐÀÌ ¾Æ´Ï¶ó ÇØÅ·À̱⠶§¹®¿¡ ´Ù½Ã ¾ð±ÞÇØº¸ÀÚ. ¿ì¸®ÀÇ ³¶¸¸ÁÖÀÇ´Â º¸¾ÈÀ̸ç, ¸®¾ó¸®ÁòÀº ±×°ÍÀÇ ±×¸²ÀÚÀÌ´Ù. ÀÌ ±ÛÀº ÇØÄ¿ Caliban¿¡ ´ëÇÑ °ÍÀÌ´Ù. ¿ì¸®ÀÇ °Å¿ïÀº ¸®´ª½º Ä¿³ÎÀÌ µÉ °ÍÀÌ´Ù. Àüü Ä¿³ÎÀº ¾Æ´Ï´Ù. ƯÈ÷ proc ÆÄÀÏ ½Ã½ºÅÛÀ» ´õ¿í ±×·¸´Ù. ±×°ÍÀº Èï¹Ì·Î¿î ±â´ÉµéÀ» Á¦°øÇϸç, userland¿¡¼­´Â ¸¹ÀÌ »ç¿ëµÈ´Ù. ³ª´Â ¸®´ª½º Ä¿³Î ¸ðµâ(LKM)¿¡¼­ »ç¿ëÇÒ ¸ñÀûÀ¸·Î ´ÜÁö ÀÌ Å×Å©´ÐÀ» ±â¼úÇÒ °ÍÀÌ´Ù. ÀÌ Å×Å©´ÐÀ» Æ÷ÆÃÇÏ´Â °ÍÀº µ¶Àڵ鿡°Ô ´Þ·ÁÀÖ´Ù. ºñ·Ï ÀÌ Å×Å©´ÐÀÌ Æ÷ÆÃÀÌ °¡´ÉÇÏÁö¸¸ ±×°ÍµéÀÇ ¿ë¹ýÀº ´Ù¸¥ unices¿¡´Â ¾ÆÁÖ ÇʼöÀûÀÏ °ÍÀÌ´Ù. ¸®´ª½º¿¡¼­ extends·Î °³¹ßµÈ proc ÆÄÀÏ ½Ã½ºÅÛÀº ´Ù¸¥ À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â ±×·¸°Ô È®ÀåµÇÁö ¾Ê¾Ò´Ù. ÀϹÝÀûÀ¸·Î ±×°ÍÀº ÇÁ·Î¼¼½º¸¶´Ù ÇϳªÀÇ µð·ºÅ丮¸¦ ¸ñ·ÏÀ¸·Î ¿­°ÅÇÑ´Ù. ¸®´ª½º¿¡¼­ ±×°ÍÀº ¸¹Àº Á¤º¸¸¦ ¼öÁýÇϱâ À§ÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¸¹Àº ÇÁ·Î±×·¥µéÀº ±×°Í¿¡ ÀÇÁ¸ÇÑ´Ù. ´õ ¸¹Àº Á¤º¸´Â [7]°ú [8]¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. UNIX¿Í HP-UX 10.xÀÇ ±¸ ¹öÀüÀº proc ÆÄÀϽýºÅÛÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù. ps(1) ¸í·É¿¡ ÀÇÇØ ¼öÁýµÈ °Í°ú °°Àº ÇÁ·Î¼¼½º µ¥ÀÌÅÍ´Â Á÷Á¢ÀûÀ¸·Î Ä¿³Î ¸Þ¸ð¸®¸¦ ÀÐÀ½À¸·Î¼­ ȹµæµÈ´Ù. À̰ÍÀº ½´ÆÛÀ¯ÀúÀÇ ÆÛ¹Ì¼ÇÀ» ¿ä±¸Çϸç, proc ÆÄÀÏ ½Ã½ºÅÛ ±¸Á¶º¸´Ù ÈξÀ ´ú Æ÷ÆÃÀÌ °¡´ÉÇÏ´Ù. --[ 2 - VFS ±×¸®°í Proc Primer ¸ÕÀú ³ª´Â ³ªÁß¿¡ °è¼Ó ¼³¸íµÉ Å×Å©´ÐÀ» ÀÌÇØÇϱâ À§ÇØ ÇÊ¿äÇÑ ±âº»ÀûÀÎ ³»¿ëÀ» ¾ð±ÞÇϰڴÙ. ±×·± ´ÙÀ½ proc ÆÄÀÏ ½Ã½ºÅÛ µðÀÚÀο¡ ´ëÇØ »ìÆìº¸µµ·Ï Çϰí, ¸¶Áö¸·À¸·Î ÁöºØ ²À´ë±â(roof top)·Î ¶Ù¾îµé°Ú´Ù. --[ 2.1 - VFS ±×¸®°í ¿Ö ProcÀΰ¡? Ä¿³ÎÀº °¡»ó ÆÄÀϽýºÅÛ ¶Ç´Â VFS¶ó°í ºÒ¸®´Â ÆÄÀϽýºÅÛ ÃßÃâ ÃþÀ» °¡Áö°í ÀÖ´Ù. ±×°ÍÀº userland·ÎºÎÅÍ ¾î¶² ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ ÅëÇÕµÈ °üÁ¡À» Á¦°øÇϱâ À§ÇØ »ç¿ëµÈ´Ù.(ÀÚ¼¼ÇÑ °ÍÀº [1]À» Âü°íÇ϶ó) ÀÌ ¹æ¹ý·Ð¿¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸´Â [2]¿¡¼­ ãÀ» ¼ö ÀÖ´Ù.) ¿ì¸®´Â VFS °üÁ¡¿¡¼­ procÀ» º¸Áö´Â ¾ÊÀ» °ÍÀÌ´Ù. ¿ì¸®´Â ºñÅëÇÕÀûÀÎ ÆÄÀϽýºÅÛÀ» º¼ °ÍÀ̸ç, ±×°ÍÀº ±¸Çö Â÷¿øÀÇ proc ÆÄÀϽýºÅÛ¿¡ ÀÖ´Ù. À̰ÍÀº ´Ü¼øÇÑ ÀÌÀ¯¸¦ °¡Áö°í ÀÖ´Ù. ¿ì¸®´Â proc¿¡ º¯È­¸¦ Àû¿ëÇϱ⸦ ¿øÇϰí, ±×°ÍÀº ¿©ÀüÈ÷ ´Ù¸¥ ¾î¶² ÆÄÀϽýºÅÛó·³ º¸¿©¾ß ÇÑ´Ù. ³»°¡ ¿Ö procÀÌ ÀÌ ±Û¿¡ ÃÊÁ¡ÀÌ µÇ°í ÀÖ´ÂÁö ¾ð±ÞÇߴ°¡? ±×°ÍÀº Èï¹Ì·Î¿î µÎ°¡Áö ¼Ó¼ºÀÌ ÀÖ´Ù. 1. ±×°ÍÀº ÆÄÀϽýºÅÛÀÌ´Ù. 2. ±×°ÍÀº Ä¿³Î ¸Þ¸ð¸®¿¡¼­ ¿ÏÀüÈ÷ °ÅÁÖÇϰí ÀÖ´Ù. ±×°ÍÀÌ ÆÄÀÏ ½Ã½ºÅÛÀ̱⠶§¹®¿¡ userland·ÎºÎÅÍÀÇ ¸ðµç Á¢±ÙÀº Ä¿³Î¿¡ ÀÇÇØ Á¦°øµÇ´Â VFS ÃþÀÇ ±â´É¼º, Áï, Àаí, ¾²°í, ¿­±â, ¹× ºñ½ÁÇÑ ½Ã½ºÅÛ È£Ãâ¿¡ Á¦ÇѵǾî ÀÖ´Ù.(µ¡ºÙ¿© ´Ù¸¥ Á¢±Ù ¹æ¹ýµµ..[3]À» º¸¾Æ¶ó) ³ª´Â ¡°½Ã½ºÅÛ È£ÃâÀ» º¯°æÇÏÁö ¾Ê°í¼­ Ä¿³Î¿¡ ¾î¶»°Ô ¹éµµ¾î°¡ ½É¾îÁö´Â°¡¡±¶ó´Â Áú¹®¿¡ ´ëÇØ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇÒ °ÍÀÌ´Ù. --[ 2.2 - proc_fs.h ÀÌ ÇϺÎÀåÀº proc_fs.h¶ó´Â ÆÄÀÏ¿¡ ´ëÇØ ´Ù·ê °ÍÀÌ´Ù. ÀÌ ÆÄÀÏÀº º¸Åë ~/include/linux/¿¡ ÀÖÀ¸¸ç, ~Àº Ä¿³Î ¼Ò½º Æ®¸®ÀÇ ·çÆ®ÀÌ´Ù. ¿©±â¼­´Â 2.2 ½Ã¸®Áî¿¡ ´ëÇÑ °ÍÀÌ´Ù. /* * This is not completely implemented yet. The idea is to * create an in-memory tree (like the actual /proc filesystem * tree) of these proc_dir_entries, so that we can dynamically * add new files to /proc. * * The "next" pointer creates a linked list of one /proc directory, * while parent/subdir create the directory structure (every * /proc file has a parent, but "subdir" is NULL for all * non-directory entries). * * "get_info" is called at "read", while "fill_inode" is used to * fill in file type/protection/owner information specific to the * particular /proc file. */ struct proc_dir_entry { unsigned short low_ino; unsigned short namelen; const char *name; mode_t mode; nlink_t nlink; uid_t uid; gid_t gid; unsigned long size; struct inode_operations * ops; int (*get_info)(char *, char **, off_t, int, int); void (*fill_inode)(struct inode *, int); struct proc_dir_entry *next, *parent, *subdir; void *data; int (*read_proc)(char *page, char **start, off_t off, int count, int *eof, void *data); int (*write_proc)(struct file *file, const char *buffer, unsigned long count, void *data); int (*readlink_proc)(struct proc_dir_entry *de, char *page); unsigned int count; /* use count */ int deleted; /* delete flag */ }; ±â¼úµÈ "in-memory tree"´Â VFS¿¡ ÀÇÇØ¼­ ÅëÇÕµÉ °ÍÀÌ´Ù. ÀÌ ±¸Á¶´Â Ä¿³Î 2.4¿¡¼­´Â ¾à°£ ´Ù¸£´Ù. /* * This is not completely implemented yet. The idea is to * create an in-memory tree (like the actual /proc filesystem * tree) of these proc_dir_entries, so that we can dynamically * add new files to /proc. * * The "next" pointer creates a linked list of one /proc directory, * while parent/subdir create the directory structure (every * /proc file has a parent, but "subdir" is NULL for all * non-directory entries). * * "get_info" is called at "read", while "owner" is used to protect module * from unloading while proc_dir_entry is in use */ typedef int (read_proc_t)(char *page, char **start, off_t off, int count, int *eof, void *data); typedef int (write_proc_t)(struct file *file, const char *buffer, unsigned long count, void *data); typedef int (get_info_t)(char *, char **, off_t, int); struct proc_dir_entry { unsigned short low_ino; unsigned short namelen; const char *name; mode_t mode; nlink_t nlink; uid_t uid; gid_t gid; unsigned long size; struct inode_operations * proc_iops; struct file_operations * proc_fops; get_info_t *get_info; struct module *owner; struct proc_dir_entry *next, *parent, *subdir; void *data; read_proc_t *read_proc; write_proc_t *write_proc; atomic_t count; /* use count */ int deleted; /* delete flag */ kdev_t rdev; }; ¸î³â°£ÀÇ °³¹ßÀÌ ³¡ÀÌ ³ªÁö ¾Ê¾Ò´Ù. Á» º¯ÇßÀ¸¸ç, get_info ÇÔ¼ö ÇÁ·ÎÅäŸÀÔÀº µ¶¸³º¯¼ö¸¦ ÀÒ¾î¹ö·È´Ù. À̰ÍÀ» ÇØ°áÇÏ´Â °ÍÀÌ Æ÷ÆÃ°¡´ÉÇÑ Äڵ带 ¾à°£ ³ÊÀýÇÏ°Ô ¸¸µé¾ú´Ù. ÇϳªÀÇ Ç׸ñ readlink_procÀÌ Á¦°ÅµÇÁö¸¸ ¼¼ °³ÀÇ »õ·Î¿î Ç׸ñÀÌ ÀÖ´Ù´Â °ÍÀ» ÁÖ¸ñÇØ¶ó. ¶ÇÇÑ ÆÄÀÏ ¿ÀÆÛ·¹ÀÌ¼Ç ±¸Á¶Ã¼´Â inode ¿ÀÆÛ·¹À̼ÇÀ¸·ÎºÎÅÍ proc_dir_entry struct ¾ÈÀ¸·Î À̵¿Çß´Ù´Â °Íµµ ÁÖ¸ñÇØ¶ó. À̰Ϳ¡ °üÇØ¼­´Â ¼½¼Ç 3À» º¸ÀÚ. --[ 2.3 - proc_root ¸®´ª½º Ä¿³ÎÀº proc ÆÄÀÏ ½Ã½ºÅÛÀÇ ·çÆ® inode, Áï proc_root¸¦ exportÇÑ´Ù. ±×·¡¼­ ¸¶¿îÆ®Æ÷ÀÎÆ®(º¸Åë /proc)°¡ °¡¸®Å°´Â °ÍÀº proc ÆÄÀÏ ½Ã½ºÅÛÀÇ ·çÆ® inodeÀÌ´Ù. ±×°÷¿¡¼­ ½ÃÀÛÇØ ±× ÆÄÀÏÀÇ ÇϺο¡ ÀÖ´Â ¾î¶² ÆÄÀÏ¿¡µµ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸, ÇѰ¡Áö ¿¹¿Ü°¡ ÀÖ´Ù. ÇÁ·Î¼¼½ºµéÀÇ µð·ºÅ丮µéÀº proc_root·ÎºÎÅÍ °áÄÚ µµ´ÞµÉ ¼ö ¾ø´Ù. ±×°ÍµéÀº µ¿ÀûÀ¸·Î Ãß°¡µÇ¸ç, ¸¸¾à readdir(inode operation)ÀÌ È£ÃâµÇ¸é VFS ÃþÀ¸·Î °Ç³×Áø´Ù. proc_root´Â "struct proc_dir_entry" ŸÀÔÀ̶ó´Â °ÍÀÌ ºÐ¸íÇØÁ®¾ß ÇÑ´Ù. --[ 3 - ¾îµð·Î °¥±î? ÀÌ ÀåÀº ½Ã½ºÅÛÈ£Ãâ ´ëü·Î ÀÎÇØ º¸Åë ȹµæµÉ ¼ö ÀÖ´Â °Íº¸´Ù ÈξÀ ¸¹Àº ´É·ÂÀ» ½ÀµæÇÏ´Â Å×Å©´ÐÀ» ¼Ò°³ÇÒ °ÍÀÌ´Ù. ´ÙÀ½ ÇÔ¼öµé°ú ¸ÅÅ©·ÎµéÀº ÀÌ ÇϺΠÀå¿¡¼­ Á¦°øµÇ´Â Äڵ忡¼­ »ç¿ëµÉ °ÍÀÌ´Ù. (±¸Çö¿¡ ´ëÇØ¼­´Â »öÀÎ A¸¦ Âü°íÇ϶ó.) ¼½¼Ç 2.2¿¡¼­ »ìÆìº» °Íó·³ ¿ì¸®´Â µðÀÚÀο¡¼­ ¾à°£ÀÇ º¯È­¸¦ Á¶½ÉÇØ¾ß ÇÑ´Ù. #if defined (KERNEL_22) #define FILE_OPS ops->default_file_ops #define INODE_OPS ops #elif defined (KERNEL_24) #define FILE_OPS proc_fops #define INODE_OPS proc_iops #endif struct proc_dir_entry * traverse_proc (char *path, struct proc_dir_entry *start): ¼º°øÇÒ °æ¿ì path¿¡ ÀÇÇØ ÁöÁ¤µÈ proc ÆÄÀÏ¿¡ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ½ÇÆÐÇÒ °æ¿ì NULLÀÌ ¸®ÅϵȴÙ. ½ÃÀÛÀº NULLÀ̳ª ¶Ç´Â ÀÓÀÇ proc_dir_entryÀÏ ¼ö Àִµ¥, ±×°ÍÀº Ž»öÀÌ ½ÃÀ۵Ǵ ÁöÁ¡À» °¡¸®Å²´Ù. path´Â "~/"·Î ½ÃÀÛµÉ ¼ö ÀÖ´Ù. ¸¸¾à ±×·¸´Ù¸é Ž»öÀº proc_root¿¡¼­ ½ÃÀÛÇÑ´Ù. int delete_proc_file (char *path): ÀÌ ÇÔ¼ö´Â proc µð·ºÅ丮 ¸®½ºÆ®·ÎºÎÅÍ ¾î¶² ÆÄÀÏÀ» Á¦°ÅÇÒ °ÍÀÌ´Ù. ±×°ÍÀº proc_dir_entry°¡ Â÷ÁöÇϰí ÀÖ´Â ¸Þ¸ð¸®¸¦ ºñ¿ìÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ±×·¡¼­ ³ªÁß¿¡ °è¼ÓÇØ¼­ ±×°ÍÀ» ´Ù½Ã µµÀÔÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô ¸¸µç´Ù. --[ 3.1 - ¾ÈÀüÇÏ°Ô Çϱâ? ¸¶À½¿¡ ¶°¿À¸£´Â °¡Àå ½¬¿î ¼öÁ¤Àº proc_dir_entry¿¡ Àִ ù ¹øÂ° ¸î¸î ÇÊ´õµé¿¡ °ü·ÃµÈ °ÍÀÌ´Ù. Áï, uid, gid, ±×¸®°í ¸ðµå. ±×°ÍµéÀ» º¯°æÇÔÀ¸·Î½á ¿ì¸®´Â »ç¿ëÀÚµéÀÌ ¾î¶² Á¤º¸¿¡ Á¢±ÙÇÏ´Â ±ÇÇÑÀ» ÀçºÎ¿©Çϰųª Ãë¼ÒÇÒ ¼ö ÀÖ´Ù. /procÀ» ÅëÇØ Á¢±Ù°¡´ÉÇÑ Á¤º¸µé ÁßÀÇ ¸î°¡Áö´Â ´Ù¸¥ ¹æ¹ýÀ¸·Î ȹµæµÉ ¼ö ÀÖ´Ù. ÇѰ¡Áö ¹æ¹ý ±¸Çö: proc_dir_entry *a = NULL; a = traverse_proc ("~/ksyms", NULL); if (a) { /* reset permissions to 400 (r--------): */ a->mode -= (S_IROTH | S_IRGRP); } a = traverse_proc ("~/net", NULL); if (a) { /* reset permissions to 750 (rwxr-x---): */ a->mode = S_IRWXU | S_IRGRP | S_IXGRP; /* reset owner group to a special admin group id */ a->gid = 7350; } proc Á¢±ÙÀ» ¾ÈÀüÇÏ°Ô ÇÏ´Â ´Ù¸¥ °¡´É¼ºÀº 3.5¿¡ ³ª¿Í ÀÖ´Ù. --[ 3.2 - ¼­ºñ½º °ÅºÎ °¡´ÉÇÑ Âª°Ô ÇϰڴÙ. ¾ÇÀÇÀûÀÎ »ç¿ëÀÚ´Â ½Ã½ºÅÛÀÇ ÀϺθ¦ ¾µ¸ð¾ø°Ô Çϱâ À§ÇØ ÆÄÀÏ¿¡ º¯°æÀ» Àû¿ëÇÒ ¼ö ÀÖ´Ù. ¾Õ¿¡¼­ ¾ð±ÞÇÑ °Íó·³ ½±°Ô ³¡À峯 ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¸¸¾à ¾ÇÀÇÀûÀÎ »ç¿ëÀÚ°¡ °£´ÜÈ÷ ÆÄÀÏÀÇ ¸µÅ©¸¦ ÇØÁ¦ÇÑ´Ù¸é ±×°ÍÀº »ó½ÇµÈ´Ù. /* oops, we forget to save the pointer ... */ delete_proc_file ("~/apm"); delete_proc_file È£Ãâ¿¡¼­ ½ÇÁ¦·Î ÀϾ °Í: 0. »èÁ¦Çϱâ À§ÇØ(to_del) ÆÄÀÏÀÇ proc_dir_entry¸¦ ã´Â´Ù. 1. ÇØ´çµÇ´Â proc_dir_entry¸¦ ã´Â´Ù: proc->next->name == to_del->name 2. ´Ù½Ã ¸µÅ©: proc->next = to_del->next --[ 3.3 - ¿¬°á ¼û±â±â netstat À¯Æ¿¸®Æ¼´Â ¿¹¸¦ µé¾î TCP ¿¬°á°ú »óÅÂ, listening UDP ¼ÒÄÏ µîÀ» º¸¿©ÁÖ±â À§ÇØ proc ÆÄÀÏ ~/net/* ÆÄÀϵéÀ» »ç¿ëÇÑ´Ù. netstat¿¡ ´ëÇÑ ¿ÏÀüÇÑ Åä·ÐÀº [4]¸¦ Àо¾Æ¶ó. ¿ì¸®°¡ proc ÆÄÀÏ ½Ã½ºÅÛÀ» ÅëÁ¦Çϱ⠶§¹®¿¡ ¹«¾ùÀÌ ÀÐÈ÷°í ÀÐÈ÷Áö ¾Ê´ÂÁö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. proc_dir_entry struct´Â ÆÄÀÏ Àб⿡ È£ÃâµÇ´Â get_info¶ó´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. À̰ÍÀ» ¸®´ÙÀÌ·ºÆ®ÇÔÀ¸·Î½á ¿ì¸®´Â /proc¿¡ ÀÖ´Â ÆÄÀϵéÀÇ ³»¿ëÀ» ÅëÁ¦ÇÒ ¼ö ÀÖ´Ù. ´Ù¸¥ ¹öÀüÀÇ ÆÄÀÏ Æ÷¸Ë¿¡ À¯ÀÇÇØ¶ó. À§¿¡¼­ ¾ð±ÞµÈ ÆÄÀϵéÀº 2.2.x¿¡¼­ 2.4.x·Î Æ÷¸ËÀ» º¯°æÇß´Ù. °°Àº ÇÔ¼ö°¡ ¸®´ÙÀÌ·º¼ÇÀ» À§ÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù. À̰ÍÀÌ 2.5.x Ä¿³Î¿¡¼­ ¾î¶»°Ô °³¹ßµÇ´ÂÁö »ìÆìº¸ÀÚ. ¿¹(2.2.x Ä¿³Î¿ë, 2.4.x Ä¿³Î¿¡¼­ Â÷ÀÌÁ¡Àº ¼½¼Ç 2.2¸¦ º¸¾Æ¶ó.) /* we save the original get_info */ int (*saved_get_info)(char *, char **, off_t, int, int); proc_dir_entry *a = NULL; /* the new get_info ... */ int new_get_info (char *a, char **b, off_t c, int d, int e) { int x = 0; x = saved_get_info (a, b, c, d, e); /* do something here ... */ return x; } a = traverse_proc ("~/net/tcp", NULL); if (a) { /* * we just set the get_info pointer to point to our new * function. to undo this changes simply restore the pointer. */ saved_get_info = a->get_info; a->get_info = &new_get_info; } »öÀÎ A´Â ¿¹·Î ±¸ÇöÇÑ °ÍÀ» Á¦°øÇÑ´Ù. --[ 3.4 - ±ÇÇÑ »ó½Â Á¾Á¾ ½Ã½ºÅÛ È£ÃâÀº ¾î¶² Á¶°Ç ÇÏ¿¡¼­ »ç¿ëÀÚ¿¡°Ô Ưº°ÇÑ ±ÇÇÑÀ» ¾î¶² ÁÖ±â À§ÇØ È°¿ëµÈ´Ù. ¿ì¸®´Â À̰ÍÀ» À§ÇØ ½Ã½ºÅÛ È£ÃâÀ» ¸®´ÙÀÌ·ºÆ®ÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ¾î¶² ÆÄÀÏÀÇ ÆÄÀÏ Àбâ ÀÛµ¿À» ¸®´ÙÀÌ·ºÆ®ÇÏ´Â °ÍÀ¸·Îµµ ÃæºÐÇÏ´Ù. ¿Ö³ÄÇÏ¸é ±×°ÍÀº »ç¿ëÀÚ°¡ µ¥ÀÌÅ͸¦ Ä¿³Î¿¡ º¸³»µµ·Ï Çã¿ëÇϱ⠶§¹®À̸é, ¸¸¾à ¿ì¸®°¡ ¿Ã¹Ù¸¥ ÆÐÅÏÀ̳ª ¶Ç´Â ¿Ã¹Ù¸¥ ÆÄÀÏÀ» ¼±ÅÃÇÑ´Ù¸é ±×°ÍÀº ¾öû ºñ¹Ð½º·¯¿ï °ÍÀÌ´Ù.(¸¸¾à ±×°ÍÀÌ /proc/sys/net/ipv4/ip_forward¿¡ '1'À» ¾²·Á°í ÇÑ´Ù¸é 0À¸·Î task id¸¦ »ó½Â½ÃŰ´Â °ÍÀº È®½ÇÈ÷ ³ª»Û »ý°¢ÀÌ´Ù.) ¸î¸î Äڵ尡 À̰ÍÀ» ¼³¸íÇÒ °ÍÀÌ´Ù. a = traverse_proc ("~/ide/drivers", NULL); if (a) { /* * the write function is called if the file is written to. */ a->FILE_OPS->write = &new_write; } ¿ì¸®°¡ µ¤¾î¾´ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â °ÍÀÌ ÁÁÀº »ý°¢ÀÌ´Ù. ¸¸¾à ¿ì¸®°¡ ±× ¸ðµâÀ» Á¦°ÅÇÑ´Ù¸é ÇÔ¼ö¸¦ Æ÷ÇÔÇÑ ¸Þ¸ð¸®´Â ¿©À¯°¡ »ý±æ ¼ö µµ ÀÖ´Ù. ¸¸¾à °á°úÀûÀ¸·Î NULL Æ÷ÀÎÅ͸¦ È£ÃâÇÑ´Ù¸é ½Ã½ºÅÛÀ» ÆÄ±«ÇÒ ¼öµµ ÀÖ´Ù. È£±â½É ¸¹Àº µ¶ÀÚ¶ó¸é »öÀÎ A¸¦ Àо±â¸¦ ±ÇÀåÇÑ´Ù. --[ 3.5 - ÇÁ·Î¼¼½º ¼û±â±â ¸¸¾à µð·ºÅ丮°¡ ÀÐÈ÷±â µÇ¸é ¾î¶² ÀÏÀÌ »ý±â´Â°¡? ±×°ÍÀÇ inode¸¦ ã¾Æ¾ß Çϰí, ±×·± ´ÙÀ½ readdir¸¦ ÀÌ¿ëÇØ ±×°ÍÀÇ Ç׸ñÀ» ÀоîºÁ¾ß ÇÑ´Ù. VFS´Â À̰Ϳ¡ ÅëÇÕµÈ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇϱ⠶§¹®¿¡ ¿ì¸®´Â ½Å°æ¾²Áö ¾Ê°í ¹®Á¦°¡ µÇ´Â ºÎ¸ð inodeÀÇ readdir·Î Æ÷ÀÎÅ͸¦ Àç¼³Á¤ÇÑ´Ù. ÇÁ·Î¼¼½º µð·ºÅ丮µéÀÌ Á÷Á¢ÀûÀ¸·Î proc_root ÇÏ¿¡ Àֱ⠶§¹®¿¡ ºÎ¸ð inode¸¦ ãÀ» ÇÊ¿ä´Â ¾ø´Ù. »ç¿ëÀÚÀÇ ¸Þ¸ð¸®¿¡ Ç׸ñµéÀ» ¾²Áö ¾Ê´Â °Í¿¡ ÀÇÇØ¼­°¡ ¾Æ´Ï¶ó ¿ì¸®°¡ Ç׸ñµéÀ» ºÐ·ùÇÔÀ¸·Î½á »ç¿ëÀڷκÎÅÍ Ç׸ñµéÀ» ¼û±âÁö´Â ¾Ê´Â´Ù´Â °ÍÀ» ÁÖ¸ñÇØ¶ó. /* a global pointer to the original filldir function */ filldir_t real_filldir; static int new_filldir_root (void * __buf, const char * name, int namlen, off_t offset, ino_t ino) { /* * if the dir entry, that should be added has a stupid name * indicate a successful addition and do nothing. */ if (isHidden (name)) return 0; return real_filldir (__buf, name, namlen, offset, ino); } /* readdir, business as usual. */ int new_readdir_root (struct file *a, void *b, filldir_t c) { /* * Note: there is no need to set this pointer every * time new_readdir_root is called. But we have to set * it once, when we replace the readdir function. If we * know where filldir lies at that time this should be * changed. (yes, filldir is static). */ real_filldir = c; return old_readdir_root (a, b, new_filldir_root); } /* replace the readdir file operation. */ proc_root.FILE_OPS->readdir = new_readdir_root; ¸¸¾à ¸¶Áö¸·À¸·Î Ãß°¡µÇ¾î¾ßÇÒ ÇÁ·Î¼¼½º°¡ ¼û°ÜÁ® ÀÖ´Ù¸é filldir°¡ ¸µÅ©¿¡ ´ëÇØ ½Å°æÀ» ¾²Áö ¾Ê±â ¶§¹®¿¡ Ç׸ñµéÀÇ ¸ñ·ÏÀº ÀûÀýÇÏ°Ô ¸µÅ©°¡ µÇ¾î ÀÖÁö ¾Ê´Ù. ÇÏÁö¸¸, À̰ÍÀº ÀϾÁö´Â ¾ÊÀ» °Í °°´Ù. »ç¿ëÀÚ´Â ÀÌ »óŸ¦ ÇÇÇÒ Çʿ䰡 ÀÖ´Â ¸ðµç ÆÄ¿ö¸¦ °¡Áö°í ÀÖ´Ù. ºÎ¸ð inodeÀÇ lookup inode ÀÛ¿ëÀ» ´ëüÇÔÀ¸·Î½á /proc ³»¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Â ÆÄÀϵéÀ» ¸¸µå´Â °ÍÀÌ °¡´ÉÇÏ´Ù. struct dentry *new_lookup_root (struct inode *a, struct dentry *b) { /* * will result in: * "/bin/ls: /proc/: No such file or directory" */ if (isHidden (b->d_iname)) return NULL; return old_lookup_root (a, b); } /* ... enable the feature ... */ proc_root.INODE_OPS->lookup = &new_lookup_root; À̰ÍÀº ÀûÀýÇÑ Á¢±Ù ±ÔÄ¢À» È®¸³Çϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. --[ 3.6 - ´Ù¸¥ ¾îÇø®ÄÉÀÌ¼Ç ÀÚ, ¾î¶² ÆÄÀϵéÀÌ º¯°æµÇ±â À§ÇØ ±â´Ù¸®°í ÀÖ´ÂÁö »ìÆìº¸ÀÚ. /proc/net µð·ºÅ丮¿¡ ip_fwnames(chain À̸§À» Á¤ÀÇ)¿Í ip_fwchains(±ÔÄ¢µé)°¡ ÀÖ´Ù. À̰͵éÀº ÇÊÅ͸µ ±ÔÄ¢À» ¸ñ·ÏÀ¸·Î ÀÛ¼ºÇϵµ·Ï ¿ä±¸¹Þ´Â´Ù¸é ipchains(iptables°¡ ¾Æ´Ô)¿¡ ÀÇÇØ ÀÐÈù´Ù. À§¿¡¼­ ¾ð±ÞµÈ °Íó·³ Á¸ÀçÇÏ´Â ¸ðµç tcp ¼ÒÄÏÀ» listeningÇÏ´Â tcp¶ó´Â À̸§À» °¡Áø ÆÄÀÏÀÌ ÀÖ´Ù. ±×¿Í °°Àº ÆÄÀÏÀº udp¿¡µµ ¿ª½Ã Á¸ÀçÇÑ´Ù. ÆÄÀÏ raw´Â raw ¼ÒÄÏÀÇ ¸ñ·ÏÀ» ÀÛ¼ºÇÑ´Ù. sockstat´Â ¼ÒÄÏ »ç¿ë¿¡ ´ëÇÑ Åë°è¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. Á¶½É½º·´°Ô ¾²¿©Áø ¹éµµ¾î´Â tcp, udp µîÀÇ ÆÄÀϰú ÀÌ ¹éµµ¾î »çÀ̸¦ syncÇØ¾ß ÇÑ´Ù. arp À¯Æ¿¸®Æ¼´Â Á¤º¸¸¦ ¼öÁýÇϱâ À§ÇØ /proc/net/arp¸¦ »ç¿ëÇÑ´Ù. route´Â /proc/net/route ÆÄÀÏÀ» »ç¿ëÇÑ´Ù. ±×°ÍµéÀÇ ¸ÇÆäÀÌÁö¸¦ Àо°í, "FILES"¿Í "SEE ALSO"¶ó´Â À̸§À» °¡Áø ¼½¼ÇÀ» ã¾Æº¸¾Æ¶ó. ÇÏÁö¸¸, ±× ÆÄÀϵéÀ» Á¡°ËÇÏ´Â °ÍÀº ´ÜÁö ÀÛ¾÷ÀÇ ºÎºÐ¿¡ Áö³ªÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î, ifconfig´Â Á¤º¸¸¦ ¼öÁýÇϱâ À§ÇØ proc ÆÄÀÏ(dev)¿¡ Ãß°¡ÇØ ioctl ÆÄÀÏÀ» »ç¿ëÇÑ´Ù. ¿©·¯ºÐµéµµ ¾Ë°ÚÁö¸¸ ÀÌ Å×Å©´Ð¿¡´Â ¼ö¸¹Àº ¾îÇø®ÄÉÀ̼ǵéÀÌ ÀÖ´Ù. ±×°ÍµéÀÇ Ãâ·ÂÀ» ÇÊÅ͸µÇϰųª »õ·Î¿î ¾ÇÀÇÀûÀÎ Ç׸ñÀ» Ãß°¡Çϱâ À§ÇØ »õ·Î¿î get_info ÇÔ¼öµéÀ» ¾²´Â °ÍÀº ¿©·¯ºÐµé¿¡°Ô ´Þ·ÁÀÖ´Ù.(Á¸ÀçÇÏÁö ¾ÊÀº ¹®Á¦µéÀ» µð¹ö±ëÇϱâ¶õ ¹«Áö ¾î·Æ´Ù.) --[ 4 - °á·Ð ¿ì¸®°¡ ¼¾¼Ç 3.2-3.6¿¡¼­ º¸¾ÒµíÀÌ ¸®´ª½º Ä¿³ÎÀÇ º¸¾ÈÀ» ¾àÇÏ°Ô ¸¸µå´Â ¿©·¯ °¡´É¼ºµéÀÌ ÀÖ´Ù. ±âÁ¸ÀÇ Ä¿³Î º¸È£ ¿ªÇÐÀº([5], [6]Àº ±×°ÍµéÀ» ¿¹¹æÇÏÁö ¸øÇÒ °ÍÀÌ´Ù.) ½Ã½ºÅÛ È£Ãâ ±â¹Ý ¹× ¹éµµ¾î¸µ °°Àº Àß ¾Ë·ÁÁø °Íµé(À̰Ϳ¡ ´ëÇÑ È®½ÇÇÑ ÇØ°áÃ¥ÀÌ ÀÖ´Ù)¸¸ Á¡°ËÇÑ´Ù. LKM Áö¿øÀ» ºñȰ¼ºÈ­ÇÏ´Â °ÍÀº ¿©±â¼­ Æ÷ÇÔµÈ Æ¯Á¤ÇÑ ±¸Çö¸¸À» ¿¹¹æÇÒ °ÍÀÌ´Ù.(¿Ö³ÄÇÏ¸é ±×°ÍÀº LKMÀ̱⠶§¹®ÀÌ´Ù) /dev[k]mem¿¡ Á¢±ÙÇÔÀ¸·Î½á proc ±¸Á¶¸¦ º¯°æÇÏ´Â °ÍÀº inodeÀÇ ´ëºÎºÐÀÇ µ¥ÀÌÅͰ¡ Á¤ÀûÀ̱⠶§¹®¿¡ ½±´Ù. ±×·¡¼­ ±×°ÍµéÀº ´Ü¼øÇÑ ÆÐÅÏ ¸ÅĪ¿¡ ÀÇÇØ¼­ ¹ß°ßµÉ ¼ö ÀÖ´Ù.(´ÜÁö ÇÔ¼ö Æ÷ÀÎÅÍ¿Í next/parent/subdir Æ÷ÀÎÅ͸¸ÀÌ ´Ù¸¦ °ÍÀÌ´Ù.) ¾î¶² µð·ºÅ丮³ª ÆÄÀÏÀ» ¼û±â´Â Áß¿äÇÑ ¸ñÇ¥´Â Åë°úµÇÁö ¾Ê¾Ò´Ù. À̰ÍÀº proc °ÔÀÓ¿¡ ÀÇÇØ µµ´ÞµÉ ¼ö ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÏÁö´Â ¾Ê´Â´Ù. °¡´É¼ºÀº ÇÊ¿äÇÑ ¹ÙÀ̳ʸ®¸¦ Ä¿³Î À̹ÌÁö proc ±¸Á¶ ¾ÈÀ¸·Î ÇϵåÄÚµùÇϰųª ¶Ç´Â SDRAMÀ» »ç¿ëÇÏ´Â ½Ã½ºÅÛ¿¡ »ç¿ëµÇÁö ¾Ê´Â ¸Þ¸ð¸® °ø°£À» Â÷ÁöÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ¶Ç ´Ù¸¥ °¡´É¼ºÀº VFS ÃþÀ» °ø°ÝÇÏ´Â °ÍÀÏÁöµµ ¸ð¸¥´Ù. ¹°·Ð À̰ÍÀº ´Ù¸¥ ¹®¼­ÀÇ À̾߱âÀÌ´Ù. (°³ÀÎÀûÀÎ ´çºÎÀÇ ¸» »ý·«) ¿©±âÀÇ ÄÚµå´Â 2.2.x¿Í 2.4.x Ä¿³Î¿¡¼­ ÄÄÆÄÀÏµÇ°í ½ÇÇàµÇ¾ú´Ù. --[ 5 - Âü°í¹®Çå [1] "Overview of the Virtual File System", Richard Gooch http://www.atnf.csiro.au/~rgooch/linux/docs/vfs.txt [2] "Operating Systems, Design and Implementation", by Andrew S. Tanenbaum and Albert S. Woodhull ISBN 0-13-630195-9 [3] RUNTIME KERNEL KMEM PATCHING, Silvio Cesare http://www.big.net.au/~silvio/runtime-kernel-kmem-patching.txt [4] netstat see netstat(1) for further information. [5] StMichael, by Tim Lawless http://sourceforge.net/projects/stjude [6] KSTAT, by FuSyS http://s0ftpj.org/tools/kstat.tgz [7] proc pseudo-filesystem man page see proc(5) [8] "T H E /proc F I L E S Y S T E M", Terrehon Bowden , Bodo Bauer and Jorge Nerin ~/Documentation/filesystems/proc.txt (only in recent kernel source trees!) http://skaro.nightcrawler.com/~bb/Docs/Proc * ¸¶Áö¸· ¼Ò½º ÄÚµå ºÎºÐÀº ¾Ç¿ëÀÇ ¼ÒÁö°¡ Àֱ⠶§¹®¿¡ ÀÓÀÇ·Î »èÁ¦ÇÏ¿´½À´Ï´Ù. ÀÌ ºÎºÐ¿¡ ´ëÇÑ ÀÚ·á´Â ¿ø¹® µîÀ» Á÷Á¢ °Ë»öÇÏ¿© Âü°íÇÏ½Ã±æ ¹Ù¶ó°Ú½À´Ï´Ù.