ºìÁªLinuxÃÅ»§
Linux°ïÖú

Linux»·¾³Ïµĸ߼¶Òþ²Ø¼¼Êõ

·¢²¼Ê±¼ä:2006-11-18 01:23:28À´Ô´:ºìÁª×÷Õß:fitness
ÕªÒª£º±¾ÎÄÉîÈë·ÖÎöÁËLinux»·¾³ÏÂÎļþ¡¢½ø³Ì¼°Ä£¿éµÄ¸ß¼¶Òþ²Ø¼¼Êõ£¬ÆäÖаüÀ¨£ºLinux¿ÉÐ¶ÔØÄ£¿é±à³Ì¼¼Êõ¡¢ÐÞ¸ÄÄÚ´æÓ³ÏóÖ±½Ó¶Ôϵͳµ÷ÓýøÐÐÐ޸ļ¼Êõ£¬Í¨¹ýÐéÄâÎļþϵͳprocÒþ²ØÌض¨½ø³ÌµÄ¼¼Êõ¡£

Òþ²Ø¼¼ÊõÔÚ¼ÆËã»úϵͳ°²È«ÖÐÓ¦ÓÃÊ®·Ö¹ã·º£¬ÓÈÆäÊÇÔÚÍøÂç¹¥»÷ÖУ¬µ±¹¥»÷Õ߳ɹ¦ÇÖÈëÒ»¸öϵͳºó£¬ÓÐЧÒþ²Ø¹¥»÷ÕßµÄÎļþ¡¢½ø³Ì¼°Æä¼ÓÔØµÄÄ£¿é±äµÃÓÈÎªÖØÒª¡£±¾ÎĽ«ÌÖÂÛLinuxϵͳÖÐÎļþ¡¢½ø³Ì¼°Ä£¿éµÄ¸ß¼¶Òþ²Ø¼¼Êõ£¬ÕâЩ¼¼ÊõÓеÄÒѾ­±»¹ã·ºÓ¦Óõ½¸÷ÖÖºóÃÅ»ò°²È«¼ì²â³ÌÐòÖ®ÖУ¬¶øÓÐһЩÔò¸Õ¸ÕÆð²½£¬ÈÔÈ»´¦ÔÚÌÖÂ۽׶Σ¬Ó¦ÓúÜÉÙ¡£

--------------------------------------------------------------------------------
1.Òþ²Ø¼¼Êõ

1.1.LinuxϵÄÖжϿØÖƼ°ÏµÍ³µ÷ÓÃ

Intel x86ϵÁÐ΢»úÖ§³Ö256ÖÖÖжϣ¬ÎªÁËʹ´¦ÀíÆ÷±È½ÏÈÝÒ×µØÊ¶±ðÿÖÖÖжÏÔ´£¬°ÑËüÃÇ´Ó0~256±àºÅ£¬¼´¸³ÓèÒ»¸öÖжÏÀàÐÍÂën,Intel°ÑËü³Æ×÷ÖжÏÏòÁ¿¡£

Linux ÓÃÒ»¸öÖжÏÏòÁ¿£¨128»òÕß0x80£©À´ÊµÏÖϵͳµ÷Óã¬ËùÓеÄϵͳµ÷Óö¼Í¨¹ýΨһµÄÈë¿Úsystem_callÀ´½øÈëÄںˣ¬µ±Óû§¶¯Ì¬½ø³ÌÖ´ÐÐÒ»Ìõint 0x80»ã±àÖ¸Áîʱ£¬CPU¾ÍÇл»µ½ÄÚºË̬£¬²¢¿ªÊ¼Ö´ÐÐsystem_callº¯Êý£¬system_callº¯ÊýÔÙͨ¹ýϵͳµ÷Óñí sys_call_tableÀ´È¡µÃÏàӦϵͳµ÷ÓõĵØÖ·½øÐÐÖ´ÐС£

ϵͳµ÷Óñísys_call_tableÖдæ·ÅËùÓÐϵͳµ÷Óú¯ÊýµÄµØÖ·£¬Ã¿¸öµØÖ·¿ÉÒÔÓÃϵͳµ÷ÓúÅÀ´½øÐÐË÷Òý£¬ÀýÈçsys_call_table[NR_fork]Ë÷Òýµ½µÄ¾ÍÊÇϵͳµ÷ÓÃsys_fork£¨£©µÄµØÖ·¡£

