windows內核研究(系統調用 1)

WindowsAPI函數的調用過程


什么是WindowsApi?

Windows API(Application Programming Interface,應用程序編程接口)是微軟為Windows操作系統提供的一套系統級編程接口,允許開發者與操作系統內核、硬件、系統服務等進行交互。它是開發Windows應用程序的基礎,幾乎所有Windows軟件(包括系統工具、驅動程序、桌面應用等)都直接或間接依賴于Windows API

WindowsApi主要存放在C:\Windows\system32下的所有.dll文件
幾個重要的DLl:

  • Kernel32.dll:最核心的功能模塊,比如管理內存,進程和線程相關的函數等
  • User32.dll:是Windows用戶界面相關應用程序接口,如創建窗口和發送消息等。
  • GDI32.dll:圖形設備接口,包含用于畫圖和顯示
  • NTdll.dll:大多數的Api都會通過這個dll進入內核(0環)

分析ReadProcessMemory函數

使用IDA Pro打開Kernel32.dll,這個DLL中就有ReadProcessMemory
在這里插入圖片描述

在windows7系統之后 ,微軟把很多內部函數的實現細節放到了KernelBase.dll這個DLL當中,Kernel32.dll在后面的系統為了兼容任然存在,這里我們直接分析KernelBase.dll

x86

在這里插入圖片描述
這里就是它32位的ReadProcessMemory的代碼

.text:10152910 ; BOOL __stdcall ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead)
.text:10152910                 public _ReadProcessMemory@20
.text:10152910 _ReadProcessMemory@20 proc near         ; CODE XREF: EnumProcessModulesInternal(x,x,x,x,x)+55↑p
.text:10152910                                         ; EnumProcessModulesInternal(x,x,x,x,x)+74↑p ...
.text:10152910
.text:10152910 NumberOfBytesRead= dword ptr -4
.text:10152910 hProcess        = dword ptr  8
.text:10152910 lpBaseAddress   = dword ptr  0Ch
.text:10152910 lpBuffer        = dword ptr  10h
.text:10152910 nSize           = dword ptr  14h
.text:10152910 lpNumberOfBytesRead= dword ptr  18h
.text:10152910
.text:10152910 ; FUNCTION CHUNK AT .text:101E1E90 SIZE 0000000E BYTES
.text:10152910
.text:10152910                 mov     edi, edi        ; 熱補丁占用
.text:10152912                 push    ebp             ; ebp入棧
.text:10152913                 mov     ebp, esp        ; 提升堆棧
.text:10152915                 push    ecx             ; 提升棧,相當于sub esp,4
.text:10152916                 lea     eax, [ebp+NumberOfBytesRead] ; 獲取ebp-4位置的地址給eax
.text:10152919                 push    eax             ; NumberOfBytesRead 參數5: 實際讀取字節數的指針
.text:1015291A                 push    [ebp+nSize]     ; NumberOfBytesToRead 參數4: 要讀取的字節數
.text:1015291D                 push    [ebp+lpBuffer]  ; Buffer 參數3: 目標緩沖區
.text:10152920                 push    [ebp+lpBaseAddress] ; BaseAddress 參數2: 源內存地址
.text:10152923                 push    [ebp+hProcess]  ; ProcessHandle 參數1: 進程句柄
.text:10152926                 call    ds:__imp__NtReadVirtualMemory@20 ; 調用內核函數
.text:1015292C                 mov     edx, [ebp+lpNumberOfBytesRead] ; 取lpNumberOfBytesRead指針
.text:1015292F                 test    edx, edx        ; 判斷參數lpNumberOfBytesRead是否為空
.text:10152931                 jnz     short loc_10152946 ; 不等于0則跳轉
.text:10152933
.text:10152933 loc_10152933:                           ; CODE XREF: ReadProcessMemory(x,x,x,x,x)+3B↓j
.text:10152933                 test    eax, eax        ; 判斷是否成功執行函數
.text:10152935                 js      loc_101E1E90    ; 為負數(失敗)則跳轉
.text:1015293B                 mov     eax, 1          ; 成功返回1
.text:10152940
.text:10152940 loc_10152940:                           ; CODE XREF: ReadProcessMemory(x,x,x,x,x)+8F589↓j
.text:10152940                 mov     esp, ebp        ; 還原棧底
.text:10152942                 pop     ebp             ; 恢復ebp
.text:10152943                 retn    14h             ; 棧內平衡
.text:10152946 ; ---------------------------------------------------------------------------
.text:10152946
.text:10152946 loc_10152946:                           ; CODE XREF: ReadProcessMemory(x,x,x,x,x)+21↑j
.text:10152946                 mov     ecx, [ebp+NumberOfBytesRead] ; 從局部變量加載實際讀取的字節數
.text:10152949                 mov     [edx], ecx      ; 寫入lpNumberOfBytesRead
.text:1015294B                 jmp     short loc_10152933 ; 返回
.text:1015294B _ReadProcessMemory@20 endp

