24小时黑客接单的网站

黑客业务,怎么找黑客,联系黑客,黑客服务,免费黑客服务QQ

网络安全编程:内核驱动进程遍历

核心驱动在安全方面起着重要作用。本文实现了枚举过程的函数。枚举过程不能在用户状态下进行,需要在内核状态下进行,因此必须使用驱动程序来完成。首先使用它WinDbg完成手动枚举过程,然后通过代码完成。

1. 配置VMware和WinDbg驱动调试

使用WinDbg调试驱动程序或内核需要双机调试。所谓双机,就是两台电脑。通常大多数人只有一台电脑。然后,解决办法是安装虚拟机,然后设置一些虚拟机,也可以通过WinDbg调试。选择使用虚拟机。VMware,以下是如何配置虚拟机。

安装好VMware,并在VMware安装操作系统,然后设置安装的虚拟机。调试器与虚拟机的连接可以通过此设置实现。单击菜单“VM”→“Settings”命令,弹出“Virtual Machine Settings”如图1所示,对话框。

图1 “Virtual Machine Settings”对话框

单击“Add”按钮,打开“Add Hardware Wizard”(添加硬件导向)对话框,如图2所示。

图2 “Add Hardware Wizard”对话框1

在该对话框中选择“Serial Port”选项,即串口,然后单击“Next”按钮,弹出“Add Hardware Wizard”如图3所示,对话框的第二个界面。

图3 “Add Hardware Wizard”对话框2

选择界面“Output to named pipe”单选按钮,即命名管道。命名管道是Windows下一个过程通信的方法。选择项目后,继续单击“Next”按钮,进入下一个界面,也是设置的最后一个界面,如图4所示。

图4 “Add Hardware Wizard”对话框3