LinuxÓÃÖжÏÃèÊö·û£¨8×Ö½Ú£©À´±íʾÿ¸öÖжϵÄÏà¹ØÐÅÏ¢£¬Æä¸ñʽÈçÏ£º

Æ«ÒÆÁ¿31¡­.16¡¡¡¡Ò»Ð©±êÖ¾¡¢ÀàÐÍÂë¼°±£Áôλ

¶ÎÑ¡Ôñ·û¡¡¡¡¡¡¡¡¡¡¡¡Æ«ÒÆÁ¿15¡­.0

ËùÓеÄÖжÏÃèÊö·û´æ·ÅÔÚһƬÁ¬ÐøµÄµØÖ·¿Õ¼äÖУ¬Õâ¸öÁ¬ÐøµÄµØÖ·¿Õ¼ä³Æ×÷ÖжÏÃèÊö·û±í£¨IDT£©£¬ÆäÆðʼµØÖ·´æ·ÅÔÚÖжÏÃèÊö·û±í¼Ä´æÆ÷£¨IDTR£©ÖУ¬Æä¸ñʽÈçÏ£º

32λ»ùÖ·Öµ¡¡¡¡½çÏÞ

ÆäÖи÷¸ö½á¹¹µÄÏàÓ¦ÁªÏµ¿ÉÒÔÈçϱíʾ£º

ͨ¹ýÉÏÃæµÄ˵Ã÷¿ÉÒԵóöͨ¹ýIDTR¼Ä´æÆ÷À´ÕÒµ½system_callº¯ÊýµØÖ·µÄ·½·¨£º¸ù¾ÝIDTR¼Ä´æÆ÷ÕÒµ½ÖжÏÃèÊö·û±í£¬ÖжÏÃèÊö·û±íµÄµÚ0x80Ïî¼´ÊÇsystem_callº¯ÊýµÄµØÖ·£¬Õâ¸öµØÖ·½«ÔÚºóÃæµÄÌÖÂÛÖÐÓ¦Óõ½¡£

1.2.Linux µÄLKM£¨¿É×°ÔØÄÚºËÄ£¿é£©¼¼Êõ

ΪÁËʹÄں˱£³Ö½ÏСµÄÌå»ý²¢Äܹ»·½±ãµÄ½øÐй¦ÄÜÀ©Õ¹£¬LinuxϵͳÌṩÁËÄ£¿é»úÖÆ¡£Ä£¿éÊÇÄں˵ÄÒ»²¿·Ö£¬µ«²¢Ã»Óб»±àÒë½øÄںˣ¬ËüÃDZ»±àÒë³ÉÄ¿±êÎļþ£¬ÔÚÔËÐйý³ÌÖиù¾ÝÐèÒª¶¯Ì¬µÄ²åÈëÄں˻òÕß´ÓÄÚºËÖÐÒÆ³ý¡£

ÓÉÓÚÄ£¿éÔÚ²åÈëºóÊÇ×÷ΪLinuxÄں˵ÄÒ»²¿·ÖÀ´ÔËÐеģ¬ËùÒÔÄ£¿é±à³Ìʵ¼ÊÉϾÍÊÇÄں˱à³Ì£¬Òò´Ë¿ÉÒÔÔÚÄ£¿éÖÐʹÓÃһЩÓÉÄں˵¼³öµÄ×ÊÔ´£¬ÀýÈç Linux2.4.18°æÒÔǰµÄÄں˵¼³öϵͳµ÷ÓÃ±í£¨sys_call_table£©µÄµØÖ·£¬ÕâÑù¾Í¿ÉÒÔ¸ù¾Ý¸ÃµØÖ·Ö±½ÓÐÞ¸Äϵͳµ÷ÓõÄÈë¿Ú£¬´Ó¶ø¸Ä±äϵͳµ÷Óá£