在這里插入圖片描述
x64

在這里插入圖片描述
這里就是它64位的ReadProcessMemory的代碼

.text:00000001800BBF70 ; 由于x64的調用約定,前4個參數是由rcx,rdx,r8,r9來傳遞的
.text:00000001800BBF70
.text:00000001800BBF70 ; BOOL __stdcall ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesRead)
.text:00000001800BBF70                 public ReadProcessMemory
.text:00000001800BBF70 ReadProcessMemory proc near             ; CODE XREF: WerpReadPeb32FromProcess+EA↓p
.text:00000001800BBF70                                         ; tip2::details::recover_vector<tip2::details::TestData *>(void * const,void const *,tip2::vector_nothrow<tip2::details::TestData *> &)+3D↓p ...
.text:00000001800BBF70
.text:00000001800BBF70 NumberOfBytesRead= qword ptr -28h
.text:00000001800BBF70 var_18          = qword ptr -18h
.text:00000001800BBF70 lpNumberOfBytesRead= qword ptr  28h
.text:00000001800BBF70
.text:00000001800BBF70                 sub     rsp, 48h        ; 分配48h(72)字節的棧空間
.text:00000001800BBF74                 lea     rax, [rsp+48h+var_18] ; 獲取局部變量var_18的地址
.text:00000001800BBF79                 mov     [rsp+48h+var_18], 0 ; 初始化var_18為0
.text:00000001800BBF82                 mov     [rsp+48h+NumberOfBytesRead], rax ; NumberOfBytesRead
.text:00000001800BBF87                 call    cs:__imp_NtReadVirtualMemory ; 調用內核函數
.text:00000001800BBF8E                 nop     dword ptr [rax+rax+00h] ; 什么都不做(字節對齊)
.text:00000001800BBF93                 mov     rcx, [rsp+48h+lpNumberOfBytesRead] ; 獲取lpNumberOfBytesRead地址值給rcx
.text:00000001800BBF98                 test    rcx, rcx        ; 是否為null
.text:00000001800BBF9B                 jz      short loc_1800BBFA5 ; 為null則跳過
.text:00000001800BBF9D                 mov     rdx, [rsp+48h+var_18] ; 獲取實際讀取的字節數
.text:00000001800BBFA2                 mov     [rcx], rdx      ; 保存到lpNumberOfBytesRead指針
.text:00000001800BBFA5
.text:00000001800BBFA5 loc_1800BBFA5:                          ; CODE XREF: ReadProcessMemory+2B↑j
.text:00000001800BBFA5                 test    eax, eax        ; 校驗值
.text:00000001800BBFA7                 js      short loc_1800BBFB4 ; 為負數則跳轉
.text:00000001800BBFA9                 mov     eax, 1          ; 設置eax為1
.text:00000001800BBFAE                 add     rsp, 48h        ; 堆棧平衡
.text:00000001800BBFB2                 retn                    ; 返回
.text:00000001800BBFB2 ; ---------------------------------------------------------------------------
.text:00000001800BBFB3                 align 4
.text:00000001800BBFB4
.text:00000001800BBFB4 loc_1800BBFB4:                          ; CODE XREF: ReadProcessMemory+37↑j
.text:00000001800BBFB4                 mov     ecx, eax
.text:00000001800BBFB6                 call    BaseSetLastNTError ; 調用方法
.text:00000001800BBFBB                 xor     eax, eax        ; eax清0
.text:00000001800BBFBD                 add     rsp, 48h        ; 堆棧平衡
.text:00000001800BBFC1                 retn                    ; 返回

在這里插入圖片描述
函數真正的實現是在NtReadVirtualMemory


