©®linuxÉçÇø©® °®ÐÄÔ®Öú ©® LinuxÈÏÖ¤©®ÏµÁÐ½Ì³Ì ©® Òµ½ç¶¯Ì¬©® Õ¾ÎñÐÂÎÅ ©® ¹«Ë¾ÕÐÆ¸©® ½¨ÒéÁôÑÔ ©® ÍøÖ·´óÈ« ©®LPIרÌâ©® CISCOרÌâ
ÉèΪÊ×Ò³
¼ÓÈëÊÕ²Ø
¹ÜÀíÍŶÓ
JSP  
JAVA  
PERL  
 ÄúµÄλÖãºÊ×Ò³ > article > Linux¿ª·¢Çø > ÄÚºËÑо¿ >
À¸Ä¿µ¼À¸
×ÊÁÏËÑË÷
ÈÈÃÅÎÄÕÂ
¡¤linux-2.6ÄÚºËÉý¼¶Îĵµ
¡¤LinuxÔ´´úÂëµÄ×¢ÊÍ
¡¤linux2.6Äں˱àÒë·½·¨ÏêÊö
¡¤Linux²Ù×÷ϵͳÄں˱àÒëÏê½â
¡¤LinuxÄں˽ṹÏê½â
¡¤LinuxÅäÖÃÓë±àÒëÄÚºË
¡¤¶¨Ê±Æ÷
¡¤LinuxÄÚºËÉý¼¶È«¹¥ÂÔ
¡¤FC5(Fedora Core5)ϱàÒëÄÚºË×Ü
¡¤Ubuntu 6.06 dapper Äں˱àÒë³õ
¡¤Linux Äں˱àÒëÏê½â
¡¤LinuxÄں˹ÜÀí»ù´¡ÖªÊ¶¸ÅÊö
¡¤Linux2.4Éý¼¶µ½2.6ÄÚºËÉý¼¶Ö¸ÄÏ
¡¤µÚ°ËÕ É豸Çý¶¯
¡¤ÈçºÎ±àÒëlinuxÄÚºË
×îÐÂÎÄÕÂ
¡¤LinuxÄÚºËbootsplash¹¦ÄܵÄʵÏÖ
¡¤LinuxÄÚºË2.6.25ȫз¢²¼¼ÓÈëÖÚ
¡¤Debian Linuxϵͳ±àÒëÄں˱ê×¼
¡¤Linux2.4Äں˺Í2.6Äں˶ÔInitr
¡¤2.6.24Äں˱àÒë initrd-2.6.24
¡¤QtopiaÓ¦ÓóÌÐòÓëLinuxÄÚºËÊý¾Ý
¡¤Linux 2.6ÄÚºËÖÐsysfsÎļþϵͳ
¡¤Linux2.6ÄÚºËÇý¶¯ÒÆÖ²²Î¿¼
¡¤Andrew Morton:LinuxÄں˵ÄÖ´·¨
¡¤Fedora 8 LinuxϵͳµÄÄÚºËÅäÖÃ
¡¤KernelÖеÄirq.cº¯Êý
¡¤LinuxºËÐijöÏÖȨÏÞÀ©Õż°¼ÇÒäÌå
¡¤Linux 2.6±¾µØÈ¨ÏÞÌáÉý©¶´
¡¤½áºÏLinuxϵͳÄÚºËÔ´ÂëÀí½âSYN
¡¤¹ØÓÚLinux ÄÚºËÖÐÎå¸öÖ÷Òª×Óϵ
Google
 
FreebsdÄÚºËÄ£¿éÔ´ÂëʵÏÖÒÔ¼°Ó¦ÓÃÌ½ÃØ
[ ×÷Õß:  ¼ÓÈëʱ¼ä:2005-11-25 10:43:19  À´×Ô: ]
 
×¢£ºÎÄÕºÜÀϵģ¬linux´ó¼Ò¶¼ÊìÁË£¬Ïà¶ÔÀ´ËµbsdÉÙÁ˺ܶ࣬µ«ÊÇÔ­Àí»¹ÊÇÒ»ÑùµÄ£¬ÕâÆªÎÄÕ»¹ÊÇÏ൱²»´íµÄ£¬ÓÐÖúÓÚkernel hacking in freebsd £º£© Ï׸øÎÒ¼´½«¿ªÊ¼µÄ4Äê¼¶µÄ×îºó¼¸ÃÅ¿¼ÊÔ. /> ÎÄÖÐÌáµ½µÄCurious Yellow¿ÉÒÔÔÚxfocusÕÒµ½¡£