ÔÚÄ£¿é±à³ÌÖбØÐë´æÔÚ³õʼ»¯º¯Êý¼°Çå³ýº¯Êý£¬Ò»°ãÇé¿öÏ£¬ÕâÁ½¸öº¯ÊýĬÈÏΪinit_module()ÒÔ¼° clearup_module()£¬´Ó2.3.13Äں˰汾¿ªÊ¼£¬Óû§Ò²¿ÉÒÔ¸øÕâÁ½¸öº¯ÊýÖØÐÂÃüÃû£¬³õʼ»¯º¯ÊýÔÚÄ£¿é±»²åÈëϵͳʱµ÷Óã¬ÔÚÆäÖпÉÒÔ½øÐÐһЩº¯Êý¼°·ûºÅµÄ×¢²á¹¤×÷£¬Çå³ýº¯ÊýÔòÔÚÄ£¿éÒÆ³ýϵͳʱ½øÐе÷Óã¬Ò»Ð©»Ö¸´¹¤×÷ͨ³£Ôڸú¯ÊýÖÐÍê³É¡£

1.3.LinuxϵÄÄÚ´æÓ³Ïñ

/dev/kmemÊÇÒ»¸ö×Ö·ûÉ豸£¬ÊǼÆËã»úÖ÷´æµÄÓ³Ïñ£¬Í¨¹ýËü¿ÉÒÔ²âÊÔÉõÖÁÐÞ¸Äϵͳ£¬µ±Äں˲»µ¼³ösys_call_tableµØÖ·»òÕß²»ÔÊÐí²åÈëÄ£¿éʱ¿ÉÒÔͨ¹ý¸ÃÓ³ÏñÐÞ¸Äϵͳµ÷Ó㬴ӶøÊµÏÖÒþ²ØÎļþ¡¢½ø³Ì»òÕßÄ£¿éµÄÄ¿µÄ¡£

1.4.proc Îļþϵͳ

procÎļþϵͳÊÇÒ»¸öÐéÄâµÄÎļþϵͳ£¬Ëüͨ¹ýÎļþϵͳµÄ½Ó¿ÚʵÏÖ£¬ÓÃÓÚÊä³öϵͳÔËÐÐ״̬¡£ËüÒÔÎļþϵͳµÄÐÎʽ£¬Îª²Ù×÷ϵͳ±¾ÉíºÍÓ¦Óýø³ÌÖ®¼äµÄͨÐÅÌṩÁËÒ»¸ö½çÃæ£¬Ê¹Ó¦ÓóÌÐòÄܹ»°²È«¡¢·½±ãµØ»ñµÃϵͳµ±Ç°µÄÔËÐÐ×´¿öºÎÄں˵ÄÄÚ²¿Êý¾ÝÐÅÏ¢£¬²¢¿ÉÒÔÐÞ¸ÄijЩϵͳµÄÅäÖÃÐÅÏ¢¡£

ÓÉÓÚprocÒÔÎļþϵͳµÄ½Ó¿ÚʵÏÖ£¬Òò´Ë¿ÉÒÔÏó·ÃÎÊÆÕͨÎļþÒ»Ñù·ÃÎÊËü£¬µ«ËüÖ»´æÔÚÓÚÄÚ´æÖ®ÖС£

--------------------------------------------------------------------------------
2.¼¼Êõ·ÖÎö

2.1 Òþ²ØÎļþ

Linux ϵͳÖÐÓÃÀ´²éѯÎļþÐÅÏ¢µÄϵͳµ÷ÓÃÊÇsys_getdents£¬ÕâÒ»µã¿ÉÒÔͨ¹ýstraceÀ´¹Û²ìµ½£¬ÀýÈçstrace ls ½«ÁгöÃüÁîlsÓõ½µÄϵͳµ÷Ó㬴ÓÖпÉÒÔ·¢ÏÖlsÊÇͨ¹ýsys_getedentsÀ´Ö´ÐвÙ×÷µÄ¡£µ±²éѯÎļþ»òÕßĿ¼µÄÏà¹ØÐÅϢʱ£¬LinuxϵͳÓà sys_getedentsÀ´Ö´ÐÐÏàÓ¦µÄ²éѯ²Ù×÷£¬²¢°ÑµÃµ½µÄÐÅÏ¢´«µÝ¸øÓû§¿Õ¼äÔËÐеijÌÐò£¬ËùÒÔÈç¹ûÐ޸ĸÃϵͳµ÷Óã¬È¥µô½á¹ûÖÐÓëÄ³Ð©ÌØ¶¨ÎļþµÄÏà¹ØÐÅÏ¢£¬ÄÇôËùÓÐÀûÓøÃϵͳµ÷ÓõijÌÐò½«¿´²»¼û¸ÃÎļþ£¬´Ó¶ø´ïµ½ÁËÒþ²ØµÄÄ¿µÄ¡£Ê×ÏȽéÉÜÒ»ÏÂÔ­À´µÄϵͳµ÷Óã¬ÆäÔ­ÐÍΪ£º