分析NtReadVirtualMemory

查看導出表,可以看到是由ntdll來提供的

在這里插入圖片描述
打開ntdll,打到這個方法
在這里插入圖片描述

真正的實現是在0環實現的,這里只是提供了一個接口給應用程序

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

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

相關文章

【前端】異步任務風控驗證與輪詢機制技術方案(通用筆記版)

一、背景場景 在某類生成任務中&#xff0c;例如用戶點擊“執行任務”按鈕后觸發一個較耗時的后端操作&#xff08;如生成報告、渲染圖像、轉碼視頻等&#xff09;&#xff0c;由于其調用了模型、渲染服務或需要較長處理時間&#xff0c;為了防止接口被頻繁惡意調用&#xff0c…

Vim 編輯器常用操作詳解(新手快速上手指南)

&#x1f4bb; Vim 編輯器常用操作詳解&#xff08;新手快速上手指南&#xff09;作者&#xff1a;Lixin 日期&#xff1a;2025-07-09 學習內容&#xff1a;Vim 編輯器基礎 常用快捷鍵 Xshell/Xftp連接 Linux基本操作 學習目標&#xff1a;掌握 Vim 的三種常用模式切換與基本…

OpenGL 生成深度圖與點云

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里基于OpenGL實現對一個Mesh對象深度圖的獲取,思路其實很簡單,直接通過glReadPixels函數獲取整個OpenGL中的深度緩沖數據即可;那么反過來我們如果有了這個深度圖之后,也可以基于每個像素點的深度值,反算出圖像中的深…

25春云曦期末考復現