在此界面设置命名管,然后单击“Finish”按钮。到目前为止,设置的一半已经完成。然后,启动虚拟机配置Windows的Boot.ini文件。Boot.ini文件原内容如下:

  • [bootloader]
  • timeout=30
  • default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
  • [operatingsystems]
  • multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindowsXPProfessional"/fa
  • stdetect/NoExecute=AlwaysOff
  • 复制最后一行,放在最后,修改。修改后的内容如下:

  • [bootloader]
  • timeout=30
  • default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
  • [operatingsystems]
  • multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindowsXPProfessional"/fa
  • stdetect/NoExecute=AlwaysOff
  • multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindowsXPProfessional"/fa
  • stdetect/NoExecute=optin/debug/debugport=com1/baudrate=115200
  • 去掉Boot.ini文件的只读属性,然后保存Boot.ini文件。下次需要调试驱动或内核时,选择启动Debug模式的Windows。

    这里只介绍针对性Windows XP系统配置方法。请参考其他版本系统的配置方法。

    到目前为止,所有的配置工作都已经完成,但是已经使用了WinDbg连接时,应有连接参数。首先在桌面上创建一个WinDbg然后在那里WinDbg单击右键,选择弹出的快捷菜单“属性”命令,弹出“属性”对话框,将“目标”位置改为:

  • F:\WinDDK\7600.16385.0\Debuggers\windbg.exe-b-kcom:port=\\.\pipe\com_1,baud=115200,pipe
  • 这样就可以用了WinDbg在连接虚拟机中调试状态下Windows XP了。

    2. EPROCESS手动遍历过程

    Windows与过程相关的结构体非常大——EPROCESS。每个过程对应一个EPROCESS结构,但EPROCESS它是系统中未开放的结构体WDK只能找到解释,但找不到其结构的具体定义,需要通过WinDbg来看看。这次使用WinDbg和VMware调试。按照前面的方法,制作WinDbg和VMware可连接WinDbg调试界面出现时,输入其命令dt _eprocess命令查看结构体,如图5所示。

    图5 WinDbg显示的部分EPROCESS结构体

    从图中可以看出,EPROCESS从WinDbg调试界面只能看到部分成员变量,偏移已经到了0x258,很多。看一看WinDbg所有内容。

  • kd>dt_eprocess
  • nt!_EPROCESS
  •    0x000Pcb:_KPROCESS///进程控制块
  •    0x06cProcessLock:_EX_PUSH_LOCK
  •    0x070CreateTime:_LARGE_INTEGER
  •    0x078ExitTime:_LARGE_INTEGER
  •    0x080RundownProtect:_EX_RUNDOWN_REF
  •    0x084UniqueProcessId:Ptr32Void//进程ID
  •    0x088ActiveProcessLinks:_LIST_ENTRY//活动进程链表
  •    0x090QuotaUsage:[3]Uint4B
  •    0x09cQuotaPeak:[3]Uint4B
  •    0x0a8CommitCharge:Uint4B
  •    0x0acPeakVirtualSize:Uint4B
  •    0x0b0VirtualSize:Uint4B
  •    0x0b4SessionProcessLinks:_LIST_ENTRY
  •    0x0bcDebugPort:Ptr32Void
  •    0x0c0ExceptionPort:Ptr32Void
  •    0x0c4ObjectTable:Ptr32_HANDLE_TABLE
  •    0x0c8Token:_EX_FAST_REF
  •    0x0ccWorkingSetLock:_FAST_MUTEX
  •    0x0ecWorkingSetPage:Uint4B
  •    0x0f0AddressCreationLock:_FAST_MUTEX
  •    0x110HyperSpaceLock:Uint4B
  •    0x114ForkInProgress:Ptr32_ETHREAD
  •    0x118HardwareTrigger:Uint4B
  •    0x11cVadRoot:Ptr32Void
  •    0x120VadHint:Ptr32Void
  •    0x124CloneRoot:Ptr32Void
  •    0x128NumberOfPrivatePages:Uint4B
  •    0x12cNumberOfLockedPages:Uint4B
  •    0x130Win32Process:Ptr32Void
  •    0x134Job:Ptr32_EJOB
  •    0x138SectionObject:Ptr32Void
  •    0x13cSectionBaseAddress:Ptr32Void
  •    0x140QuotaBlock:Ptr32_EPROCESS_QUOTA_BLOCK
  •    0x144WorkingSetWatch:Ptr32_PAGEFAULT_HISTORY
  •    0x148Win32WindowStation:Ptr32Void
  •    0x14cInheritedFromUniqueProcessId:Ptr32Void
  •    0x150LdtInformation:Ptr32Void
  •    0x154VadFreeHint:Ptr32Void
  •    0x158VdmObjects:Ptr32Void
  •    0x15cDeviceMap:Ptr32Void
  •    0x160PhysicalVadList:_LIST_ENTRY
  •    0x168PageDirectoryPte:_HARDWARE_PTE
  •    0x168Filler:Uint8B
  •    0x170Session:Ptr32Void
  •    0x174ImageFileName:[16]UChar//进程名
  •    0x184JobLinks:_LIST_ENTRY
  •    0x18cLockedPagesList:Ptr32Void
  •    0x190ThreadListHead:_LIST_ENTRY
  •    0x198SecurityPort:Ptr32Void
  •    0x19cPaeTop:Ptr32Void
  •    0x1a0ActiveThreads:Uint4B
  •    0x1a4GrantedAccess:Uint4B
  •    0x1a8DefaultHardErrorProcessing:Uint4B
  •    0x1acLastThreadExitStatus:Int4B
  •    0x1b0Peb:Ptr32_PEB//进程环境块
  •    0x1b4PrefetchTrace:_EX_FAST_REF
  •    0x1b8ReadOperationCount:_LARGE_INTEGER
  •    0x1c0WriteOperationCount:_LARGE_INTEGER
  •    0x1c8OtherOperationCount:_LARGE_INTEGER
  •    0x1d0ReadTransferCount:_LARGE_INTEGER
  •    0x1d8WriteTransferCount:_LARGE_INTEGER
  •    0x1e0OtherTransferCount:_LARGE_INTEGER
  •    0x1e8CommitChargeLimit:Uint4B
  •    0x1ecCommitChargePeak:Uint4B
  •    0x1f0AweInfo:Ptr32Void
  •    0x1f4SeAuditProcessCreationInfo:_SE_AUDIT_PROCESS_CREATION_INFO
  •    0x1f8Vm:_MMSUPPORT
  •    0x238LastFaultCount:Uint4B
  •    0x23cModifiedPageCount:Uint4B
  •    0x240NumberOfVads:Uint4B
  •    0x244JobStatus:Uint4B
  •    0x248Flags:Uint4B
  •    0x248CreateReported:Pos0,1Bit
  •    0x248NoDebugInherit:Pos1,1Bit
  •    0x248ProcessExiting:Pos2,1Bit
  •    0x248ProcessDelete:Pos3,1Bit
  •    0x248Wow64SplitPages:Pos4,1Bit
  •    0x248VmDeleted:Pos5,1Bit
  •    0x248OutswapEnabled:Pos6,1Bit
  •    0x248Outswapped:Pos7,1Bit
  •    0x248ForkFailed:Pos8,1Bit
  •    0x248HasPhysicalVad:Pos9,1Bit
  •    0x248AddressSpaceInitialized:Pos10,2Bits
  •    0x248SetTimerResolution:Pos12,1Bit
  •    0x248BreakOnTermination:Pos13,1Bit
  •    0x248SessionCreationUnderway:Pos14,1Bit
  •    0x248WriteWatch:Pos15,1Bit
  •    0x248ProcessInSession:Pos16,1Bit
  •    0x248OverrideAddressSpace:Pos17,1Bit
  •    0x248HasAddressSpace:Pos18,1Bit
  •    0x248LaunchPrefetched:Pos19,1Bit
  •    0x248InjectInpageErrors:Pos20,1Bit
  •    0x248VmTopDown:Pos21,1Bit
  •    0x248Unused3:Pos22,1Bit
  •    0x248Unused4:Pos23,1Bit
  •    0x248VdmAllowed:Pos24,1Bit
  •    0x248Unused:Pos25,5Bits
  •    0x248Unused1:Pos30,1Bit
  •    0x248Unused2:Pos31,1Bit
  •    0x24cExitStatus:Int4B
  •    0x250NextPageColor:Uint2B
  •    0x252SubSystemMinorVersion:UChar
  •    0x253SubSystemMajorVersion:UChar
  •    0x252SubSystemVersion:Uint2B
  •    0x254PriorityClass:UChar
  •    0x255WorkingSetAcquiredUnsafe:UChar
  •    0x258Cookie:Uint4B
  • 上面就是EPROCESS整个结构。对于遍历过程列表,只有几个有用的内容,首先是偏移0x84处的进程ID,然后是偏移0x88最后一个是偏移过程链表0x174流程名。以下是一次手动遍历。

    在WinDbg输入命令输入提示!Process 0 0命令,得到进程列表,如图6所示。

    图6 进程信息

    PROCESS后面给出的值是当前过程中的值EPROCESS地址,选择explorer.exe过程中给出的地址0xff364708来解析EPROCESS。输入命令dt _eprocess ff364708,输出如下:

  • kd>dt_eprocessff364708
  • nt!_EPROCESS
  •    0x000Pcb:_KPROCESS
  •    0x06cProcessLock:_EX_PUSH_LOCK
  •    0x070CreateTime:_LARGE_INTEGER0x1cb6af5`91d56cea
  •    0x078ExitTime:_LARGE_INTEGER0x0
  •    0x080RundownProtect:_EX_RUNDOWN_REF
  •    0x084UniqueProcessId:0x00000600
  •    0x088ActiveProcessLinks:_LIST_ENTRY[0xff2b44b0-0xff3640a8]
  • <部分省略>
  •    0x174ImageFileName:[16]"explorer.exe"
  • <部分省略>
  •    0x1b0Peb:0x7ffde000_PEB
  • <后面省略>
  • 可见,按EPROCESS结构体解析ff364708地址,输出所需内容。然后,通过ActiveProcessLinks获取下一个过程的信息。输入命令dd ff364708 0x88,输出如下:

  • kd>ddff364708 0x88
  • ff364790ff2b44b0ff3640a80000294000021944
  • ff3647a000000a920000394000024cb400000bf8
  • ff3647b000000a9205e040000563a000ff2b44dc
  • ff3647c0ff3640d400000000e15b6eb8e1ce2640
  • ff3647d0e166f38900000001f39a544000000000
  • ff3647e00004000100000000ff3647e8ff3647e8
  • ff3647f00000003d000059ca00000001f39a5440
  • ff364800000000000004000100000000ff36480c
  • ff364790下一个保存在地址处EPROCESS结构体ActiveProcessLinks地址。的地址。EPROCESS必须减去地址0x88是的。输入命令dt _eprocess (ff2b44b0 – 0x88),输出如下:

  • kd>dt_eprocess(ff2b44b0-0x88)
  • nt!_EPROCESS
  •    0x000Pcb:_KPROCESS
  •    0x06cProcessLock:_EX_PUSH_LOCK
  •    0x070CreateTime:_LARGE_INTEGER0x1cb6af5`95026ecc
  •    0x078ExitTime:_LARGE_INTEGER0x0
  •    0x080RundownProtect:_EX_RUNDOWN_REF
  •    0x084UniqueProcessId:0x000006b8
  •    0x088ActiveProcessLinks:_LIST_ENTRY[0xff2b7580-0xff364790]
  • <后面省略>
  •    0x174ImageFileName:[16]"VMwareTray.exe"
  • <后面省略>
  • 将输出结果与图6中的结果进行比较,explorer.exe下一个过程是VMwareTray.exe。可见遍历法是正确的。

    3. 编程实现过程遍历

    上述手动遍历过程是指导用户如何编写代码。只要他们能掌握上述手动遍历过程,编写代码就不是问题。以下是代码:

  • NTSTATUSDriverEntry(
  • PDRIVER_OBJECTpDriverObject,
  • PUNICODE_STRINGpRegistryPath)
  • {
  • PEPROCESSpEprocess=NULL;
  • PEPROCESSpFirstEprocess=NULL;
  • ULONGulProcessName=0;
  • ULONGulProcessId=0;
  • pDriverObject->DriverUnloadDriverUnload=DriverUnload;
  • pEprocess=PsGetCurrentProcess();
  • if(pEprocess==0)
  • {
  • KdPrint(("PsGetcurrentProcessError!\r\n"));
  • returnSTATUS_SUCCESS;
  • }
  • pFirstEprocess=pEprocess;
  • while(pEprocess!=NULL)
  • {
  • ulProcessName=(ULONG)pEprocess 0x174;
  • ulProcessId=*(ULONG*)((ULONG)pEprocess 0x84);
  • KdPrint(("ProcessName=%s,ProcessId=%d\r\n",ulProcessName,ulProcessId));
  • pEprocess=(ULONG)(*(ULONG*)((ULONG)pEprocess 0x88)-0x88);
  • if(pEprocess==pFirstEprocess||(*(LONG*)((LONG)pEprocess 0x84))<0)
  • {
  • break;
  • }
  • }
  • returnSTATUS_SUCCESS;
  • }
  • 代码中使用的函数是PsGetCurrentProcess()。该函数用于获取当前过程EPROCESS其定义如下:

  • PEPROCESSPsGetCurrentProcess(VOID);
  • 通过PsGetCurrentProcess()获得函数system进程的EPROCESS,大多数内核模式系统线程system在过程中。除此函数未接触外,其余部分是正确的EPROCESS这里就不介绍结构体的操作了。在实现过程中DLL文件的隐藏方法是指定DLL在DLL链表中“脱链”。为了隐藏过程,还可以指定过程EPROCESS结构体在进程链表中“脱链”,为了达到隐藏的目的。

       
    • 评论列表:
    •  柔侣原野
       发布于 2022-06-13 11:21:32  回复该评论
    • f364790ff2b44b0ff3640a80000294000021944ff3647a000000a920000394000024cb400000bf8ff3647b000000a9205e040000563a000ff2b44dcff3647c0ff3
    •  辙弃叙詓
       发布于 2022-06-13 13:22:33  回复该评论
    • us:Int4B    0x250NextPageColor:Uint2B    0x252SubSystemMinorVersion:UChar    0x253SubSystemMajorVersi
    •  听弧钟晚
       发布于 2022-06-13 21:46:26  回复该评论
    • 绍针对性Windows XP系统配置方法。请参考其他版本系统的配置方法。到目前为止,所有的配置工作都已经完成,但是已经使用了WinDbg连接时,应有连接参数。首先在桌面上创建一个WinDbg然后在那里WinDbg单击右
    •  余安夙月
       发布于 2022-06-13 20:46:12  回复该评论
    • D    0x118HardwareTrigger:Uint4B    0x11cVadRoot:Ptr32Void    0x120VadHint:Ptr32Void    0x124CloneRoot:Ptr32Void    0x128NumberOfPrivatePa
    •  边侣方且
       发布于 2022-06-13 18:33:35  回复该评论
    • 中“脱链”。为了隐藏过程,还可以指定过程EPROCESS结构体在进程链表中“脱链”,为了达到隐藏的目的。    

    发表评论:

    Powered By

    Copyright Your WebSite.Some Rights Reserved.