int sys_getdents
(unsigned int fd, struct dirent *dirp, unsigned int count)

ÆäÖÐfdΪָÏòĿ¼ÎļþµÄÎļþÃèÊö·û£¬¸Ãº¯Êý¸ù¾ÝfdËùÖ¸ÏòµÄĿ¼Îļþ¶ÁÈ¡ÏàÓ¦dirent½á¹¹£¬²¢·ÅÈëdirpÖУ¬ÆäÖÐcountΪdirpÖзµ»ØµÄÊý¾ÝÁ¿£¬Õýȷʱ¸Ãº¯Êý·µ»ØÖµÎªÌî³äµ½dirpµÄ×Ö½ÚÊý¡£

2.2¡¡Òþ²ØÄ£¿é

ÉÏÃæ·ÖÎöÁËÈçºÎÐÞ¸Äϵͳµ÷ÓÃÒÔÒþ²ØÌض¨Ãû×ÖµÄÎļþ£¬ÔÚʵ¼ÊµÄ´¦ÀíÖУ¬¾­³£»áÓÃÄ£¿éÀ´´ïµ½ÐÞ¸Äϵͳµ÷ÓõÄÄ¿µÄ£¬µ«Êǵ±²åÈëÒ»¸öÄ£¿éʱ£¬Èô²»²ÉÈ¡ÈκÎÒþ²Ø´ëÊ©£¬ºÜÈÝÒ×±»¶Ô·½·¢ÏÖ£¬Ò»µ©¶Ô·½·¢ÏÖ²¢Ð¶ÔØÁËËù²åÈëµÄÄ£¿é£¬ÄÇôËùÓÐÀûÓøÃÄ£¿éÀ´Òþ²ØµÄÎļþ¾Í±©Â¶ÁË£¬ËùÒÔÓ¦¼ÌÐø·ÖÎöÈçºÎÀ´Òþ²ØÌض¨Ãû×ÖµÄÄ£¿é¡£

LinuxÖÐÓÃÀ´²éѯģ¿éÐÅÏ¢µÄϵͳµ÷ÓÃÊÇsys_query_module£¬ËùÒÔ¿ÉÒÔͨ¹ýÐ޸ĸÃϵͳµ÷ÓôﵽÒþ²ØÌض¨Ä£¿éµÄÄ¿µÄ¡£Ê×ÏȽâÊÍÒ»ÏÂÔ­À´µÄϵͳµ÷Óã¬Ô­À´ÏµÍ³µ÷ÓõÄÔ­ÐÍΪ£º

int sys_query_module
(const char *name, int which, void *buf, size_t bufsize, size_t *ret)

Èç¹û²ÎÊýname²»¿Õ£¬Ôò·ÃÎÊÌØ¶¨µÄÄ£¿é£¬·ñÔò·ÃÎʵÄÊÇÄÚºËÄ£¿é£¬²ÎÊýwhich˵Ã÷²éѯµÄÀàÐÍ£¬µ±which=QM_MODULES ʱ£¬·µ»ØËùÓе±Ç°ÒѲåÈëµÄÄ£¿éÃû³Æ£¬´æÈëbuff, ²¢ÇÒÔÚretÖдæ·ÅÄ£¿éµÄ¸öÊý£¬buffsizeÊÇbuf»º³åÇøµÄ´óС¡£ÔÚÄ£¿éÒþ²ØµÄ¹ý³ÌÖÐÖ»ÐèÒª¶Ôwhich=QM_MODULESµÄÇé¿ö½øÐд¦Àí¾Í¿ÉÒԴﵽĿµÄ¡£Ð޸ĺóµÄϵͳµ÷Óù¤×÷¹ý³ÌÈçÏ£º

1£©µ÷ÓÃÔ­À´µÄϵͳµ÷Ó㬳ö´íÔò·µ»Ø´íÎó´úÂ룻

2£©Èç¹ûwhich²»µÈÓÚQM_MODULES£¬Ôò²»ÐèÒª´¦Àí£¬Ö±½Ó·µ»Ø¡£

3£©´ÓbufµÄ¿ªÊ¼Î»ÖýøÐд¦Àí£¬Èç¹û´æÔÚÌØ¶¨µÄÃû×Ö£¬Ôò½«ºóÃæµÄÄ£¿éÃû³ÆÏòǰ¸²¸Ç¸ÃÃû×Ö¡£

