• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            ring0檢測(cè)隱藏進(jìn)程

             題: 【原創(chuàng)】ring0檢測(cè)隱藏進(jìn)程
            作 者: 墮落天才
            時(shí) 間: 2007-05-10,13:28
            鏈 接: http://bbs.pediy.com/showthread.php?t=44243


            //網(wǎng)上得到一篇好文章 Ring0下搜索內(nèi)存枚舉隱藏進(jìn)程 ,但是拿里面的代碼來使用的時(shí)候發(fā)現(xiàn)并沒有太多效果
            //于是修改之,終于實(shí)現(xiàn)了最初的目標(biāo)
            //由于直接搜索內(nèi)存,跟系統(tǒng)調(diào)度沒什么關(guān)系,所以能夠枚舉到各種方法隱藏的進(jìn)程 包括斷鏈、抹PspCidTable... 
            //甚至能枚舉到已經(jīng)"死掉"的進(jìn)程,本程序通過進(jìn)程的ExitTime來判斷進(jìn)程是不是已經(jīng)結(jié)束
            //除非能夠把EProcess結(jié)構(gòu)修改掉,但這個(gè)實(shí)現(xiàn)難度可能比較大,不知有沒有哪位大俠試過(PID我修改過),歡迎討論
            //
            //作者:墮落天才
            //時(shí)間:2007年5月10日
            //參考: uty  Ring0下搜索內(nèi)存枚舉隱藏進(jìn)程 http://www.cnxhacker.net/Article/show/3412.html
            //下面代碼在XP SP2測(cè)試通過
            #include<ntddk.h>

            ///////////////////////////不同的windows版本下面的偏移值不同
            #define  EPROCESS_SIZE       0x25C //EPROCESS結(jié)構(gòu)大小

            #define  PEB_OFFSET          0x1B0
            #define  FILE_NAME_OFFSET    0x174
            #define  PROCESS_LINK_OFFSET 0x088
            #define  PROCESS_ID_OFFSET   0x084
            #define  EXIT_TIME_OFFSET    0x078

            #define  OBJECT_HEADER_SIZE  0x018
            #define  OBJECT_TYPE_OFFSET  0x008

            #define PDE_INVALID 2 
            #define PTE_INVALID 1 
            #define VALID 0 


            ULONG     pebAddress;         
            //PEB地址的前半部分
            PEPROCESS pSystem;            //system進(jìn)程
            ULONG     pObjectTypeProcess; //進(jìn)程對(duì)象類型

            ULONG   VALIDpage(ULONG addr) ;  
            //該函數(shù)直接復(fù)制自 Ring0下搜索內(nèi)存枚舉隱藏進(jìn)程
            BOOLEAN IsaRealProcess(ULONG i); //該函數(shù)復(fù)制自 Ring0下搜索內(nèi)存枚舉隱藏進(jìn)程
            VOID    WorkThread(IN PVOID pContext);
            ULONG   GetPebAddress();          
            //得到PEB地址前半部分
            VOID    EnumProcess();            //枚舉進(jìn)程
            VOID    ShowProcess(ULONG pEProcess); //顯示結(jié)果

            VOID    OnUnload(IN PDRIVER_OBJECT DriverObject)
            {
            }

            NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
            {
              HANDLE hThread; 

              DriverObject 
            -> DriverUnload = OnUnload;

              pSystem    
            = PsGetCurrentProcess();
              pebAddress 
            = GetPebAddress();
              pObjectTypeProcess 
            = *(PULONG)((ULONG)pSystem - OBJECT_HEADER_SIZE +OBJECT_TYPE_OFFSET);  

              PsCreateSystemThread(
            &hThread, 
                (ACCESS_MASK)
            0
                NULL, 
                (HANDLE)
            0
                NULL, 
                WorkThread, 
                NULL ); 

              
            return STATUS_SUCCESS;
            }

            //////////////////////////////////////////////
            VOID WorkThread(IN PVOID pContext) 

              EnumProcess();
              PsTerminateSystemThread(STATUS_SUCCESS);  
            }

            ////////////////////////////////////////////////////////
            ULONG  GetPebAddress()
            {
              ULONG Address;
              PEPROCESS pEProcess;

                    
            //由于system進(jìn)程的peb總是零 我們只有到其他進(jìn)程去找了
              pEProcess = (PEPROCESS)((ULONG)((PLIST_ENTRY)((ULONG)pSystem + PROCESS_LINK_OFFSET))->Flink - PROCESS_LINK_OFFSET);
              Address   
            = *(PULONG)((ULONG)pEProcess + PEB_OFFSET);

              
            return (Address & 0xFFFF0000);  
            }

            ///////////////////////////////////////////////////////
            VOID EnumProcess()
            {
              ULONG  uSystemAddress 
            = (ULONG)pSystem;
              ULONG  i;
              ULONG  Address;
              ULONG  ret;

              DbgPrint(
            "-------------------------------------------");
              DbgPrint(
            "EProcess    PID    ImageFileName");
              DbgPrint(
            "---------------------------------");
              

              
            for(i = 0x80000000; i < uSystemAddress; i += 4){//system進(jìn)程的EPROCESS地址就是最大值了
                ret = VALIDpage(i); 
                
            if (ret == VALID)
                  Address 
            = *(PULONG)i;
                  
            if (( Address & 0xFFFF0000== pebAddress){//每個(gè)進(jìn)程的PEB地址都是在差不多的地方,地址前半部分是相同的       
                    if(IsaRealProcess(i))
                      ShowProcess(i 
            - PEB_OFFSET);  
                       i 
            += EPROCESS_SIZE;                
                    }
             
                  }
             
                }
            else if(ret == PTE_INVALID)
                  i 
            -=4
                  i 
            += 0x1000;//4k 
                }
            else
                  i
            -=4
                  i
            += 0x400000;//4mb 
                }
             
              }


              ShowProcess(uSystemAddress);
            //system的PEB總是零 上面的方法是枚舉不到的 不過我們用PsGetCurrentProcess就能得到了
              DbgPrint("-------------------------------------------");
              
            }

            /////////////////////////////////////////////////////////
            VOID    ShowProcess(ULONG pEProcess)
            {
              PLARGE_INTEGER ExitTime;
              ULONG PID;
              PUCHAR pFileName;
              
              ExitTime 
            = (PLARGE_INTEGER)(pEProcess + EXIT_TIME_OFFSET);  
              
            if(ExitTime->QuadPart != 0//已經(jīng)結(jié)束的進(jìn)程的ExitTime為非零
                return ;

              PID 
            = *(PULONG)(pEProcess + PROCESS_ID_OFFSET);
              pFileName 
            = (PUCHAR)(pEProcess + FILE_NAME_OFFSET);

              DbgPrint(
            "0x%08X  %04d   %s",pEProcess,PID,pFileName);
            }

            /////////////////////////////////////////////////////////////
            ULONG VALIDpage(ULONG addr) 

              ULONG pte; 
              ULONG pde; 
              
              pde 
            = 0xc0300000 + (addr>>22)*4
              
            if((*(PULONG)pde & 0x1!= 0)
                
            //large page 
                if((*(PULONG)pde & 0x80!= 0)
                  
            return VALID; 
                }
             
                pte 
            = 0xc0000000 + (addr>>12)*4
                
            if((*(PULONG)pte & 0x1!= 0)
                  
            return VALID; 
                }
            else
                  
            return PTE_INVALID; 
                }
             
              }
             
              
            return PDE_INVALID; 
            }
             
            ////////////////////////////////////////////////////////////////
            BOOLEAN IsaRealProcess(ULONG i) 

              NTSTATUS STATUS; 
              PUNICODE_STRING pUnicode; 
              UNICODE_STRING Process; 
              ULONG pObjectType; 
              ULONG ObjectTypeAddress; 
              
              
            if (VALIDpage(i- PEB_OFFSET) != VALID)
                
            return FALSE; 
              }
             

              ObjectTypeAddress 
            = i - PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET ;
              
              
            if (VALIDpage(ObjectTypeAddress) == VALID)
                pObjectType 
            = *(PULONG)ObjectTypeAddress; 
              }
            else
                
            return FALSE; 
              }
             
              
              
            if(pObjectTypeProcess == pObjectType)//確定ObjectType是Process類型
                return TRUE; 
              }
             
              
            return FALSE; 

            }
             

            posted on 2011-01-31 11:37 楊粼波 閱讀(1165) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久午夜伦鲁片免费无码| 亚洲一区中文字幕久久| 婷婷五月深深久久精品| 久久99热狠狠色精品一区| 一级a性色生活片久久无 | 日韩亚洲欧美久久久www综合网| 99久久精品无码一区二区毛片| 久久人人爽人人人人爽AV| 香港aa三级久久三级| 欧美喷潮久久久XXXXx| 日日狠狠久久偷偷色综合免费| 久久亚洲私人国产精品| 香蕉久久久久久狠狠色| 久久青草国产精品一区| 国产产无码乱码精品久久鸭| 国产99久久久国产精品小说| 国产精品欧美久久久久无广告 | 日本欧美久久久久免费播放网 | 色综合久久中文字幕无码| 久久男人中文字幕资源站| 日韩精品久久久久久| 久久国产欧美日韩精品| 久久久国产打桩机| 久久九九兔免费精品6| 久久久久九九精品影院| 久久精品国产只有精品66| 99久久伊人精品综合观看| 91视频国产91久久久| 国产午夜久久影院| 久久久久久久尹人综合网亚洲 | 久久AV高清无码| 国产精品无码久久久久久| 精品久久久无码人妻中文字幕豆芽 | 久久久久亚洲AV综合波多野结衣 | 思思久久99热只有频精品66| 色8激情欧美成人久久综合电| 久久亚洲国产成人影院网站| 日韩中文久久| 久久精品国产亚洲av水果派| 99久久国产综合精品麻豆| 国产精品免费久久|