日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
網(wǎng)絡(luò)安全編程:內(nèi)核驅(qū)動(dòng)進(jìn)程遍歷

 內(nèi)核驅(qū)動(dòng)在安全方面占據(jù)重要的地位。本文實(shí)現(xiàn)一個(gè)枚舉進(jìn)程的函數(shù)。枚舉進(jìn)程不能在用戶態(tài)下進(jìn)行,需要到內(nèi)核態(tài)下進(jìn)行,這樣就必須使用驅(qū)動(dòng)程序來(lái)完成。先用WinDbg完成一次手動(dòng)的枚舉過(guò)程,再通過(guò)代碼來(lái)完成。

成都創(chuàng)新互聯(lián)公司為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站制作、網(wǎng)站建設(shè)、手機(jī)APP定制開(kāi)發(fā)、小程序開(kāi)發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷(xiāo)能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

1. 配置VMware和WinDbg進(jìn)行驅(qū)動(dòng)調(diào)試

使用WinDbg調(diào)試驅(qū)動(dòng)程序或內(nèi)核,需要雙機(jī)進(jìn)行調(diào)試。所謂雙機(jī),就是兩臺(tái)電腦。通常情況下,大部分人往往只有一臺(tái)電腦。那么,解決的方法就是安裝虛擬機(jī),然后對(duì)虛擬機(jī)進(jìn)行一些設(shè)置,也是可以通過(guò)WinDbg進(jìn)行調(diào)試的。虛擬機(jī)選擇使用VMware,下面介紹如何對(duì)虛擬機(jī)進(jìn)行配置。

安裝好VMware,并在VMware中安裝好操作系統(tǒng),然后對(duì)安裝好的虛擬機(jī)進(jìn)行一些設(shè)置。通過(guò)此設(shè)置可以達(dá)到調(diào)試器與虛擬機(jī)的連接。單擊菜單“VM”→“Settings”命令,彈出“Virtual Machine Settings”對(duì)話框,如圖1所示。

圖1  “Virtual Machine Settings”對(duì)話框

單擊“Add”按鈕,打開(kāi)“Add Hardware Wizard”(添加硬件向?qū)В?duì)話框,如圖2所示。

圖2  “Add Hardware Wizard”對(duì)話框1

在該對(duì)話框中選擇“Serial Port”選項(xiàng),也就是串口,然后單擊“Next”按鈕,彈出“Add Hardware Wizard”對(duì)話框的第二個(gè)界面,如圖3所示。

圖3  “Add Hardware Wizard”對(duì)話框2

在該界面中選擇“Output to named pipe”單選按鈕,也就是命名管道。命名管道是Windows下進(jìn)程通信的一種方法。選中該項(xiàng)后繼續(xù)單擊“Next”按鈕,進(jìn)入下一個(gè)界面,也是設(shè)置的最后一個(gè)界面,如圖4所示。

圖4  “Add Hardware Wizard”對(duì)話框3

在這個(gè)界面中對(duì)命名管道進(jìn)行設(shè)置,然后單擊“Finish”按鈕即可。至此,已經(jīng)完成了一半的設(shè)置。接著,啟動(dòng)虛擬機(jī)配置Windows的Boot.ini文件。Boot.ini文件原內(nèi)容如下:

 
 
 
  1. [boot loader]  
  2. timeout=30  
  3. default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS  
  4. [operating systems]  
  5. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fa 
  6. stdetect /NoExecute=AlwaysOff 

將最后一行復(fù)制,然后放到最后面,并進(jìn)行修改。修改后的內(nèi)容如下:

 
 
 
  1. [boot loader]  
  2. timeout=30  
  3. default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS  
  4. [operating systems]  
  5. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fa  
  6. stdetect /NoExecute=AlwaysOff  
  7. multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fa  
  8. stdetect /NoExecute=optin /debug /debugport=com1 /baudrate=115200 

去掉Boot.ini文件的只讀屬性,然后保存Boot.ini文件。在下次需要對(duì)驅(qū)動(dòng)進(jìn)行調(diào)試,或者對(duì)內(nèi)核進(jìn)行調(diào)試時(shí),選擇啟動(dòng)Debug模式的Windows。

這里只介紹了針對(duì)Windows XP系統(tǒng)的配置方法。關(guān)于其他版本系統(tǒng)的配置方法,請(qǐng)自行參考相關(guān)內(nèi)容。