4£©Öظ´3£©£¬Ö±µ½´¦Àí´¦ÀíÍêËùÓеÄÃû×Ö£¬ÕýÈ··µ»Ø¡£

2.3 Òþ²Ø½ø³Ì

ÔÚLinuxÖв»´æÔÚÖ±½Ó²éѯ½ø³ÌÐÅÏ¢µÄϵͳµ÷Óã¬ÀàËÆÓÚpsÕâÑù²éѯ½ø³ÌÐÅÏ¢µÄÃüÁîÊÇͨ¹ý²éѯprocÎļþϵͳÀ´ÊµÏֵģ¬ÔÚ±³¾°ÖªÊ¶ÖÐÒѾ­½éÉܹýprocÎļþϵͳ£¬ÓÉÓÚËüÓ¦ÓÃÎļþϵͳµÄ½Ó¿ÚʵÏÖ£¬Òò´ËͬÑù¿ÉÒÔÓÃÒþ²ØÎļþµÄ·½·¨À´Òþ²ØprocÎļþϵͳÖеÄÎļþ£¬Ö»ÐèÒªÔÚÉÏÃæµÄhacked_getdentsÖмÓÈë¶ÔÓÚprocÎļþϵͳµÄÅжϼ´¿É¡£

ÓÉÓÚprocÊÇÌØÊâµÄÎļþϵͳ£¬Ö»´æÔÚÓÚÄÚ´æÖ®ÖУ¬²»´æÔÚÓÚÈκÎʵ¼ÊÉ豸֮ÉÏ£¬ËùÒÔLinuxÄں˷ÖÅ䏸ËüÒ»¸öÌØ¶¨µÄÖ÷É豸ºÅ0ÒÔ¼°Ò»¸öÌØ¶¨µÄ´ÎÉ豸ºÅ1£¬³ý´ËÖ®Í⣬ÓÉÓÚÔÚÍâ´æÉÏûÓÐÓëÖ®¶ÔÓ¦µÄi½Úµã,ËùÒÔϵͳҲ·ÖÅ䏸ËüÒ»¸öÌØÊâµÄ½ÚµãºÅPROC_ROOT_INO£¨ÖµÎª1£©£¬¶øÉ豸ÉϵÄ1ºÅË÷Òý½ÚµãÊDZ£Áô²»Óõġ£

ͨ¹ýÉÏÃæµÄ·ÖÎö£¬¿ÉÒԵóöÅжÏÒ»¸öÎļþÊÇ·ñÊôÓÚprocÎļþϵͳµÄ·½·¨£º

1£©µÃµ½¸ÃÎļþ¶ÔÓ¦µÄinode½á¹¹dinode;

2£© if (dinode->i_ino == PROC_ROOT_INO &&
!MAJOR(dinode->i_dev) && MINOR(dinode->i _dev) == 1)
{¸ÃÎļþÊôÓÚprocÎļþϵͳ}

ͨ¹ýÉÏÃæµÄ·ÖÎö£¬¸ø³öÒþ²ØÌض¨½ø³ÌµÄα´úÂë±íʾ£º

hacket_getdents
(unsigned int fd, struct dirent *dirp, unsigned int count)

{

µ÷ÓÃÔ­À´µÄϵͳµ÷Óã»

µÃµ½fdËù¶ÔÓ¦µÄ½Úµã£»

if (¸ÃÎļþÊôÓÚprocÎļþϵͳ&&¸ÃÎļþÃûÐèÒªÒþ²Ø)

{´ÓdirpÖÐÈ¥µô¸ÃÎļþÏà¹ØÐÅÏ¢}

}

2.4¡¡ÐÞ¸Äϵͳµ÷Óõķ½·¨

ÏÖÔÚÒѾ­½â¾öÁËÈçºÎÐÞ¸Äϵͳµ÷ÓÃÀ´´ïµ½Òþ²ØµÄÄ¿µÄ£¬ÄÇôÈçºÎÓÃÐ޸ĺóµÄϵͳµ÷ÓÃÀ´Ìæ»»Ô­À´µÄÄØ£¿Õâ¸öÎÊÌâÔÚʵ¼ÊÓ¦ÓÃÖÐÍùÍùÊÇ×î¹Ø¼üµÄ£¬ÏÂÃæ½«ÌÖÂÛÔÚ²»Í¬µÄÇé¿öÏÂÈçºÎ×öµ½ÕâÒ»µã¡£

