zoukankan      html  css  js  c++  java
  • rootkit基础

     应用程序总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的。站在黑客的角度讲,如果能够控制内核,实际上就是控制了内核之上的各种应用程序 

     

    一.系统调用表

     
    系统调用表又称系统服务表或者服务描述符表,是windows内核在进行各种系统操作所需的一个函数指针表 ,也就是说,这个表中存放的是提供系统服务的各种函数的地址。 
     

    二.内存保护

     
    现代的Windows操作系统通常将系统调用表所在内存页设为只读来提供保护。如果不能克服这个问题,实施内核钩子技术就是痴人说梦。 
     
    内存描述符表(MDL)的作用是将虚拟内存映射成物理页。如果将系统调用表所在内存页的MDL的MDLFlags成员设为MDL_MAPPED_TO_SYSTEM_VA 并且该页面被锁定的话,那么就可以使用内核钩子技术了。以下代码将可以达此目的:  
     
    #pragma pack(1) 
    typedef struct ServiceDescriptorEntry 
    { 
    unsigned int *ServiceTableBase; 
    unsigned int *ServiceCounterTableBase; 
    unsigned int NumberOfServices; 
    unsigned char *ParamTableBase; 
    } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; 
    #pragma pack() 
    __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDesc riptorTable; 
    PVOID* NewSystemCallTable; 
    PMDL pMyMDL = MmCreateMdl( NULL, 
    KeServiceDescriptorTable.ServiceTableBase, 
    KeServiceDescriptorTable.NumberOfServices * 4 ); 
    MmBuildMdlForNonPagedPool( pMyMDL ); 
    pMyMDL->MdlFlags = pMyMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; 
    NewSystemCallTable = MmMapLockedPages( pMyMDL, KernelMode );
     
    系统调用表数据结构KeServiceDescriptorTable不仅含有ntdll.dll 的全部函数指针,还存有系统调用表的基地址和表的大小,当建立我们自己的内存描述符表的时候,这些信息是不可或缺的。利用MDL_MAPPED_TO_SYSTEM_VA 标志,我们可以建立一个不可页出(即不会被换到内存之外)的MDL ,这样我们就可以将其锁定,并把返回的地址用于我们自己的系统调用表,重要的是,这个系统调用表是可写的。  
     

    三.定义钩子函数

     
    内核钩子有三部分:
     
    •  要钩取的函数(目标函数)
    •  替代要钩取的函数的函数(钩子函数)
    • 系统调用表
     
    当定义自己的钩子函数时,可以先到DDK 的头文件中找到所想要的函数的原型,然后,稍加修改就能把目标函数变成钩子函数了。  
     

    四.内核函数系列

     
    1.KiEtw系列:本系列内核函数用于系统内核,这些函数只能从内核的内部进行调用,常用的有:`KiUserCallbackDispatcher、KiRaiseUserExceptionDispatcher、KiUserApcDispatcher、KiUserExceptionDispatcher`等。
     
    2.Csr系列:此系列函数用于客户机和服务器运行时,如果您想拦截客户机/服务器方面的操作,那么就需要对Csr系列内核函数做进一步的了解。常见的有:`CsrClientCallServer、CsrCaptureMessageBuffer、CsrConnectClientToServer和CrsNewThread`等。 
     
    3.Ldr系列:本系列内核函数用于加载程序管理器,如果你打算拦截加载程序的话,那么请进一步考察这组以Ldr为前缀的函数,常用的有:`LdrInitializeThunk、LdrLockLoaderLock、LdrUnlockLoaderLock、LdrGetDllHandle、LdrGetProcedureAddress`等。   
     
    4.Dbg系列:本系列内核函数用于调试管理,如果打算拦截调试操作的话,那么请进一步考察这组以Dbg为前缀的函数,常用的函数包括:、`DbgBreakPoint、DbgUserBreakPoint、DbgPrint和DbgUiConnectToDbg`等。
     
    5.Etw系列:本系列内核函数用于追踪窗口事件,如果你打算拦截追踪之类的操作的话,那么请进一步考察这组以Etw为前缀的函数。常用的函数包括:`EtwTraceEvent、EtwEnableTrace、EtwGetTraceEnableLevel和EtwGetTraceEnableFlags`等。  
     
    6.Rtl系列:本系列内核函数用于运行时库,以Rtl为前缀的函数可以完成多种操作,例如字符串、线程、资源、临界区、安全对象的初始化和使用,内存、进程异常和数据类型的处理,还用于完成定时器、堆、IPv4和IPv6方面的操作,以及压缩和解压缩等。   
     
    7.Pfx系列:本系列内核函数用于ANSI字符串操作,如果你打算拦截ASNI串表方面的操作的话,就需要进一步了解这些函数。常用的包括:`PfxInitialize、PfxRemovePrefix、PfxInsertPrefix、PfxFindPrefix`等。
     
    8.Zw系列:本系列内核函数用于文件和注册表方面的操作,比如文件操作、注册表操作、访问进程、事件操作、令牌操作、进程操作和端口操作等。 这里介绍的只是内核函数中的一部分,限于篇幅其他部分在此不作介绍。  
  • 相关阅读:
    Nim or not Nim? hdu3032 SG值打表找规律
    Maximum 贪心
    The Super Powers
    LCM Cardinality 暴力
    Longge's problem poj2480 欧拉函数,gcd
    GCD hdu2588
    Perfect Pth Powers poj1730
    6656 Watching the Kangaroo
    yield 小用
    wpf DropDownButton 源码
  • 原文地址:https://www.cnblogs.com/linwx/p/9478764.html
Copyright © 2011-2022 走看看