1. ½éÉÜ
1.1. ÄÚºËÄ£¿é
1.2. Ò»Ð©ÓÐÓõĺ¯Êý

2. ·½·¨
2.1. Ìæ»»º¯ÊýÖ¸Õë
2.1.2. ÏµÍ³µ÷ÓÃ
2.1.3. ÆäËüµÄ±í
2.1.4. µ¥Ò»µÄº¯ÊýÖ¸Õë
2.2. ÐÞ¸ÄÄں˿ռäµÄ¶ÓÁÐ
2.3. ¶ÁдÄں˿ռä
2.3.1. ²éÕÒ·ûºÅµÄµØÖ·
2.3.2. ¶ÁÊý¾Ý
2.3.3. ÐÞ¸ÄÄÚºËÊý¾Ý

3. Ó¦ÓÃ
3.1. Òþ²Ø²¢Öض¨ÏòÎļþ
3.2. Òþ²Ø½ø³Ì
3.3. Òþ²ØÍøÂçÁ¬½Ó
3.4. Òþ²Ø·À»ðǽ¹æÔò
3.5. ´¥·¢Æ÷
3.6. Òþ²ØÄ£¿é
3.7. ÆäËüµÄÓ¦ÓÃ

4. Äں˲¹¶¡
4.1 ½éÉÜ
4.2 ²åÈëÌø×ªÖ¸Áî
4.3 Ìæ»»Äں˴úÂë

5. Ô½¹ýÖØÆô

6. ÊµÕ½

7. ±£»¤×Ô¼º£ºÃ¨ºÍÀÏÊóµÄÓÎÏ·
7.1. ¼ì²é·ûºÅ±í
7.2. ¹¹¼þÒ»¸öÏÝÚåÄ£¿é
7.3. ÖØÐÂÖ±½ÓµÃµ½Êý¾Ý
7.4. ×¢ÒâÊÂÏî

8. ½áÂÛ

9. ´úÂë

10. ²Î¿¼

11. ¸Ðл
---------------------------------------------

1. ½éÉÜ
Ê×ÏȽéÉÜÄÚºËÄ£¿éµÄ¸ÅÄ»¹ÓÐϵͳµ÷ÓõĸÅÄî,˵Ã÷µÄÒ»µã¾ÍÊÇfreebsd°²È«¼¶±ðÎÊÌ⣬ͨ³£ÔÚ2¼¶¾Í²»¿ÉÒÔ¼ÓÔØÄ£¿éÁË
¿ÉÒÔÓÃsysctl µ÷ÕûÉèÖûòÕßÔÚ/etc/rc.confÖÐÔö¼ÓÈçÏÂÌõÄ¿ÔÚÆô¶¯Ê±µ÷Õû£º
kern_securelevel_enable="YES"
kern_securelevel="2"
±¾ÎÄonlyÓÃÀ´½ÌÓýÄ¿µÄ£¬£º£©ËùÓÐÉæ¼°µÄ´úÂë¶¼¿ÉÒÔÔÚCurious Yellow (CY)ÖÐÕÒµ½.

1.2. ÄÚºËÄ£¿é
Çë²Î¿¼ scz@nsfocus Ç°±²·­ÒëµÄ ÄÚºËÁ´½Ó»úÖÆ(KLD)±à³ÌÖ¸ÄÏ>,Èç¹ûÄã¶ÔlinuxµÄlkmÁ˽⣬Õâ¸öºÜºÃÀí½â¡£ÔÚ/usr/share/examples/kld/ Óмòµ¥µÄÀý×Ó¡£

1.2 Ò»Ð©ÓÐÓõĵĺ¯Êý
ÕâÀï¸ø³öһЩÓÐÓõĺ¯Êý£¬Í¨³£ÔÚϵͳµ÷ÓÃÖÐÓõ½copyin/copyout/copyinstr/copyoutstr Õ⼸¸öº¯Êý¿ÉÒÔÓÃÀ´´ÓÓû§¿Õ¼äµÃµ½
Á¬ÐøµÄ´ó¿éÊý¾Ý£¬manpage copy(9)¿ÉÒԵõ½¸ü¶àÁ˽⣬ÔÚKLD tutorialÒ²¿ÉÒÔÕÒµ½ 
ÏÂÃæÊǸöСÀý×ÓÀ´Õ¹Ê¾copyinµÄÓ÷¨£¬ÎÒÃǹ¹ÔìÁËÒ»¸ö´øÓÐÒ»¸ö×Ö·û´®Ö¸Õë×ö²ÎÊýµÄϵͳµ÷Óã¬Í¨¹ýcopyin°Ñ×Ö·û´®´ÓÓû§¿Õ¼äÒÆ¶¯
µ½Äں˿ռäÀ´
struct example_call_args {
    char *buffer;
};