(1)µ±ÏµÍ³µ¼³ösys_call_table£¬²¢ÇÒÖ§³Ö¶¯Ì¬µÄ²åÈëÄ£¿éµÄÇé¿öÏ£º

ÔÚLinuxÄÚºË2.4.18°æÒÔǰ£¬ÕâÖÖÄÚºËÅäÖÃÊǷdz£ÆÕ±éµÄ¡£ÕâÖÖÇé¿öÏÂÐÞ¸Äϵͳµ÷Ó÷dz£ÈÝÒ×£¬Ö»ÐèÒªÐÞ¸ÄÏàÓ¦µÄsys_call_table±íÏʹÆäÖ¸ÏòеÄϵͳµ÷Óü´¿É¡£ÏÂÃæÊÇÏàÓ¦µÄ´úÂ룺
int orig_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)

int init_module(void)¡¡

/*³õʼ»¯Ä£¿é*/

{

orig_getdents=sys_call_table[SYS_getdents];¡¡¡¡¡¡¡¡ //±£´æÔ­À´µÄϵͳµ÷ÓÃ

orig_query_module=sys_call_table[SYS_query_module];

sys_call_table[SYS_getdents]=hacked_getdents;¡¡¡¡ //ÉèÖÃеÄϵͳµ÷ÓÃ

sys_call_table[SYS_query_module]=hacked_query_module;

return 0; //·µ»Ø0±íʾ³É¹¦

}

void cleanup_module(void)

/*Ð¶ÔØÄ£¿é*/

{

sys_call_table[SYS_getdents]=orig_getdents;¡¡¡¡¡¡¡¡ //»Ö¸´Ô­À´µÄϵͳµ÷ÓÃ

sys_call_table[SYS_query_module]=orig_query_module;

}

(2)ÔÚϵͳ²¢²»µ¼³ösys_call_tableµÄÇé¿öÏ£º

linuxÄÚºËÔÚ2.4.18ÒÔºóΪÁ˰²È«Æð¼û²»ÔÙµ¼³ö sys_call_table·ûºÅ£¬´Ó¶øÎÞ·¨Ö±½Ó»ñµÃϵͳµ÷ÓñíµÄµØÖ·£¬ÄÇô¾Í±ØÐëÕÒµ½ÆäËûµÄ°ì·¨À´µÃµ½Õâ¸öµØÖ·¡£ÔÚ±³¾°ÖªÊ¶ÖÐÌáµ½ÁË/dev/kmem ÊÇϵͳÖ÷´æµÄÓ³Ïñ£¬¿ÉÒÔͨ¹ý²éѯ¸ÃÎļþÀ´ÕÒµ½sys_call_tableµÄµØÖ·£¬²¢¶ÔÆä½øÐÐÐ޸ģ¬À´Ê¹ÓÃеÄϵͳµ÷Óá£ÄÇôÈçºÎÔÚϵͳӳÏñÖÐÕÒµ½ sys_call_tableµÄµØÖ·ÄØ£¿ÈÃÎÒÃÇÏÈ¿´¿´system_callµÄÔ´´úÂëÊÇÈçºÎÀ´ÊµÏÖϵͳµ÷Óõ썴úÂë¼û /arch/i386/kernel/entry.S£©£º

ENTRY(system_call)

pushl %eax¡¡¡¡¡¡¡¡¡¡¡¡# save orig_eax

SAVE_ALL

GET_CURRENT(%ebx)

cmpl $(NR_syscalls),%eax

jae badsys

testb $0x02,tsk_ptrace(%ebx)¡¡¡¡ # PT_TRACESYS

jne tracesys

call *SYMBOL_NAME(sys_call_table)(,%eax,4)

movl %eax,EAX(%esp)¡¡¡¡¡¡¡¡ # save the return value

ENTRY(ret_from_sys_call)

