windows內核研究(驅動開發 第一個驅動程序和調試環境搭建)

驅動開發


第一個驅動程序

驅動的開發流程

1.編寫代碼 -> 生成.sys文件 -> 部署 -> 啟動 -> 停止 ->卸載

// 編寫我們的第一個驅動程序
#include<ntddk.h>// 卸載函數
VOID DrvUnload(PDRIVER_OBJECT DriverObject) {DbgPrint("我被卸載了\n");
}// 驅動入口函數,相當于main函數
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {// 輸出調試信息DbgPrint("Hello World!\n");// 設置卸載函數DriverObject->DriverUnload = DrvUnload;return STATUS_SUCCESS;
}

接下來,我們來試著加載一下我們自己寫的驅動程序

在這里插入圖片描述

驅動程序的加載分為4步:

  1. Register:裝載(告訴操作系統我有這么一個驅動程序)
  2. Run:運行(真正開始運行了)
  3. Stop:停止
  4. Unregister:卸載

在這里插入圖片描述
當點擊Run時,輸出日志HelloWorld,當點擊Stop時,輸出日志我被卸載了


如何調試驅動程序

搭建雙機調試環境

為什么要搭建雙機調試環境呢?

應為當我們在調試驅動(內核)程序時,如果直接在我們物理機上進行調試,下斷點時,我們的整個系統會卡死,這樣以來就無法調試了(在調試驅動程序也很容易發生藍屏),所以我們需要在另一個系統環境上用信號的方式傳遞調試信息進行驅動程序的調試

下載VirtualKD軟件

VirtualKD官網

在這里插入圖片描述

1.把上面的target32或者是64復制到被調試的系統上,是多少位的操作系統就復制對應位的target

在這里插入圖片描述
這里的vmistall.exe直接雙擊運行

在這里插入圖片描述
選擇install就可以了,這個軟件只用運行一次就可以了(一點安裝虛擬機就會進行重啟),它會在當前電腦上創建一個新的系統引導向,向我們的調試主機發送信號

在這里插入圖片描述
這里會給我們把默認引導項選擇為它剛剛為我們創建好的

在這里插入圖片描述
按F8,選擇禁用驅動程序強制簽名回車(在這之前一定要先運行VirtualKD程序)

在這里插入圖片描述

如果你的電腦上還沒有安裝windbg調試器,可以去微軟的應用商店獲取,這個軟件是微軟官方的

在這里插入圖片描述

到此我們雙機調試的環境就算搭建好了

那如何進行調試呢?

我們在windbg中用以下命令進行反匯編查看

u 地址 // 用u命令反匯編一個地址

在這里插入圖片描述
可以看到它不僅給我們生成了匯編代碼還同時給我把這段代碼是在哪里方法里面的偏移也顯示出來了(這個就是PDB(Program Database)文件)

這些PDB文件在我們自寫的的程序,驅動,動態鏈接庫時都會自動生成,PDB文件主要描述了程序函數地址與文件名的對應關系,在上面的示例中,我們僅通過一個地址就能知道對應的方法名和它的偏移位置,這個方法名就是在PDB文件中和地址進行關聯的(內核的PDB是由微軟來提供的)

使用.sympath命令就可以查看對應PDB下載獲取的位置

.sympath // 獲取當前的PDB下載位置
.sympath SRV*D:\MyDebugSymbols*https://msdl.microsoft.com/download/symbols // 重新設置

在這里插入圖片描述

SRV*D:\MyDebugSymbols表示下載的PDB文件保存在電腦的什么地方
https://msdl.microsoft.com/download/symbols如果電腦上沒有對應的PDB文件該從什么地方去獲取

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89394.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ABP VNext + 多級緩存架構:本地 + Redis + CDN

ABP VNext 多級緩存架構&#xff1a;本地 Redis CDN &#x1f4da; 目錄ABP VNext 多級緩存架構&#xff1a;本地 Redis CDN一、引言 &#x1f680;二、環境與依賴 &#x1f6e0;?三、架構概覽 &#x1f310;請求全鏈路示意 &#x1f6e3;?四、本地內存緩存層 &#x1…

