 |
|
FreebsdÄÚºËÄ£¿éÔ´ÂëʵÏÖÒÔ¼°Ó¦ÓÃÌ½ÃØ |
| ʱ¼ä£º2005-11-25 10:43:19 À´Ô´£º ×÷Õߣº |
£
int set_symbol(struct proc *p, struct set_symbol_args *uap) {
linker_file_t lf; elf_file_t ef; unsigned long symnum; const Elf_Sym* symp = NULL; Elf_Sym new_symp; const char *strp; unsigned long hash; caddr_t address; int error = 0;
mod_debug("Set symbol %s address 0x%xn",uap->name,uap->address);
lf = TAILQ_FIRST(&linker_files); ef = lf->priv;
/* First, search hashed global symbols */²Î¼ûelf¼ø±ð hash = elf_hash(uap->name); //ͨ¹ý¶ÔÃû×Öhash¿ÉÒÔ¼Ó¿ìѰÕÒËÙ¶È£¬ symnum = ef->buckets[hash % ef->nbuckets];//
while (symnum != STN_UNDEF) { if (symnum >= ef->nchains) { printf("link_elf_lookup_symbol: corrupt symbol tablen"); return ENOENT; }
symp = ef->symtab + symnum; //symtab½ÚÊǾ²Ì¬·ûºÅ½Ú if (symp->st_name == 0) { //·ûºÅÃû×ÖË÷Òý printf("link_elf_lookup_symbol: corrupt symbol tablen"); return ENOENT; }
strp = ef->strtab + symp->st_name; //·ûºÅÃû½Ú
if (!strcmp(uap->name, strp)) {
/* found the symbol with the given name */ if (symp->st_shndx != SHN_UNDEF || //¹ØÁªµÄË÷Òý (symp->st_value != 0 && ELF_ST_TYPE(symp->st_info) == STT_FUNC )) { //·ûºÅÀàÐÍ£¬¹ØÁªÒ»¸öº¯Êý
/* give some debug info */ address = (caddr_t) ef->address + symp->st_value; //·ûºÅµÄµØÖ· =Ä£¿éµÄµØÖ·+st_value st_value±íʾÎļþÆ«ÒÆ mod_debug("found %s at 0x%x!n",uap->name,(uintptr_t)address);
bcopy(symp,&new_symp,sizeof(Elf_Sym)); new_symp.st_value = uap->address; //¸Ä±ä³ÉеĵØÖ·
address = (caddr_t) ef->address + new_symp.st_value; mod_debug("new address is 0x%xn",(uintptr_t)address);
/* set the address */ bcopy(&new_symp,(ef->symtab + symnum),sizeof(Elf_Sym));
break;
break;
} else return(ENOENT); }
symnum = ef->chains[symnum]; }
/* for now this only looks at the global symbol table */
return(error); } symtableÊÇÒ»¸öµ¥¶ÀµÄÄ£¿é£¬Ëü½«¼ÓÔØÉÏÃæÓùýµÄËùÓÐϵͳµ÷Óã¬Äã¿ÉÒÔͨ¹ýset_sym¹¤¾ßÀ´²âÊÔ£¬Ëü½«»÷°Ütool/checkcall
7. ±£»¤Äã×Ô¼º£ºÃ¨ºÍÀÏÊóµÄÓÎÏ·¡£
ÏÖÔÚÄã¿ÉÄÜÒªÎÊ£¬ÈçºÎ·ÀÖ¹ÄãµÄϵͳ·¢ÉúÕâÖÖÇé¿ö£¬Ò²ÐíÄãÓÐÐËȤÓëÕÒµ½Äã×Ô¼º£º£© ÏÂÃæÎÒÃÇÀ´¿´¼¸ÖÖ¼ì²âµÄ·½·¨£º
7.1 ¼ì²é·ûºÅ±í
ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃÇ¿´µ½ÁËϵͳµ÷ÓÃ±í±»ÐÞ¸ÄÁË£¬ËùÒÔÄã¿ÉÒÔ¼ì²éϵͳµ÷ÓñíÀ´·¢ÏÖÐ޸ģ¬Ò»ÖÖ·½·¨¾ÍÊÇ£¬ÔÚϵͳÆô¶¯Ê±¼ÓÔØÒ»¸ö °üº¬ÓÐÌØÊâÄ¿µÄµÄϵͳµ÷ÓõÄÄ£¿é£¬Õâ¸öϵͳµ÷ÓÃÓÃÀ´¼ì²é²¢ÓëÏÈǰ±£´æÏµÍ³µ÷Óñí¶Ô±È¡£
ÉÏÃæµÄ·½·¨ºÜͨÓ㬵«ÊÇÆôËüµÄ±í±»ÐÞ¸ÄÁËÄØ£¿µ±È»Äã¿ÉÒÔÌí¼Ó¸ü¶à±ðµÄ±íµÄ¼ì²é£¬ÕâÖÖ·½·¨ÊDz»Äܼì²âµ½jumpÕâÖÖ·½·¨ºÍ Ö±½ÓÐÞ¸ÄÄں˵ķ½·¨¡£
ÄãÓ¦¸Ãͨ¹ý/dev/kmem ¼à²ìϵͳµ÷ÓÃ±í£¬ÔÚtools/checkcallÓиöÀý×Ó£¬Ëü´øÓÐÁ½¸ö²ÎÊý£¬Ò»¸öÊÇsyscallµÄÃû×Ö£¬»¹ÓÐÒ»¸ö¾ÍÊÇ ÏµÍ³µ÷Óúţ¬ÒÔ´ËÔØÏµÍ³µ÷ÓñíÖÐÀ´¼ì²é¡£
µ«ÊÇÕâÑù»¹ÊÇÓÐÎÊÌ⣬±ÈÈçÀûÓÃÔÚʵս½ÚÖÐÎÒÃǽéÉܵķ½·¨£¬ÎÒÃÇÖ»Äܵõ½´íÎóµÄµØÖ·£¬ÏÂÃæµÄÀý×ÓÖн«ÓÃÀ´Ö¤Ã÷£¬¼ÙÈçÎÒÃÇ ¼ÓÔØÁËCY,ÏÖÔÚ¼ÙÈçÎÒÃÇÏëÒª¼ì²éopenÕâ¸öϵͳµ÷Óã¬SYS_openµÄϵͳµ÷ÓúÅΪ5£¬¶¨ÒåÓÚ/sys/sys/syscall.h ÎÒÃÇ×÷Èçϼì²â # tools/checkcall open 5 Checking syscall 5: open
sysent is 0x4 at 0xc03b7308 sysent[5] is at 0xc03b7330 and will go to function at 0xc0cd5bf4 ALERT! It should go to 0xc01ce5f8 instead
µ±È»ÎÒÃÇͨ¹ýsetsymÀ´ÐÞ¸´Õâ¸öÎÊÌ⣬µ±È»ÄãÐèÒªÊ×ÏȼÓÔØsymtableÕâ¸öÄ£¿é # exp/setsym 0xc0cd5bf4 open
ÏÖÔÚÔÙÓÃcheckcall¼ì²é£¬²»»á³öÏÖALERTÁË£¬Ëü¼ÙÉèopen¾ÍÊÇÔÚ0xc0cd5bf4£¬µ«ÊǹÊʲ¢Ã»ÓнáÊø£¬ÎÒÃÇ¿ÉÒÔͨ¹ýʵ¼Ê¼ì²ékernel À´Ö¤Êµobjdump -d /kernel --start-address=0xc0cd5bf4 ÎÒÃǾͻỳÒÉÕâ¸öϵͳµ÷ÓõĵØÖ·¹ý¸ß£¬objdumpÔÚÕâ¸öµØÖ·È´Ã»ÓÐ ·¢ÏÖÈκζ«Î÷£¬°µÊ¾ÓÐÎÊÌâÁË¡£Õâ±íÃ÷ÄãµÄÄں˻òÕßobjdump±»ÎļþÖØÏòÁË£¬È»¶øÕ⽫»áÒýÆðÒ»µãСµÄÕùÂÛ¡£
7.2 ÏÝÚåÄ£¿é
ÁíÍâµÄÄã¿ÉÒÔ×öµÄ¾ÍÊǼÓÔÚÒ»¸öÄ£¿éÓÃÀ´¼Í¼kldloadµÄµ÷Óã¬È»ºóÅжÏÊǾܾø»¹ÊǼÓÔØ£¬ÔÚtrapmod/ÓиöÀý×Ó£¬Äã¿ÉÒÔÓ÷ÇÒþ²ØµÄ·½Ê½ ¼ÓÔØÕâ¸öÄ£¿é£¬µ±È»ÔÚ°²È«¼¶±ðÌáÉýǰ¡£
7.3
£¨ÂÔ£©
7.4 ¸ÅÂÛ
£¨ÂÔ£© 8.½áÂÛ ÕýÈçÄãËù¼ûµ½µÄ£¬ºÜ¶à¹¥»÷µÄ¼¼ÊõͬÑù¿ÉÒÔÓÃÀ´·ÀÓù£¬Í¨³£Òþ²ØÒ»¸öÓÃÀ´¹ÜÀíµÄÄ£¿éºÜÖØÒª£¬×÷Ϊһ¸öϵͳ¹ÜÀíÔ±Òþ²ØÒ»Ð©ÓÃÀ´¼ì²âÈëÇÖ µÄshellºÍÎļþÊDZØÒªµÄ¡£Èç¹ûÄãÊǸöfreebsdϵͳ¹ÜÀíÔ±£¬Ó¦¸Ãʱ¿ÌÒâʶµ½¼´Ê¹ÏµÍ³´¦ÔÚÒ»¸ö¸ßµÄ°²È«¼¶±ðÒ²ÓкܶàÐèҪעÒâµÄµØ·½¡£
ÕâÆªÎÄÕ¿ÉÒÔÈÃÄãѧµ½¸ü¶àµÄkernel works , ÕâÊÇ×îÖØÒªµÄ£»£©
9.´úÂë ÎÄÖÐÌáµ½µÄËùÓдúÂë¶¼¿ÉÒÔÔÚCurious Yellow °üÖÐÕÒµ½ £¨µØÖ·£ºhttp://www.r4k.net/mod/cyellow-0.01.tar.gz
ÁªÃËÕ¾:http://www.xxlinux.com ÓÐÎÊÌâÇëµ½ÂÛ̳:http://bbs.xxlinux.com |
|
|
|
|
|