int
example_call(struct proc *p, struct example_call_args *uap)
{
    int error;
    char kernel_buffer_copy[BUFSIZE];

    /* copy in the user data */
    error = copyin(uap->buffer, &kernel_buffer_copy, BUFSIZE);
    [...]
}
fetch/store
ÕâÁ½¸öº¯ÊýÓÃÀ´µÃµ½±È½ÏС¿éµÄÊý¾Ý£¬Ð¡µ½×Ö½Ú»òÕß×Ö³¤µÄÊý¾Ý
spl..
Õâ¸öº¯ÊýÓÃÀ´µ÷ÕûÖжÏÓÅÏȼ¶£¬¿ÉÒÔÓÃÀ´×èֹijЩÖжϴ¦Àí³ÌÐòµÄÖ´ÐУ¬ÏÂÃæµÄÀý×ÓÖе±Öжϴ¦Àíº¯ÊýÖ¸Õëicmp_inputÐÞ¸Äʱ£¬ÒòΪ
Ëüͨ³£Òª¾­¹ýһЩʱʱ¼ä£¬ËùÒÔÎÒÃÇÒª·ÀÖ¹¶ÔÕâ¸öÖжϵĴ¦Àí¡£

2. ·½·¨
Õâ½ÚÁгöһЩ³£Óõķ½·¨£¬½«ÔÚºóÃæµÄ¾ßÌå¼¼ÊõÖÐʹÓ㬱ÈÈçÒþ²Ø½ø³Ì£¬ÍøÂçÁ¬½Ó¡£µ±È»ÕâЩ·½·¨Ò²¿ÉÒÔÓÃÀ´ÊµÏÖÆäËûµÄ..
2.1. Ð޸ĺ¯ÊýÖ¸Õë
×î¹ÅÀÏÒ²×î¾­³£Óõķ½·¨£¬Ð޸ĺ¯ÊýÖ¸Õ룬ÓÃÀ´Ö¸ÏòÄãµÄº¯Êý£¬»òÕßͨ¹ý¸Äд/dev/kmem´ïµ½ÏàͬµÄÄ¿µÄ¡££¨ÏÂÃæ£©
×¢Òâµ±ÄãÐÞ¸ÄÁ˺¯ÊýÖ¸Õëºó£¬ÄãµÄеĺ¯ÊýÒªºÍÔ­À´µÄº¯ÊýÓÐÏàͬµÄµ÷ÓòÎÊý¡£ÏÂÃæ½éÉÜÁËһЩͨ³£ÓÃÀ´hookµÄÄں˺¯Êý
2.1.1 ÏµÍ³µ÷ÓÃ
¾­µäµÄhook·½·¨£¬freebsdͨ¹ýÒ»¸öÈ«¾ÖµÄsysent½á¹¹Êý×é±£³ÖÁËһϵÁеÄϵͳµ÷Ó㬲μû/sys/kern/init_sysent.c 
struct sysent sysent[] = {
        { 0, (sy_call_t *)nosys },                      /* 0 = syscall */
        { AS(rexit_args), (sy_call_t *)exit },          /* 1 = exit */
        { 0, (sy_call_t *)fork },                       /* 2 = fork */
        { AS(read_args), (sy_call_t *)read },           /* 3 = read */
        { AS(write_args), (sy_call_t *)write },         /* 4 = write */
        { AS(open_args), (sy_call_t *)open },           /* 5 = open */
        { AS(close_args), (sy_call_t *)close },         /* 6 = close */
        [...]
½á¹¹sysentÔÚ/sys/sys/syscall.h¶¨Ò壬»¹ÓÐϵͳµ÷ÓúÅÒ²ÔÚ´ËÎļþÖж¨Òå
±È·½ËµÄãÏëÌæ»»openÕâ¸öϵͳµ÷Óã¬ÔÚÄãµÄÄ£¿é¼ÓÔØº¯ÊýµÄMOD_LOAD½ÚÖÐÕâÑù×ö
sysent[SYS_open] = (sy_call_t *)your_new_open
È»ºóÔÚÄãµÄÄ£¿éÐ¶ÔØ½ÚÖÐÐÞ¸´Ô­À´µÄϵͳµ÷ÓÃ
sysent[SYS_open].sy_call = (sy_call_t *)open;

2.1.2. ÆäËüһЩÓÐÓõıí

ϵͳµ÷Óò»ÊÇΨһ¿ÉÒÔÐ޸ĵĵط½£¬ÔÚfreebsdÄÚºËÖл¹ÓÐһЩÆäËüµÄµØ·½Ò²¿ÉÒÔÀûÓã¬ÌرðÊÇinetswºÍ¸÷ÖÖÎļþϵͳµÄvnode±í.
struct ipprotosw intesw[]±£´æÁËһϵÁб»Ö§³ÖµÄinetЭÒéµÄÐÅÏ¢£¬ÕâÆäÖаüÀ¨Á˵±ÕâÖÖЭÒéµÄÊý¾Ý±¨µ½´ïʱ»òËͳöʱÓÃÀ´´¦
ÀíµÄº¯Êý ²Î¼û/sys/netinet/in_proto.cµÃµ½¸ü¶àµÄÐÅÏ¢£¬ËùÒÔÎÒÃÇÒ²¿ÉÒÔhookÕâÀïµÄº¯Êý£º£© 
ÏÂÃæÎÒÃǾͿÉÒÔÔÚÄ£¿éÖÐhookÁË
inetsw[ip_protox[IPPROTO_ICMP]].pr_input = new_icmp_input;

ͨ³£Ã¿ÖÖÎļþϵͳµÄvnode±í¶¼ÊÇÓɶà¸ö¾ßÌåµÄº¯Êý×é³É¡£ËùÒÔÎÒÃÇ¿ÉÒÔÌæ»»ËüÃÇÀ´Òþ²ØÎÒÃǵÄÎļþ¡£
ufs_vnodeop_p[VOFFSET(vop_lookup)] = (vop_t *) new_ufs_lookup;

ÔÚÄÚºËÖе±È»»¹ÓÐºÜ¶àµØ·½¿ÉÒÔhook,Õâ¾ÍÈ¡¾öÄãµÄÄ¿µÄÁË£¬kernel source ÊÇ×îÖØÒªµÄÎĵµ

2.1.3 µ¥¸öµÄº¯ÊýÖ¸Õë
ż¶ûÎÒÃÇÒ²»áÅöµ½µ¥¸öµÄº¯Êýº¯ÊýÖ¸Õ룬±ÈÈç˵ip_fw_ctl_ptr£¬Õâ¸öº¯ÊýÓÃÀ´´¦ÀíipfwµÄÇëÇó£¬ÕâÀïÎÒÃÇÒ²¿ÉÒÔÓÃÀ´hook¡£

2.2. ÐÞ¸ÄÄں˶ÓÁÐ
Ìæ»»º¯Êý²»¹»ÓÐÒâ˼ѽ£º£©£¬Ò²ÐíÄãÏëÐÞ¸ÄÄÚºËÖеÄһЩÊý¾Ý£¬Ò»Ð©¸ÐÐËȤµÄ¶«Î÷¶¼ÒÔ¶ÓÁеÄÐÎʽ´æ´¢ÔÚÄÚºËÖУ¬Èç¹ûÄã´ÓÀ´Ã»ÓÐ
ʹÓùý/sys/sys/queue.hµÄһЩºê£¬ÄãÏÈÒªÊìϤһÏÂËüÈ»ºóÔÚ½øÐÐÏÂÃæµÄÔĶÁ¡£Õâ¿ÉÒÔÈÃÄãÇáËÉÃæ¶ÔÏÂÃæµÄkernel source
²¢ÇÒÔÚÄãʹÓÃÕâЩºêʱ²»»á³ö´í¡£

һЩ¸ÐÐËȤµÄ¶ÓÁÐ
½ø³Ì¶ÓÁУºstruc proclist allproc ºÍ zombproc Ò²ÐíÄã²¢²»ÏëÐÞ¸ÄÕâµÄ¶«Î÷ÒòΪ½ø³Ìµ÷¶ÈµÄÄ¿µÄ£¬³ý·ÇÄãÏëÖØÐ´´ó²¿·ÖµÄ
Äں˴úÂ룬µ«ÊÇÄã¿ÉÒÔ¹ýÂËËüµ±ÓÐÓû§ÇëÇóʱ¡£

linker_files¶ÓÁУºÕâ¸ö¶ÓÁÐÖаüÀ¨ÁËÁ¬½Óµ½ÁËkernelµÄÎļþ£¬Ã¿¸öÎļþ¿ÉÒÔ°üº¬¶à¸öÄ£¿é£¬ËüµÄÃèÊö¿ÉÒÔÔÚÕâÀïÕÒµ½£¨THC art
icle£©ÕâÆªÎÄÕµÄÁ¬½ÓÊÇhttp://www.thehackerschoice.com/papers/bsdkern.html£©£¬×Ô¼ºÕÒ°É¡££º£©Õâ¸ö¶ÓÁзdz£ÖØÒª
µ±ÎÒÃǸıä·ûºÅµÄµØÖ·£¬»òÕßÒþÂ÷Õâ¸öÎļþËù°üº¬µÄÄ£¿é¡£

Ä£¿é¶ÓÁУºmodule list_t Õâ¸ö¶ÓÁаüº¬Á˼ÓÔØµÄÄÚºËÄ£¿é£¬×¢ÒâÕâ¸öÄ£¿é¶ÓÁÐÇø±ðÓÚlinker_files¶ÓÁУ¬Õâ¶ÔÓÚÒþ²ØÄ£¿éºÜÖØÒª

»¹ÊÇÄǾ仰£¬×îºÃµÄÎĵµ¾ÍÊÇkernel source

2.3 ¶ÁдÄÚºËÄÚ´æ

Ä£¿é²¢²»ÊÇΨһµÄÐÞ¸ÄÄں˵Ä;¾¶£¬ÎÒÃÇ»¹¿ÉÒÔÖ±½ÓÐÞ¸ÄÄں˿ռäͨ¹ý/dev/kmem¡£

2.3.1. ²éÕÒÒ»¸ö·ûºÅµÄµØÖ·
µ±Äã´¦ÀíÄÚºËÄÚ´æÊ±£¬ÄãÊ×ÏȸÐÐËȤµÄÊÇÓÃÀ´¶ÁдµÄ·ûºÅµÄÕýÈ·µÄµØÖ·£¨±ÈÈ纯Êý£¬±äÁ¿£©£¬ÔÚfreebsdÖРº¯ÊýFvm(3)ÌṩÁËһЩÓÐ
ÓõĵŦÄÜÇë²Î¿¼manpage²éѯ¾ßÌåµÄÓ÷¨£¬ÏÂÃæ¸ø³öÒ»¸öÀý×Ó¶Áȡָ¶¨µÄ·ûºÅµÄµØÖ· ÔÚCY °üÖпÉÒÔÕÒµ½ tools/findsym.c. 

[...]
    char errbuf[_POSIX2_LINE_MAX];
    kvm_t *kd;
    struct nlist nl[] = { { NULL }, { NULL }, };