Õâ¶ÎÔ´´úÂëÊ×Ïȱ£´æÏàÓ¦µÄ¼Ä´æÆ÷µÄÖµ£¬È»ºóÅжÏϵͳµ÷Óúţ¨ÔÚeax¼Ä´æÆ÷ÖУ©ÊÇ·ñºÏ·¨,¼Ì¶ø¶ÔÉèÖõ÷ÊÔµÄÇé¿ö½øÐд¦Àí£¬ÔÚËùÓÐÕâЩ½øÐÐÍêºó£¬ÀûÓÃcall *SYMBOL_NAME(sys_call_table)(,%eax,4) À´×ªÈëÏàÓ¦µÄϵͳµ÷ÓýøÐд¦Àí£¬ÆäÖеÄSYMBOL_NAME(sys_call_table)µÃ³öµÄ¾ÍÊÇsys_call_tableµÄµØÖ·¡£

´ÓÉÏÃæµÄ·ÖÎö¿ÉÒÔ¿´³ö£¬µ±ÕÒµ½system_callº¯ÊýÖ®ºó£¬ÀûÓÃ×Ö·ûÆ¥ÅäÀ´Ñ°ÕÒÏàÓ¦callÓï¾ä¾Í¿ÉÒÔÈ·¶¨sys_call_tableµÄλÖã¬ÒòΪ call something(,%eax,4)µÄ»úÆ÷Ö¸ÁîÂëÊÇ0xff 0x14 0x85¡£ËùÒÔÆ¥ÅäÕâ¸öÖ¸ÁîÂë¾ÍÐÐÁË¡£ÖÁÓÚÈçºÎÈ·¶¨system_callµÄµØÖ·ÔÚ±³¾°ÖªÊ¶ÖÐÒѾ­½éÉÜÁË£¬ÏÂÃæ¸ø³öÏàÓ¦µÄα´úÂ룺

struct{ //¸÷×ֶκ¬Òå¿ÉÒԲο¼±³¾°ÖªÊ¶ÖйØÓÚIDTR¼Ä´æÆ÷µÄ½éÉÜ

unsigned short limit;

unsigned int base;

}__attribute__((packed))idtr;

struct{¡¡ //¸÷×ֶκ¬Òå¿ÉÒԲο¼±³¾°ÖªÊ¶ÖйØÓÚÖжÏÃèÊö·ûµÄ½éÉÜ

unsigned short off1;

unsigned short sel;

unsigned char none,flags;

unsigned short off2;

}__attribute__((packed))idt;

int kmem;

/ *ÏÂÃæº¯ÊýÓÃÓÚ´Ókemem¶ÔÓ¦µÄÎļþÖÐÆ«ÒÆÁ¿Îªoff´¦¶ÁÈ¡sz¸ö×Ö½ÚÖÁÄÚ´æm´¦*/

void readkmem(void *m,unsigned off,int sz) {¡­¡­¡­}

/*ÏÂÃæº¯ÊýÓÃÓÚ´Ósrc¶ÁÈ¡count¸ö×Ö½ÚÖÁdest´¦*/

void weitekmem(void *src,void *dest,unsigned int count) {¡­¡­¡­..}

unsigned sct;¡¡¡¡//ÓÃÀ´´æ·Åsys_call_tableµØÖ·

char buff[100]; //ÓÃÓÚ´æ·Åsystem_callº¯ÊýµÄǰ100¸ö×Ö½Ú¡£

char *p;

if((kmem=open(¡°/dev/kmem¡±,O_RDONLY))<0)

return 1;

asm(¡°sidt %0¡± ¡°:=m¡± (idtr)); //¶ÁÈ¡idtr¼Ä´æÆ÷µÄÖµÖÁidtr½á¹¹ÖÐ

readkmem(&idt,idtr.base+8*0x80,sizeof(idt)) //½«0x80ÃèÊö·û¶ÁÖÁidt½á¹¹ÖÐ

sys_ call_off=(idt.off2<<16)|idt.off1; //µÃµ½system_callº¯ÊýµÄµØÖ·¡£

readkmem(buff,sys_call_off,100); //¶ÁÈ¡system_callº¯ÊýµÄǰ100×Ö½ÚÖÁbuff

p=(char *)memmem(buff,100,¡±xffx14x85¡±,3);¡¡¡¡ //µÃµ½callÓï¾ä¶ÔÓ¦»úÆ÷ÂëµÄµØÖ·

sct=(unsigned *)(p+3);¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ //µÃµ½sys_call_tableµÄµØÖ·¡£