RGBA圖片格式轉換為RGB格式(解決convert轉換的失真問題)

使用convert轉換的問題 OpenCV 的 cv2.cvtColor(…, cv2.COLOR_BGRA2GRAY) 會直接忽略 Alpha 通道的含義&#xff0c;將它當作第四個顏色通道來處理。 轉換公式如下&#xff1a; gray 0.114*255 0.587*0 0.299*0 ≈ 29也就是說&#xff0c;即使 Alpha 為 0&#xff08;完全透…

Spring AI之Prompt開發

文章目錄1 提示詞工程1_核心策略2_減少模型“幻覺”的技巧2 提示詞攻擊防范1_提示注入&#xff08;Prompt Injection&#xff09;2_越獄攻擊&#xff08;Jailbreaking&#xff09;3 數據泄露攻擊&#xff08;Data Extraction&#xff09;4 模型欺騙&#xff08;Model Manipulat…

Java面試(基礎篇) - 第二篇!

未看第一篇的&#xff0c;這里可以直達 Java面試(基礎篇) - 第一篇 Integer對象可以用判斷嗎&#xff1f;為什么&#xff1f; 回答 不可以&#xff0c;因為 比較的是對象的實例&#xff08;內存地址&#xff09;&#xff0c;Integer是有一個緩存機制的&#xff0c;它會將-1…

【C# in .NET】11. 探秘泛型:類型參數化革命

探秘泛型:類型參數化革命 泛型是 C# 和.NET框架中一項革命性的特性,它實現了 “編寫一次,多處復用” 的抽象能力,同時保持了靜態類型的安全性和高性能。與 C++ 模板等其他語言的泛型機制不同,.NET 泛型在 CLR(公共語言運行時)層面提供原生支持,這使得它兼具靈活性、安…

菜單權限管理

菜單管理系統的整體架構1.Menu 菜單表2.role 角色表3.role_menu 角色菜 單關聯表&#xff08;多對多 &#xff09;要找role_id為3的角色能用哪個菜單:SELECT *FROM sys_menu a LEFT JOIN sys_role_menu b ON a.menu_id b.menu_id WHERE role_id3拆分開就是4.user 用戶表5.user…

SQL FOREIGN KEY:詳解及其在數據庫設計中的應用