至此,所有的配置工作都做好了,但是使用WinDbg進(jìn)行連接時(shí),還是要有連接參數(shù)的。先在桌面上創(chuàng)建一個(gè)WinDbg的快捷方式,然后在WinDbg快捷方式上單擊右鍵,在彈出的快捷菜單中選擇“屬性”命令,彈出“屬性”對(duì)話框,將“目標(biāo)”位置改為:

 
 
 
  1. F:\WinDDK\7600.16385.0\Debuggers\windbg.exe -b -k com:port=\\.\pipe\com_1,baud= 115200,pipe 

這樣就可以用WinDbg連接虛擬機(jī)中調(diào)試狀態(tài)下的Windows XP了。

2. EPROCESS和手動(dòng)遍歷進(jìn)程

Windows中有一個(gè)非常大的與進(jìn)程有關(guān)的結(jié)構(gòu)體——EPROCESS。每個(gè)進(jìn)程對(duì)應(yīng)一個(gè)EPROCESS結(jié)構(gòu),但EPROCESS是一個(gè)系統(tǒng)未公開(kāi)的結(jié)構(gòu)體,在WDK中只能找到說(shuō)明,而找不到其結(jié)構(gòu)體的具體定義,因此需要通過(guò)WinDbg來(lái)查看。這次使用WinDbg和VMware進(jìn)行調(diào)試。按照前面的方法,使WinDbg和VMware可以連接。當(dāng)WinDbg出現(xiàn)調(diào)試界面時(shí),在其命令處輸入dt _eprocess命令來(lái)查看該結(jié)構(gòu)體,如圖5所示。

圖5  WinDbg顯示的部分EPROCESS結(jié)構(gòu)體

