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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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; 鉴于绝大…