内核达人

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4|回复: 0

gdb读写内存是如何实现的

[复制链接]

25

主题

25

帖子

83

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
83
发表于 3 天前 | 显示全部楼层 |阅读模式
哈喽,大家好,我就是那个不喜欢在大厂搬砖,不喜欢在研究院做研究,只喜欢创业做计算机底层课程的coder,子牙老师

讲调试器底层原理的文章、书、视频极少极少,但是调试器强大的功能吸引着无数的coder想去一探究竟,我也是其中之一。

之前写过系列文章《从零手写gdb调试器》《调试器是如何让代码停下来的》《gdb单步调试底层实现》《gdb查看反汇编底层原理》《gdb读寄存器的底层原理》《gdb写寄存器的底层原理》,感兴趣的小伙伴可以去看看。还做了一个系统性大课《从零带你手写gdb调试器》,想自己写一个自己百分百可控的调试器的小伙伴可以加班主任vx【jvm-anan】咨询

今天咱们来聊gdb读写内存是如何做到的。国际惯例,先看案例
我会从两个角度分析:1、gdb调试器是怎么实现的;2、Linux内核层面是如何实现的

以下,enjoy

内存分页机制
如果你想看懂文章后面的内容,需要你对内存有个整体上的认识
再者,需要你对4-level paging非常熟悉

这些都是x64 CPU内存的根基,没有这些基础,你是不可能看懂Linux内核的内存子系统的源码的。内存模块是Linux内核所有模块的根基,看不懂内存,其他模块也不可能看懂。所以大家想真正玩的懂Linux内核,第一件事情就是把CPU分页机制、4-level paging玩明白

现在有ChatGPT,大家完全可以自学。需要学习环境的,需要知道如何动手实战的,可以购买我的小课《零基础+AI玩转Linux内核》
如果你不想自己花时间研究,或者你认可我的技术实力,觉得跟着我学习真的能学到真本事,可以加班主任vx【jvm-anan】咨询《手写64位多核操作系统》《实战Linux内核》

gdb是怎么做的
非常简单,基于ptrace函数实现
接下来我们深入Linux内核,看看ptrace进入内核后,内核是如何实现调试器读写被调试进程的内存的,这个本质就是跨进程读写了,你把这个搞明白了,你就具备了读写任意进程的能力,这个也是黑客必备能力之一!

Linux内核是如何实现的
我会使用我花了五年时间不断优化改进构建出来的交互式单步调试Linux内核环境演示给你看。演示什么呢?演示用我写的Linux系统,运行我写的gdb调试器,单步调试Linux内核,看ptrace在内核中都干了什么

在sys_ptrace处下断点,进入内核
中间的过程我就省略了,直接贴核心代码,在函数__access_remote_vm中
第一处红框中的代码,就是通过main函数的地址,这里的地址指的是虚拟地址,找到对应的物理地址,Linux内核将物理页抽象成struct page。等下解释原理

关于物理页、struct page,完整的知识,你需要去学习Linux内核伙伴系统,其实就是搞明白这张图。我的课程《实战Linux内核》二期有教
第二处红框中的代码,将struct page映射到gdb调试器进程的虚拟内存空间中,这样gdb调试器进程才能读写这块内存

下面的代码你应该能猜到了,就是读写内存
接下来解释原理,配上图
被调试进程的四级页表如图所示,假如main函数的虚拟地址addr,映射的物理地址是0x1000。

第一处红框中的代码,函数get_user_pages_remote的用途,就是通过addr,计算得到每级页表的地址,最终得到struct page。我给你写了最容易理解的代码
但是真实情况要比这个复杂很多,因为会涉及到虚拟内存还未挂物理页、内存换出swap,所以如果你想通过虚拟地址得到struct page,最好用内核的函数,别直接这样写。

我写的这个代码在运行的时候,就遇到了还没有挂物理页的情况
每个进程的虚拟内存是独享的,但是物理内存是共享的,这就是跨进程内存读写得以实现的根基!所以拿到了main函数所在的物理页对应的struct page,将这个物理页挂到gdb调试器进程的虚拟内存空间,gdb调试器就可以读写了,如图
一句话概括,gdb调试器能读写被调试进程的内存,核心就是这一张图!背后的基础知识就是CPU的4-level paging、Linux内核的伙伴系统

至此,gdb调试器读写被调试进程的内存的秘密,你已全部知晓!有了这个基础,如果你有动手能力,你就可以读写任意进程的任意内存了,这是一个技术极客必备的能力!也是一个技术黑客必备的能力!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|内核达人

GMT+8, 2025-12-6 12:38 , Processed in 0.242687 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表