從圖中可以看出,EPROCESS結(jié)構(gòu)體顯示出非常多的內(nèi)容,從WinDbg調(diào)試界面只能看到部分成員變量,而且偏移已經(jīng)到了0x258,非常多??匆幌耊inDbg的全部?jī)?nèi)容。

 
 
 
  1. kd> dt _eprocess  
  2. nt!_EPROCESS  
  3.  +0x000 Pcb : _KPROCESS // 進(jìn)程控制塊  
  4.  +0x06c ProcessLock : _EX_PUSH_LOCK  
  5.  +0x070 CreateTime : _LARGE_INTEGER  
  6.  +0x078 ExitTime : _LARGE_INTEGER  
  7.  +0x080 RundownProtect : _EX_RUNDOWN_REF  
  8.  +0x084 UniqueProcessId : Ptr32 Void // 進(jìn)程 ID  
  9.  +0x088 ActiveProcessLinks : _LIST_ENTRY // 活動(dòng)進(jìn)程鏈表  
  10.  +0x090 QuotaUsage : [3] Uint4B 
  11.  +0x09c QuotaPeak : [3] Uint4B  
  12.  +0x0a8 CommitCharge : Uint4B  
  13.  +0x0ac PeakVirtualSize : Uint4B  
  14.  +0x0b0 VirtualSize : Uint4B  
  15.  +0x0b4 SessionProcessLinks : _LIST_ENTRY  
  16.  +0x0bc DebugPort : Ptr32 Void  
  17.  +0x0c0 ExceptionPort : Ptr32 Void  
  18.  +0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE  
  19.  +0x0c8 Token : _EX_FAST_REF  
  20.  +0x0cc WorkingSetLock : _FAST_MUTEX  
  21.  +0x0ec WorkingSetPage : Uint4B  
  22.  +0x0f0 AddressCreationLock : _FAST_MUTEX  
  23.  +0x110 HyperSpaceLock : Uint4B  
  24.  +0x114 ForkInProgress : Ptr32 _ETHREAD  
  25.  +0x118 HardwareTrigger : Uint4B  
  26.  +0x11c VadRoot : Ptr32 Void  
  27.  +0x120 VadHint : Ptr32 Void  
  28.  +0x124 CloneRoot : Ptr32 Void  
  29.  +0x128 NumberOfPrivatePages : Uint4B  
  30.  +0x12c NumberOfLockedPages : Uint4B  
  31.  +0x130 Win32Process : Ptr32 Void  
  32.  +0x134 Job : Ptr32 _EJOB  
  33.  +0x138 SectionObject : Ptr32 Void  
  34.  +0x13c SectionBaseAddress : Ptr32 Void  
  35.  +0x140 QuotaBlock : Ptr32 _EPROCESS_QUOTA_BLOCK  
  36.  +0x144 WorkingSetWatch : Ptr32 _PAGEFAULT_HISTORY  
  37.  +0x148 Win32WindowStation : Ptr32 Void 
  38.  +0x14c InheritedFromUniqueProcessId : Ptr32 Void  
  39.  +0x150 LdtInformation : Ptr32 Void  
  40.  +0x154 VadFreeHint : Ptr32 Void  
  41.  +0x158 VdmObjects : Ptr32 Void  
  42.  +0x15c DeviceMap : Ptr32 Void  
  43.  +0x160 PhysicalVadList : _LIST_ENTRY  
  44.  +0x168 PageDirectoryPte : _HARDWARE_PTE  
  45.  +0x168 Filler : Uint8B  
  46.  +0x170 Session : Ptr32 Void  
  47.  +0x174 ImageFileName : [16] UChar // 進(jìn)程名  
  48.  +0x184 JobLinks : _LIST_ENTRY  
  49.  +0x18c LockedPagesList : Ptr32 Void  
  50.  +0x190 ThreadListHead : _LIST_ENTRY  
  51.  +0x198 SecurityPort : Ptr32 Void  
  52.  +0x19c PaeTop : Ptr32 Void  
  53.  +0x1a0 ActiveThreads : Uint4B  
  54.  +0x1a4 GrantedAccess : Uint4B  
  55.  +0x1a8 DefaultHardErrorProcessing : Uint4B  
  56.  +0x1ac LastThreadExitStatus : Int4B  
  57.  +0x1b0 Peb : Ptr32 _PEB // 進(jìn)程環(huán)境塊 
  58.  +0x1b4 PrefetchTrace : _EX_FAST_REF  
  59.  +0x1b8 ReadOperationCount : _LARGE_INTEGER  
  60.  +0x1c0 WriteOperationCount : _LARGE_INTEGER  
  61.  +0x1c8 OtherOperationCount : _LARGE_INTEGER  
  62.  +0x1d0 ReadTransferCount : _LARGE_INTEGER  
  63.  +0x1d8 WriteTransferCount : _LARGE_INTEGER  
  64.  +0x1e0 OtherTransferCount : _LARGE_INTEGER  
  65.  +0x1e8 CommitChargeLimit : Uint4B  
  66.  +0x1ec CommitChargePeak : Uint4B  
  67.  +0x1f0 AweInfo : Ptr32 Void  
  68.  +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO  
  69.  +0x1f8 Vm : _MMSUPPORT  
  70.  +0x238 LastFaultCount : Uint4B  
  71.  +0x23c ModifiedPageCount : Uint4B  
  72.  +0x240 NumberOfVads : Uint4B  
  73.  +0x244 JobStatus : Uint4B  
  74.  +0x248 Flags : Uint4B  
  75.  +0x248 CreateReported : Pos 0, 1 Bit  
  76.  +0x248 NoDebugInherit : Pos 1, 1 Bit  
  77.  +0x248 ProcessExiting : Pos 2, 1 Bit  
  78.  +0x248 ProcessDelete : Pos 3, 1 Bit  
  79.  +0x248 Wow64SplitPages : Pos 4, 1 Bit  
  80.  +0x248 VmDeleted : Pos 5, 1 Bit  
  81.  +0x248 OutswapEnabled : Pos 6, 1 Bit  
  82.  +0x248 Outswapped : Pos 7, 1 Bit  
  83.  +0x248 ForkFailed : Pos 8, 1 Bit  
  84.  +0x248 HasPhysicalVad : Pos 9, 1 Bit  
  85.  +0x248 AddressSpaceInitialized : Pos 10, 2 Bits  
  86.  +0x248 SetTimerResolution : Pos 12, 1 Bit  
  87.  +0x248 BreakOnTermination : Pos 13, 1 Bit  
  88.  +0x248 SessionCreationUnderway : Pos 14, 1 Bit  
  89.  +0x248 WriteWatch : Pos 15, 1 Bit  
  90.  +0x248 ProcessInSession : Pos 16, 1 Bit  
  91.  +0x248 OverrideAddressSpace : Pos 17, 1 Bit  
  92.  +0x248 HasAddressSpace : Pos 18, 1 Bit  
  93.  +0x248 LaunchPrefetched : Pos 19, 1 Bit  
  94.  +0x248 InjectInpageErrors : Pos 20, 1 Bit 
  95.  +0x248 VmTopDown : Pos 21, 1 Bit  
  96.  +0x248 Unused3 : Pos 22, 1 Bit  
  97.  +0x248 Unused4 : Pos 23, 1 Bit  
  98.  +0x248 VdmAllowed : Pos 24, 1 Bit  
  99.  +0x248 Unused : Pos 25, 5 Bits  
  100.  +0x248 Unused1 : Pos 30, 1 Bit  
  101.  +0x248 Unused2 : Pos 31, 1 Bit  
  102.  +0x24c ExitStatus : Int4B  
  103.  +0x250 NextPageColor : Uint2B  
  104.  +0x252 SubSystemMinorVersion : UChar  
  105.  +0x253 SubSystemMajorVersion : UChar  
  106.  +0x252 SubSystemVersion : Uint2B  
  107.  +0x254 PriorityClass : UChar  
  108.  +0x255 WorkingSetAcquiredUnsafe : UChar  
  109.  +0x258 Cookie : Uint4B 

