| ÂÛ̳ע²á| ¼ÓÈëÊÕ²Ø | ÉèΪÊ×Ò³| RSS
Google
Äúµ±Ç°µÄλÖãºÊ×Ò³ > LinuxƵµÀ > Linux¿ª·¢Çø > ÄÚºËÑо¿

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
 7/7   |‹ ‹‹ 5 6 7

À´¶¥Ò»ÏÂ
½ü»ØÊ×Ò³
·µ»ØÊ×Ò³
·¢±íÆÀÂÛ ¹²ÓÐÌõÆÀÂÛ
Óû§Ãû: ÃÜÂë:
ÑéÖ¤Âë: ÄäÃû·¢±í
Ïà¹ØÎÄÕÂ
    ÎÞÏà¹ØÐÅÏ¢
À¸Ä¿¸üÐÂ
À¸Ä¿ÈÈÃÅ