SQL FOREIGN KEY:詳解及其在數據庫設計中的應用 引言 在數據庫設計中,數據完整性是至關重要的。SQL FOREIGN KEY(外鍵)是實現數據完整性的一種有效手段。本文將詳細解釋SQL FOREIGN KEY的概念、用途以及在實際數據庫設計中的應用。 外鍵概述 1. 定義 外鍵(FOREIGN KE…

[yotroy.cool] 記一次 spring boot 項目寶塔面板部署踩坑

個人博客https://www.yotroy.cool/&#xff0c;感謝關注&#xff5e; 圖片資源可能顯示不全&#xff0c;請前往博客查看哦&#xff01;部署了個新項目&#xff0c;給我整抑郁了。。。下面是踩坑過程 寶塔面板 MySql5.7 版本 root 密碼錯誤 這個MySQL5.7 安裝完后就跑不了&#…

前端之HTML學習

HTML 學習筆記 前端三大件 HTML&#xff1a;超文本標記語言&#xff08;HyperText Markup Language&#xff09;CSS&#xff1a;層疊樣式表JavaScript&#xff1a;客戶端腳本語言常用框架&#xff1a;jQuery Vue 3(Element plus) HTML 基本概念 超文本&#xff1a;包含圖像…

迅速高效從web2到web3轉型 ,開啟遠程工作

Web2向Web3的轉型&#xff0c;是技術、產品、組織結構和商業模式的深度變革。若要迅速且高效地完成這個轉型&#xff0c;需要清晰的路徑規劃和戰略執行。 目錄 &#x1f501; 一、理解核心區別&#xff1a;Web2 vs Web3 &#x1f680; 二、轉型路徑 1. 選擇合適的切入點 …

區塊鏈開發協作工具全景圖:從智能合約管理到去中心化治理

&#x1f4a5; 三重絞索&#xff1a;區塊鏈開發的至暗時刻 1. 版本管理的深淵 當某DeFi團隊凌晨修復漏洞時&#xff0c;發現生產環境運行的竟是兩周前的廢棄分支——37%的項目因代碼分支混亂引發生產事故&#xff08;Electric Capital 2024&#xff09;。智能合約的版本漂移如同…

冒泡排序、選擇排序、插入排序、快速排序

目錄 1. 冒泡排序 (Bubble Sort) 算法思路分析 代碼實現 復雜度分析 2. 選擇排序 (Selection Sort) 算法思路分析 代碼實現 復雜度分析 3. 插入排序 (Insertion Sort) 算法思路分析 代碼實現 復雜度分析 4. 快速排序 (Quick Sort) 算法思路分析 代碼實現 復雜度…

PHP語言基礎知識(超詳細)第一節

一. PHP簡介: PHP即“超文本預處理器”,創建于1994年,是一種通用開源腳本語言。PHP是在服務器端執行的腳本語言,與C語言類似,是常用的網站編程語言。PHP獨特的語法混合了C、Java、Perl以及 PHP 自創的語法。利于學習,使用廣泛,主要適用于Web開發領域。 二. PHP的優點:…

Reloaded-II項目:解決GitHub下載Mod缺少DLL文件的問題

Reloaded-II項目&#xff1a;解決GitHub下載Mod缺少DLL文件的問題 問題現象分析 在使用Reloaded-II項目加載從GitHub下載的"Debug Stuff"模組時&#xff0c;用戶遇到了一個常見的技術問題&#xff1a;系統提示缺少DLL文件&#xff0c;導致模組無法正常運行。這種情況…

0-1搭建springboot+vue的教務管理系統(核心源碼)

目錄 后端核心代碼&#xff1a; control層 service 層 mapper層 后端核心代碼&#xff1a; control層&#xff1a; classControlsImpl package com.itheima.controls.impl;import com.itheima.mapper.ClassMapper; import com.itheima.pojo.Clazz; import com.itheima.po…

Ubuntu中man手冊不全解決以及man手冊中英文切換方法

步入正題之前&#xff0c;先來幫助大家了解一下man手冊的作用&#xff0c;讓大家對其有更深的理解并充分利用一、man 手冊的作用?man 手冊&#xff0c;即 manual pages&#xff0c;是 Linux 系統自帶的幫助文檔系統。通過 man 命令&#xff0c;用戶能快速獲取系統中幾乎所有命…

數據結構----線性表(棧及其棧的實現)C語言 學習筆記

棧&#xff1a;線性邏輯結構棧的分類 順序棧&#xff1a;順序存儲結構實現的棧鏈式棧&#xff1a;鏈式存儲結構實現的棧相關概念線性表&#xff1a;可以在任意位置操作棧&#xff1a;對線性表進行約束只能在一端插入和刪除操作的線性表&#xff0c;中間不允許操作。棧底&#x…

手滑誤操作? vue + Element UI 封裝二次確認框 | 附源碼

一諾最近在做后臺管理系統時&#xff0c;遇到一個很常見但又容易被忽視的小問題&#xff1a;單選框切換時&#xff0c;用戶一不小心點錯&#xff0c;原有配置就沒了&#xff0c;數據丟失&#xff0c;后悔也來不及。你是不是也遇到過類似的場景&#xff1f;比如切換網絡模式、切…

力扣刷題367——有效的完全平方數

力扣刷題367——有效的完全平方數&#xff08;69的相似題&#xff09; 題目&#xff1a; 給你一個正整數 num 。如果 num 是一個完全平方數&#xff0c;則返回 true &#xff0c;否則返回 false 。 完全平方數 是一個可以寫成某個整數的平方的整數。換句話說&#xff0c;它可以…

kubernetes架構原理與集群環境部署

kubernetes架構原理與集群環境部署概述為什么需要 KubernetesKubernetes 帶來的挑戰kubernetes架構解析master 節點的組件(1)API server(2)scheduler(3)Controller Manager(4)etcdNode 節點包含的組件(1)容器運行時(2)kubelet(3)kube-proxy代理kubernetes 網絡插件(1)Flannel 網…