Web 瘋狂星期四 <?php$tg1u$_GET[tg1u];if(!preg_match("/0|1|[3-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\&#xff08;|\&#xff09;|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\|localeconv|pos|current|print|var|dump|getallheaders|get|define…

從Prompt到預訓練:掌握大模型核心技術的階梯式進化

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。 在探討大模型&#xff08;LLM&#xff09;的四階段技術時&#xff0c;我們可以從Prompt Engineering&#xff08;提示工程&#xff09;、AI Agent&…

手機文件夾隱藏工具,一鍵保護隱私

軟件介紹 今天為大家推薦一款手機文件夾隱藏工具——Amarok&#xff0c;它能幫助用戶快速隱藏手機中的私密文件夾&#xff0c;保護個人隱私。 核心功能 Amarok主打文件夾隱藏功能&#xff0c;操作簡單便捷。需要注意的是&#xff0c;雖然軟件支持應用隱藏功能&#xff0…

day10-Redis面試篇

經過前幾天的學習&#xff0c;大家已經掌握了微服務相關技術的實際應用&#xff0c;能夠應對企業開發的要求了。不過大家都知道在IT領域往往都是面試造火箭&#xff0c;實際工作擰螺絲。為了更好的應對面試&#xff0c;讓大家能拿到更高的offer&#xff0c;我們接下來就講講“造…

Axure版本Element組件庫-免費版

Axure版本的Element組件庫基于Element UI/Plus設計規范開發&#xff0c;涵蓋了從基礎元素到復雜交互的全品類組件&#xff0c;能高效支撐各類Web原型設計&#xff0c;尤其適合后臺管理系統、企業級應用等場景。以下從核心類別展開詳細介紹&#xff1a; 鏈接地址 添加圖片注釋&a…

記一次JVM問題排查

今天遇到了1次OOM&#xff0c;導入萬條數據的Excel于是讓運維進行排查。正式環境顯示內存還有很多 于是我說讓運維加上參數 -XX:HeapDumpOnOutOfMemoryError&#xff0c;出現OOM的時候dump到文件中&#xff0c;將堆內存設置為4G&#xff0c;在Idea上進行測試于是讓運維在生產環…

快手Kwai Keye-VL多模態大模型模型架構、訓練策略、數據情況

快速看一下Kwai Keye-VL的技術報告&#xff0c; 模型架構 Keye-VL和經典的MLLM架構類似&#xff0c;由ViTMLPLLM組成。視覺側有兩點可以看看&#xff1a; 1、具有原生分辨率的視覺編碼器 提到&#xff0c;MLLMs使用預訓練的固定分辨率ViT作為視覺編碼器。然而&#xff0c;這…

前端-CSS-day2

目錄 1、后代選擇器 2、子代選擇器 3、并集選擇器 4、交集選擇器 5、偽類選擇器 6、超鏈接偽類 7、CSS特性-繼承性 8、CSS特性-層疊性 9、CSS特性-優先級 10、優先級-疊加計算 11、Emmet寫法 12、背景圖 13、背景圖平鋪方式 14、背景圖位置 15、背景圖縮放 16、…

米思齊2.0 3.0 mixly arduino 編程軟件下載安裝及詳情使用指南 導入庫文件方法 支持8266 esp32

一、米思齊軟件下載及安裝 1、 米思齊軟件下載 https://item.taobao.com/item.htm?id883253312209 2、軟件版本簡單說明&#xff1a; a、 Windows版本&#xff08;建議win10及以上系統使用&#xff09;&#xff1a; 一鍵更新完整版 2.8GB-3GB&#xff1a;下載后解壓即可使…

結構體指針:使用結構體指針訪問和修改結構體成員。

知識點結構體指針Employee *p; 保存結構體的地址&#xff1b;p->member 用箭頭運算符訪問或修改成員。數組與指針Employee *emps malloc(N * sizeof *emps); 動態創建結構體數組&#xff1b;p < emps N 與 p 配合遍歷。scanf 與數組退化p->name 是 char name[50] 的…

支持零樣本和少樣本的文本到語音48k star的配音工具:GPT-SoVITS-WebUI

支持零樣本和少樣本的文本到語音48k star的配音工具&#xff1a;GPT-SoVITS-WebUI 官網&#xff1a;RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 用戶手冊&#xff1a;GPT-SoVITS指南 功能 零樣本文本到語…

基于odoo17的設計模式詳解---備忘模式

大家好&#xff0c;我是你的Odoo技術伙伴。在開發復雜的業務流程時&#xff0c;我們有時會遇到這樣的需求&#xff1a;在對一個對象進行一系列復雜操作之前&#xff0c;保存其當前狀態&#xff0c;以便在操作失敗或用戶希望撤銷時&#xff0c;能夠一鍵恢復到操作之前的樣子。或…

基于Web門戶架構的監獄內網改版實踐:值班排班系統設計與信創適配探討

面向監獄內網改版場景的門戶平臺技術架構與智能排班實踐關鍵詞&#xff1a;監獄內網改版、監獄內部網站改版、值班排班系統、信創適配、智能門戶架構一、場景背景與問題分析 在信創國產化、等級保護合規、政務集約化趨勢持續推進的背景下&#xff0c;傳統監獄內部網站普遍面臨如…

二分查找篇——在排序數組中查找元素的第一個和最后一個位置【LeetCode】

34. 在排序數組中查找元素的第一個和最后一個位置 一、算法邏輯&#xff08;逐步通順講解每一步思路&#xff09; 該算法用于在一個升序排列的數組 nums 中查找某個目標值 target 的第一個出現的位置和最后一個出現的位置。 ? 1?? 定義 lower_bound 函數 def lower_boun…

【深度學習新浪潮】AI在材料力學領域的研究進展一覽

一、材料力學的研究范疇 材料力學是固體力學的核心分支,聚焦于材料在載荷作用下的變形、失效規律及性能優化,其核心任務是揭示材料的強度、剛度和穩定性機制。具體研究內容包括: 基本力學行為:分析桿、梁、軸等結構在拉伸、壓縮、彎曲、扭轉等載荷下的應力分布與應變響應。…

WPF之命令

命令的定義&#xff1a;命令與事件的區別&#xff1a;命令是具有約束性的。命令還可以控制接收者"先做校驗&#xff0c;再保存&#xff0c;再關閉"。命令&#xff1a;WPF的命令&#xff0c;實際上就是實現了ICommand接口的類&#xff0c;平時使用最多的是RoutedComma…

百度文心一言開源大模型ERNIE-4.5-0.3B-PT深度測評

號外號外&#xff01;6月30號&#xff0c;百度文心一言官宣開源ERNIE 4.5大模型&#xff01;&#xff01;&#xff01; 一收到這個消息&#xff0c;博主就立馬從GitCode拉了個模型&#xff0c;本地私有化部署體驗了一下&#xff0c;一個字&#xff0c;酷&#xff01; 鑒于絕大…