    nl[0].n_name = argv[1];

    kd = kvm_openfiles(NULL,NULL,NULL,O_RDONLY,errbuf);
    if(!kd) {
        fprintf(stderr,"ERROR: %sn",errbuf);
        exit(-1);
    }

    if(kvm_nlist(kd,nl) < 0) {
        fprintf(stderr,"ERROR: %sn",kvm_geterr(kd));
        exit(-1);
    }

    if(nl[0].n_value) 
        printf("symbol %s is 0x%x at 0x%xn",nl[0].n_name,nl[0].n_type,nl[0].n_value);     
    else 
        printf("%s not foundn",nl[0].n_name);

    if(kvm_close(kd) < 0) {
        fprintf(stderr,"ERROR: %sn",kvm_geterr(kd));
        exit(-1);
    }
    [...]
2.3.2 ¶ÁÊý¾Ý
ÏÖÔÚÄãÕÒµ½ÁËһЩÕýÈ·µÄ·ûºÅµØÖ·£¨±ÈÈç˵º¯Êý£¬±äÁ¿£©£¬Äã¿ÉÄÜÏëÒª¶ÁһЩÊý¾Ý£¬ÀûÓú¯Êýkvm_read £¬´úÂëtools/kvmread.c
ºÍtools/listprocs.cÌṩÁËÒ»¸öÀý×Ó¡ LinuxÁªÃËÊÕ¼¯ÕûÀí ,תÌùÇë±êÃ÷ԭʼÁ´½Ó,ÈçÓÐÈκÎÒÉÎÊ»¶Ó­À´±¾Õ¾LinuxÂÛ̳ÌÖÂÛ
·ÖÒ³£º[1] 2 3 4 5 6 7
¡¾ÆÀÂÛ¡¿¡¾¼ÓÈëÊղؼС¿¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿¡¾¹Ø±Õ¡¿
¡ù Ïà¹ØÁ´½Ó
ÎÞÏà¹ØÐÅÏ¢