上面就是EPROCESS結(jié)構(gòu)體的全部。對(duì)于遍歷進(jìn)程列表來(lái)說(shuō),有用的只有幾個(gè)內(nèi)容,首先是偏移0x84處的進(jìn)程ID,然后是偏移0x88處的進(jìn)程鏈表,最后一個(gè)是偏移0x174的進(jìn)程名。下面手動(dòng)進(jìn)行一次遍歷。

在WinDbg的命令輸入提示處輸入! Process 0 0命令,得到進(jìn)程的列表,如圖6所示。

圖6  進(jìn)程信息

PROCESS后面給出的值就是當(dāng)前進(jìn)程中EPROCESS的地址,選擇explorer.exe進(jìn)程給出的地址0xff364708來(lái)解析EPROCESS。輸入命令dt _eprocess ff364708,輸出如下:

 
 
 
  1. kd> dt _eprocess ff364708  
  2. nt!_EPROCESS  
  3.  +0x000 Pcb : _KPROCESS  
  4.  +0x06c ProcessLock : _EX_PUSH_LOCK  
  5.  +0x070 CreateTime : _LARGE_INTEGER 0x1cb6af5`91d56cea  
  6.  +0x078 ExitTime : _LARGE_INTEGER 0x0  
  7.  +0x080 RundownProtect : _EX_RUNDOWN_REF  
  8.  +0x084 UniqueProcessId : 0x00000600  
  9.  +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0xff2b44b0 - 0xff3640a8 ]  
  10.  <部分省略>  
  11.  +0x174 ImageFileName : [16] "explorer.exe"  
  12.  <部分省略>  
  13.  +0x1b0 Peb : 0x7ffde000 _PEB  
  14.  <后面省略> 

可以看到,按照EPROCESS結(jié)構(gòu)體解析ff364708地址,輸出了需要的內(nèi)容。接著,通過(guò)ActiveProcessLinks獲取下一個(gè)進(jìn)程的信息。輸入命令dd ff364708 + 0x88,輸出如下:

 
 
 
  1. kd> dd ff364708 + 0x88  
  2. ff364790 ff2b44b0 ff3640a8 00002940 00021944  
  3. ff3647a0 00000a92 00003940 00024cb4 00000bf8  
  4. ff3647b0 00000a92 05e04000 0563a000 ff2b44dc  
  5. ff3647c0 ff3640d4 00000000 e15b6eb8 e1ce2640  
  6. ff3647d0 e166f389 00000001 f39a5440 00000000  
  7. ff3647e0 00040001 00000000 ff3647e8 ff3647e8  
  8. ff3647f0 0000003d 000059ca 00000001 f39a5440  
  9. ff364800 00000000 00040001 00000000 ff36480c 

ff364790地址處保存了下一個(gè)EPROCESS結(jié)構(gòu)體ActiveProcessLinks的地址。要得到下一個(gè)EPROCESS的地址,必須減去0x88才行。輸入命令dt _eprocess (ff2b44b0 – 0x88),輸出如下:

 
 
 
  1. kd> dt _eprocess (ff2b44b0 - 0x88)  
  2. nt!_EPROCESS  
  3.  +0x000 Pcb : _KPROCESS  
  4.  +0x06c ProcessLock : _EX_PUSH_LOCK  
  5.  +0x070 CreateTime : _LARGE_INTEGER 0x1cb6af5`95026ecc  
  6.  +0x078 ExitTime : _LARGE_INTEGER 0x0  
  7.  +0x080 RundownProtect : _EX_RUNDOWN_REF  
  8.  +0x084 UniqueProcessId : 0x000006b8  
  9.  +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0xff2b7580 - 0xff364790 ]  
  10.  <后面省略>  
  11.  +0x174 ImageFileName : [16] "VMwareTray.exe"  
  12.  <后面省略> 