ÖÁ´ËÒѾ­µÃµ½ÁËsys_call_tableÔÚÄÚ´æÖеÄλÖã¬ÕâÑùÔÚ¸ù¾Ýϵͳµ÷ÓúžÍÄܹ»ÕÒµ½ÏàÓ¦µÄϵͳµ÷ÓöÔÓ¦µÄµØÖ·£¬Ð޸ĸõØÖ·¾Í¿ÉÒÔʹÓÃеÄϵͳµ÷º¯Êý£¬¾ßÌåµÄ×ö·¨ÈçÏ£º



readkmem(&orig_getdents,sct+ SYS_getdents*4,4); //±£´æÔ­À´µÄϵͳµ÷ÓÃ

readkmem(&orig_query_module,sct+SYS_query_module*4,4);

writekmem(hacked_getdents,sct+SYS_getdents*4,4); //ÉèÖÃеÄϵͳµ÷ÓÃ

writekmem(hacket_query_module,sct+SYS_query_module*4,4);

2.5¡¡ÆäËûµÄÏà¹Ø¼¼Êõ

ÉÏÃæÒѾ­ÍêÈ«½â¾öÁËÒþ²ØµÄÏà¹Ø¼¼ÊõÎÊÌ⣬ÔÚʵ¼ÊÓ¦ÓÃÖУ¬¿ÉÒÔ°ÑÆô¶¯Ä£¿é»òÕß½ø³ÌµÄ´úÂë×ö³É½Å±¾¼ÓÈëµ½ÏàÓ¦µÄÆô¶¯Ä¿Â¼ÖÐ,¼ÙÉèÄãµÄLinuxÔËÐм¶±ðΪ3£¬Ôò¿ÉÒÔ¼Óµ½Ä¿Â¼rc3.dÖУ¨¸ÃĿ¼³£´æÔÚÓÚ/etc/rc.d»òÕß/etcĿ¼Ï£©£¬È»ºó°Ñ¸Ã½Å±¾µÄÃû×Ö¸ÄΪ¿ÉÒÔÒþ²ØµÄÃû×Ö¡£

ÁíÒ»ÖÖ·½·¨¾ÍÊÇÔÚһЩÆô¶¯½Å±¾ÖмÓÈëÆô¶¯ÄãµÄÄ£¿é»òÕß½ø³ÌµÄ´úÂ룬µ«ÕâÑù±È½ÏÈÝÒ×±»·¢ÏÖ£¬Ò»¸ö½â¾ö˼·¾ÍÊǽø³Ì»òÄ£¿éÆô¶¯ÒÔºóÂíÉϻָ´Õý³£µÄ½Å±¾£¬ÓÉÓÚϵͳ¹Ø»úʱ»áÏòËùÓнø³Ì·¢ËÍSIGHUPÐźţ¬¿ÉÒÔÔÚ½ø³Ì»òÄ£¿éÖд¦Àí¸ÃÐźţ¬Ê¹¸ÃÐźŷ¢ÉúʱÐÞ¸ÄÆô¶¯½Å±¾£¬ÖØÐ¼ÓÈëÆô¶¯Ä£¿éµÄ´úÂ룬ÕâÑùµ±ÏµÍ³ÏÂ´ÎÆô¶¯Ê±ÓÖ¿ÉÒÔ¼ÓÔØÕâ¸öµÄÄ£¿éÁË£¬¶øÇÒ¹ÜÀíÔ±²ì¿´Æô¶¯½Å±¾Ê±Ò²²»»á·¢ÏÖÒì³£¡£

--------------------------------------------------------------------------------
3.½áÊøÓï

±¾ÎĶÔLinux»·¾³ÏµÄһЩ¸ß¼¶Òþ²Ø¼¼Êõ½øÐÐÁË·ÖÎöÑо¿£¬ÆäÖÐËùÉæ¼°µÄ¼¼Êõ²»½ö¿ÉÒÔÓÃÔÚϵͳ°²È«·½Ã棬ÔÚÆäËû·½ÃæÒ²ÓÐÖØÒªµÄ½è¼øÒâÒå¡£ÓÉÓÚLinuxµÄ¿ª·ÅÌØÐÔ£¬Ê¹µÃ¹¥»÷ÕßÒ»µ©»ñµÃÁËrootȨÏÞ¾ÍÄܹ»¶Ôϵͳ½øÐн϶àµÄÐ޸ģ¬ËùÒÔ±ÜÃâµÚÒ»´Î±»ÈëÇÖÊÇÖÁ¹ØÖØÒªµÄ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