• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            CreateService加載驅動過程

            Posted on 2009-10-30 08:10 S.l.e!ep.¢% 閱讀(2445) 評論(1)  編輯 收藏 引用 所屬分類: Windows WDM
            CreateService加載驅動過程
            2009-07-30 21:56

            用instDrv加載驅動,用CreateService()函數等等過程如下,

            1,先是它向Service進程注冊服務。

            2,然后Service進程調用ZwLoadDriver()加載驅動。進入NtLoadDriver()系統調用,它先會檢測SerVice進程(當前進程)是不是有加載驅動的權限,然后檢測當前進程是不是System進程,是的話直接調用IopLoadUnloadDriver()加載驅動,-》IopLoadDriver()最后會調用驅動的DriverEntry(),所以這種方法加載驅動的DriverEntry()函數是在System進程的地址空間執行的。

            如果當前進程不是System進程的話,則調用如下的函數,向system進程的系統線程的工作隊列中插入這項,函數為IopLoadUnloadDriver(),也就是說系統線程會替它調用IopLoadUnloadDriver()函數

            ExInitializeWorkItem( &loadPacket.WorkQueueItem,
            ????????????????????????????? IopLoadUnloadDriver,
            ????????????????????????????? &loadPacket ); ExQueueWorkItem( &loadPacket.WorkQueueItem, DelayedWorkQueue );

            IopLoadUnloadDriver會調用IopLoadDriver()做真正的加載驅動的工作

            1,先根據鍵句柄調用NtQueryKey()函數得到驅動的全路徑名。

            2,循環檢查PsLoadedModuleList內核模塊鏈表看是不是這個驅動已經加載

            3.調用 status = MmLoadSystemImage( &baseName,
            ??????????????????????????????? NULL,
            ??????????????????????????????? NULL,
            ??????????????????????????????? 0,
            ??????????????????????????????? &sectionPointer,
            ??????????????????????????????? (PVOID *) &imageBaseAddress );
            ?? 這函數里面會調用 InitializeObjectAttributes (&ObjectAttributes,
            ??????????????????????????????????? ImageFileName,
            ??????????????????????????????????? (OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE),
            ??????????????????????????????????? NULL,
            ??????????????????????????????????? NULL);

            ??????? Status = ZwOpenFile (&FileHandle,
            ???????????????????????????? FILE_EXECUTE,
            ???????????????????????????? &ObjectAttributes,
            ???????????????????????????? &IoStatus,
            ???????????????????????????? FILE_SHARE_READ | FILE_SHARE_DELETE,
            ???????????????????????????? 0);?? //返回句柄為0x80000140
            函數根據驅動文件名打開文件,向system進程的句柄表中插入一項,返回句柄表的下標,就是文件句柄(這里是內核句柄))

            Status = MmCheckSystemImage (FileHandle, FALSE);//這個函數是檢查這個PE文件各個節看是不是好的。
            最后調用

            InitializeObjectAttributes (&ObjectAttributes,
            ??????????????????????????????????? NULL,
            ??????????????????????????????????? (OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE),
            ??????????????????????????????????? NULL,
            ??????????????????????????????????? NULL);

            ??????? Status = ZwCreateSection (&SectionHandle,
            ????????????????????????????????? SectionAccess,
            ????????????????????????????????? &ObjectAttributes,
            ????????????????????????????????? (PLARGE_INTEGER) NULL,
            ????????????????????????????????? PAGE_EXECUTE,
            ????????????????????????????????? SEC_IMAGE,
            ????????????????????????????????? FileHandle);
            建立節對象向system進程句柄表中插入一項,返回句柄為0x80000170

            Status = ObReferenceObjectByHandle (SectionHandle,
            ??????????????????????????????????????????? SECTION_MAP_EXECUTE,
            ??????????????????????????????????????????? MmSectionObjectType,
            ??????????????????????????????????????????? KernelMode,
            ??????????????????????????????????????????? (PVOID *) &SectionPointer,
            ??????????????????????????????????????????? (POBJECT_HANDLE_INFORMATION) NULL);//根據句柄從system進程句柄中找到節對象的地址。

            ??????? ZwClose (SectionHandle);//把此句柄關了,會從system 進程句柄中刪除一項。下次訪問節對象時就通過地址來訪問。不用句柄。

            調用 Status = MiLoadImageSection (&SectionPointer,
            ???????????????????????????????? ImageBaseAddress,
            ???????????????????????????????? ImageFileName,
            ???????????????????????????????? LoadFlags & MM_LOAD_IMAGE_IN_SESSION,
            ???????????????????????????????? FoundDataTableEntry);
            進行真正的文件映射它里面會調用 MmMapViewOfSection (SectionPointer,TargetProcess(system),
            ???????????????????????????????? &Base,
            ???????????????????????????????? 0,
            ???????????????????????????????? 0,
            ???????????????????????????????? &SectionOffset,
            ???????????????????????????????? &ViewSize,
            ???????????????????????????????? ViewUnmap,
            ???????????????????????????????? 0,
            ???????????????????????????????? PAGE_EXECUTE);
            進行文件映射,返回基址為0xba377000

            最后分配 PKLDR_DATA_TABLE_ENTRY DataTableEntry;
            初始化它,最后調用 MiProcessLoaderEntry (DataTableEntry, TRUE);
            把它個內核模塊結構加入PsLoadModuleList鏈表中等等,還會處理這個驅動的Reference等等

            4,調用??? status = ObCreateObject( KeGetPreviousMode(),
            ???????????????????????????? IoDriverObjectType,
            ???????????????????????????? &objectAttributes,
            ???????????????????????????? KernelMode,
            ???????????????????????????? (PVOID) NULL,
            ???????????????????????????? (ULONG) (sizeof( DRIVER_OBJECT ) + sizeof ( DRIVER_EXTENSION )),
            ???????????????????????????? 0,
            ???????????????????????????? 0,
            ???????????????????????????? (PVOID *) &driverObject );建立驅動對象

            初始化驅動對象后,調用 status = ObInsertObject( driverObject,
            ???????????????????????????? (PACCESS_STATE) NULL,
            ???????????????????????????? FILE_READ_DATA,
            ???????????????????????????? 0,
            ???????????????????????????? (PVOID *) NULL,
            ???????????????????????????? &driverHandle );把驅動對象插入到system進程的句柄表的一項,返回句柄,注意這個函數還會把這對象插入對象目錄中。

            5,最后會調用 status = driverObject->DriverInit( driverObject, &registryPath->Name );也就是DriverEntry()函數。

            Feedback

            # re: CreateService加載驅動過程  回復  更多評論   

            2015-04-29 13:11 by peace
            可以在內核太下直接調用這些函數來加載嗎?
            国内精品伊人久久久久AV影院| 伊人热人久久中文字幕| 久久午夜无码鲁丝片秋霞| 欧美日韩精品久久免费| 久久亚洲精品人成综合网| 伊人色综合久久天天| 欧美久久久久久| 一本大道久久a久久精品综合| 狠狠色丁香久久婷婷综合_中| 久久综合狠狠综合久久| 久久中文精品无码中文字幕| 麻豆AV一区二区三区久久| 久久久久99精品成人片牛牛影视 | 伊人久久无码精品中文字幕| 久久无码人妻一区二区三区| 日本亚洲色大成网站WWW久久| 狠狠色婷婷综合天天久久丁香| 麻豆av久久av盛宴av| 久久精品不卡| 久久综合狠狠色综合伊人| 久久亚洲AV成人无码国产| 欧美日韩精品久久免费| 久久无码精品一区二区三区| 国产毛片久久久久久国产毛片| 久久精品国产99久久无毒不卡| A级毛片无码久久精品免费| 一级女性全黄久久生活片免费| 国内精品久久久久久久影视麻豆 | 国产免费久久久久久无码| 久久水蜜桃亚洲av无码精品麻豆| 无码任你躁久久久久久| 久久夜色撩人精品国产| 久久精品无码专区免费| 久久国产香蕉一区精品| 亚洲综合精品香蕉久久网97 | 久久国产精品成人影院| 久久久久久亚洲精品成人| 久久亚洲私人国产精品vA | 亚洲精品乱码久久久久66| 一本一道久久综合狠狠老| 亚洲国产精品无码久久一线 |