將輸出結(jié)果和圖6中的結(jié)果對(duì)比,explorer.exe的下一個(gè)進(jìn)程為VMwareTray.exe??梢?jiàn)遍歷方法是正確的。

3. 編程實(shí)現(xiàn)進(jìn)程遍歷

上面介紹的手動(dòng)遍歷過(guò)程就是指導(dǎo)用戶如何編寫(xiě)代碼的,只要能夠掌握上面的手動(dòng)遍歷過(guò)程,那么代碼的編寫(xiě)也就不是問(wèn)題了。下面直接看代碼:

 
 
 
  1. NTSTATUS DriverEntry(  
  2.   PDRIVER_OBJECT pDriverObject,  
  3.   PUNICODE_STRING pRegistryPath)  
  4. {  
  5.   PEPROCESS pEprocess = NULL;  
  6.   PEPROCESS pFirstEprocess = NULL;  
  7.   ULONG ulProcessName = 0;  
  8.   ULONG ulProcessId = 0;  
  9.   pDriverObject->DriverUnloadDriverUnload = DriverUnload;  
  10.   pEprocess = PsGetCurrentProcess();  
  11.   if ( pEprocess == 0 )  
  12.   {  
  13.     KdPrint(("PsGetcurrentProcess Error ! \r\n"));  
  14.     return STATUS_SUCCESS;  
  15.   }  
  16.   pFirstEprocess = pEprocess;  
  17.   while ( pEprocess != NULL )  
  18.   {  
  19.     ulProcessName = (ULONG)pEprocess + 0x174;  
  20.     ulProcessId = *(ULONG *)((ULONG)pEprocess + 0x84);  
  21.     KdPrint(("ProcessName = %s, ProcessId = %d \r\n", ulProcessName, ulProcessId));  
  22.     pEprocess = (ULONG)( *(ULONG *)((ULONG)pEprocess + 0x88) - 0x88);  
  23.     if ( pEprocess == pFirstEprocess || (*(LONG *)((LONG)pEprocess + 0x84)) < 0 )  
  24.     {  
  25.       break ;  
  26.     }  
  27.   }  
  28.   return STATUS_SUCCESS;  
  29. }  

代碼中用到了一個(gè)函數(shù),就是PsGetCurrentProcess()。這個(gè)函數(shù)是用來(lái)獲取當(dāng)前進(jìn)程的EPROCESS指針的,其定義如下:

 
 
 
  1. PEPROCESS PsGetCurrentProcess(VOID); 

通過(guò)PsGetCurrentProcess()函數(shù)獲得的是system進(jìn)程的EPROCESS,大多數(shù)內(nèi)核模式系統(tǒng)線程都在system進(jìn)程中。除了這個(gè)函數(shù)沒(méi)有接觸過(guò)以外,剩下的部分就是對(duì)EPROCESS結(jié)構(gòu)體的操作,這里不做過(guò)多的介紹。實(shí)現(xiàn)進(jìn)程內(nèi)DLL文件的隱藏方法是將指定DLL在DLL鏈表中“脫鏈”。為了隱藏進(jìn)程,同樣可以將指定進(jìn)程的EPROCESS結(jié)構(gòu)體在進(jìn)程鏈表中“脫鏈”,以達(dá)到隱藏的目的。


當(dāng)前名稱:網(wǎng)絡(luò)安全編程:內(nèi)核驅(qū)動(dòng)進(jìn)程遍歷
轉(zhuǎn)載來(lái)源:http://www.5511xx.com/article/dppjgsg.html