用GDB反汇编调试linux内核

gdb调试内核全过程 编译内核(不再赘述) 在编译好的linux内核中会有内核镜像 busybox 下载与编译 wget https://busybox.net/downloads/busybox-1.27.2.tar.bz2 tar -xf busybox-1.27.2.tar.bz2 cd busybox-1.27.2 make menuconfig make -j8 make install 最终我们得到 创建文件系统 内核与文件系统知识见我另一篇博客 1、 新建一个文件夹,打开终端,新建rootfs文件夹 其中 阅读详情

     在搭建好linux内核调试环境之后还会遇到各种问题,比如linux内核是不允许已最低优化等级编译的,因此有时候打印一个变量值就会显示   <optimized out>

 

  这个时候就需要采用其它的方式来显示变量值了,反汇编就是其中一种方式:

当调试linux模块初始化函数的时候(linux内核调试环境搭建-4 调试模块初始化函数_xianjian_x的博客-优快云博客)运行到 文件kernel/module.c ,函数add_sect_attrs 第1237行 时

1232         for (i = 0; i < info->hdr->e_shnum; i++) {
1233                 Elf_Shdr *sec = &info->sechdrs[i];
1234                 if (sect_empty(sec))
1235                         continue;
1236                 sattr->address = sec->sh_addr;
1237                 sattr->name = kstrdup(info->secstrings + sec->sh_name,
1238                                         GFP_KERNEL);
1239                 if (sattr->name == NULL)
1240                         goto out;
1241                 sect_attrs->nsections++;
1242                 sysfs_attr_init(&sattr->mattr.attr);
1243                 sattr->mattr.show = module_sect_show;
1244                 sattr->mattr.store = NULL;
1245                 sattr->mattr.attr.name = sattr->name;
1246                 sattr->mattr.attr.mode = S_IRUGO;
1247                 *(gattr++) = &(sattr++)->mattr.attr;
1248         }


打印sattr->address  则会显示变量已被优化:

(gdb) p sattr ->address 
value has been optimized out


这时候最好从汇编等级来查看变量值:

(gdb) p $eip
$2 = (void (*)()) 0xc107e00e <sys_init_module+5089>

(gdb) disassemble /r 0xc107e00e,0xc107e04e
Dump of assembler code from 0xc107e00e to 0xc107e04e:
=> 0xc107e00e <sys_init_module+5089>:	8b 45 bc	mov    -0x44(%ebp),%eax
   0xc107e011 <sys_init_module+5092>:	03 02	add    (%edx),%eax
   0xc107e013 <sys_init_module+5094>:	ba d0 00 00 00	mov    $0xd0,%edx
   0xc107e018 <sys_init_module+5099>:	e8 50 9a 06 00	call   0xc10e7a6d <kstrdup>
   0xc107e01d <sys_init_module+5104>:	89 46 1c	mov    %eax,0x1c(%esi)
   0xc107e020 <sys_init_module+5107>:	85 c0	test   %eax,%eax
   0xc107e022 <sys_init_module+5109>:	74 5e	je     0xc107e082 <sys_init_module+5205>
   0xc107e024 <sys_init_module+5111>:	83 47 0c 01	addl   $0x1,0xc(%edi)
   0xc107e028 <sys_init_module+5115>:	c7 46 08 95 b6 07 c1	movl   $0xc107b695,0x8(%esi)
   0xc107e02f <sys_init_module+5122>:	c7 46 0c 00 00 00 00	movl   $0x0,0xc(%esi)
   0xc107e036 <sys_init_module+5129>:	8b 46 1c	mov    0x1c(%esi),%eax
   0xc107e039 <sys_init_module+5132>:	89 06	mov    %eax,(%esi)
   0xc107e03b <sys_init_module+5134>:	66 c7 46 04 24 01	movw   $0x124,0x4(%esi)
   0xc107e041 <sys_init_module+5140>:	8b 45 ac	mov    -0x54(%ebp),%eax
   0xc107e044 <sys_init_module+5143>:	89 30	mov    %esi,(%eax)
   0xc107e046 <sys_init_module+5145>:	83 c0 04	add    $0x4,%eax
   0xc107e049 <sys_init_module+5148>:	89 45 ac	mov    %eax,-0x54(%ebp)
   0xc107e04c <sys_init_module+5151>:	83 c6 24	add    $0x24,%esi
End of assembler dump.


从反汇编中不难看出此时寄存器esi指向结构体sattr。

下断:

(gdb) b *0xc107e01d
Breakpoint 3 at 0xc107e01d: file kernel/module.c, line 1237.

这个点相当于调用完kstrdup 之后执行的第一条指令,此时eax存放elf 格式的节的名字:

(gdb) b *0xc107e01d
Breakpoint 3 at 0xc107e01d: file kernel/module.c, line 1237.
(gdb) c
Continuing.

Breakpoint 3, 0xc107e01d in add_sect_attrs (info=0xdf705f5c, mod=0xe0839060)
    at kernel/module.c:1237
1237			sattr->name = kstrdup(info->secstrings + sec->sh_name,
(gdb) p $eip
$3 = (void (*)()) 0xc107e01d <sys_init_module+5104>
(gdb) p (char *)$eax
$5 = 0xdf690840 ".note.gnu.build-id"

(gdb) ni
1239			if (sattr->name == NULL)
(gdb) p $eip
$12 = (void (*)()) 0xc107e020 <sys_init_module+5107>
(gdb) p ((struct module_sect_attr *)$esi)->name
$15 = 0xdf690840 ".note.gnu.build-id"
(gdb) p /x ((struct module_sect_attr *)$esi)->address
$19 = 0xe0838000
《C++反汇编与逆向分析技术揭秘》笔记-第7章变量在内存中的位置和访问方式 C++反汇编揭秘 阅读详情

相关推荐

头歌平台实战:如何用GDB调试Linux 0.11内核的系统调用(附完整命令清单)

本文详细介绍了在头歌平台上使用GDB调试Linux 0.11内核系统调用的全流程,包括环境配置、调试会话启动、系统调用跟踪技术及实战案例。通过具体命令和技巧,帮助开发者深入理解操作系统内核工作机制,提升调试能力。

weixin_28308325的博客 464

使用gdb调试内核

内核配置需要添加编译信息。建议关闭地址随机化,否则会出现gdb中无法在断点处停下来的情况(尤其是qemu中)。可以参考:https://blog.youkuaiyun.com/gatieme/article/details/104266966在目标板上开启gdbserver模式(虚拟soc中加上gdb调试的选项);在目标板的串口则会有对应的输出信息。

锦小年的博客 2594

跟我一起玩《linux内核设计的艺术》第1章(三)——在运行态下,用gdb调试汇编bootsect.s

坑一:我们再重新看下bootsect.s开头的代码: jmpi go,INITSEG // go: mov ax,cs // mov ds,ax // mov es,ax 先把cs的值赋给ax,再用ax赋值给ds和es……难道不觉得多此一举么?为啥不直接mov ds,cs、mov es,cs,岂不快哉?有人曾专门发微博讨论过这个问题:https://blog.csdn.n...

u013471946的专栏 802

驱动开发:内核实现进程汇编与反汇编

简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用。Capstone旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎,该引擎支持多种平台的反汇编,非常推荐使用。首先是实现驱动部分,驱动程序的实现是一成不变的,仅仅只是做一个读写功能即可,完整的代码如下所示;反汇编函数,该函数的解释如下所示;

微软技术分享 2万+

gdb调试内核

CONFIG_KGDB=y, CONFIG_DEBUG_INFO = y, CONFIG_FRAME_POINTER=y,CONFIG_STRICT_KERNEL_RWX is not set 屏蔽掉该选型然后重新给板子烧录内核镜像。

mantouyouyou的博客 455

在 Windows 10 中通过 WSL2 安装 vLLM 部署本地大模型的方法和步骤

通过 WSL2 在 Windows 10 中部署 vLLM 的核心优势是兼顾 Windows 生态与 Linux 环境的 GPU 加速能力,适合需要在 Windows 下开发但依赖 vLLM 高性能推理的场景。相比原生 Windows 部署(Ollama 等工具),该方案性能更优(接近原生 Ubuntu),且支持更大模型和量化优化。若追求极致性能,建议直接使用 Ubuntu 系统;若必须依赖 Windows 工具链,WSL2 + vLLM 是当前最优选择。

当 AI 开始写文章、绘星空,甚至预测未来,您还在旁观吗?这里将剖开人工智能的思考逻辑,拆解 AI 创作的底层密码,也聊聊人工智能里的人文温度。每篇都有让你拍案的细节,快来解锁 AI 时代的神奇世界! 3753

内核调试的几种方法

1.首先在编译生成内核的时候同时生成了一个vmlinux,使用gdb。    在内核配置时,make menuconfig 要打开complie with debug info选项。    注意这行: PC is at skb_release_data+0x74/0xc4    这告诉我们,skb_release_data函数有0xc4这么大,而Oops发生在0x74处。 那么我

嵌入式与人工智能 3540

Revit二次开发——不启动Revit,做rvt文件数据导出

Revit二次开发——不启动Revit,做rvt文件数据导出Node.js部分调用C#端供外部调用的dllC#部分调用RevitNet.dll,做数据导出exe做外部调用dll总结功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 N

Y.Jerome的专栏 4110

根据内核Oops 定位代码工具使用— addr2line 、gdb、objdump

(这三种工具都在out/host/linux-x86目录下) 内核开发时有时候出现Oops,例如一个野指针会导致内核崩溃,如运行时出现以下log:现在有三种方法可以找出具体出现野指针的地方 [plain] view plain copy print?    5.438972] bells bells:  wm5102-aif1  samsung-i2s.

☆ 默默地牛逼着 7617

DeepSeek+Dify实战:零代码构建智能SQL生成器

本文详细介绍了如何利用DeepSeek和Dify零代码构建智能SQL生成器,帮助非技术人员通过自然语言查询数据库。文章涵盖从数据准备、知识库设计到Agent配置的全流程,并提供了优化技巧和实际应用案例,显著提升团队数据查询效率。

weixin_29311017的博客 418

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

内核的静态分析

一。printk的使用 通过在内核里打印相关信息,可以获得一些我们想知道的信息。 二。分析panic信息 Linux在2.6以后的版本里加强了对panic信息的处理,这样打印到屏幕上的信息已经不是枯燥的寄存器和指令栈的二进制数据了,可以很清楚地看到发生错误时系统调用的back trace以及相关参数。 三。kexec和kdump 四。内核本身提供的调试功能 五。使用gd

829

抓包网络调试工具 reqable抓包教程

如果CA根证书未安装成功,网络图标是黄色,点击盾牌图标可以进入CA根证书安装界面,详细步骤请阅读。在API调试中,获取流量是第一步也是最基本的操作,这里讲解下如何使用Reqable获取流量,通俗地讲就是抓包。我们可以选择一个图片请求,双击打开详情面板,能够看到该请求的详细信息。如果系统代理未设置,网络图标是黄色,点击网络图标可以自动设置系统代理。此域名的结构树,可以查看该域名下所有请求的目录结构,点击选择可以查看该请求的详情。首先,需要启用Reqable的调试功能,点击最右上角的。打开浏览器,输入地址。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2556

转载_Linux内核OOPS调试

以前在写驱动的时候 ,遇到比较多的kernel panic oops 问题,然后  问一些 同事 ,比较多的回答都是加 printk,其实用 GDB 的中的一个功能是能很方便地调试这些问题的。 整理了一下,把自己给一家培训学校写的课件 贴上来。 •第一章 调试  •  •1.1. 工作环境配置  •  •1 )安装好编译用的 kernel-source :RedHat

wxie的Linux人生 8691

边缘AI工业落地:YOLO26-Seg + RK3588 NPU 极致部署(低功耗+实时实例分割,工业场景全覆盖)

本次实战汇总了「YOLO26-Seg+RK3588 NPU」工业边缘部署中最常见、最致命的8个坑点,所有坑点均来自真实工业项目,解决方案均为零代码/一键操作,无需复杂配置,能让你少走90%的弯路,节省大量时间,必看必记!❌ RKNN转换报错「算子不支持/模型加载失败」→ ✅ 导出ONNX时必须指定opset=12,重新导出即可,RK3588唯一兼容版本;❌ 分割mask错位/轮廓模糊 → ✅ 导出ONNX时加,并保证RKNN的归一化参数与YOLO26一致,零代码修复;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1717

基于STM32L4XX、HAL库的STS40-CD1B-R3温度传感器 驱动程序设计

/ HAL库需要左移一位。// 每2秒读取一次。// 等待测量完成 - 高精度模式大约需要15ms。// 执行软复位确保传感器处于已知状态。温度测量范围:-40°C ~ +125°C。湿度测量范围:0% ~ 100% RH。// 复位后需要等待至少1ms。// 初始化STS40传感器。// 读取温湿度数据。// 转换原始数据为实际值。// 发送读取序列号命令。// 读取序列号数据。湿度精度:±1.5% RH。

zhusl6688的博客 287

gdb调试高级用法

Linux下进程崩溃时定位源代码位置 gcc编译器的默认选项设置: gcc -dumpspecs gdb调试打印完整字符串 如何在调试内核时,同时可以调试应用程序的做法: (cskygdb) c Continuing. ^C Program received signal SIGINT, Interrupt. default_idle () at arch/csky/k...

weixin_30340819的博客 1000

3D LUT Color Conversion之总体架构设计之三

摘要:本文提出了一种基于三维坐标一维化寻址的四面体网格编码方法。通过定义全局网格坐标P(R,G,B)=R+9G+81B和局部增量(ξ,η,ζ)∈{0,1},推导出偏移量Δ(ξ,η,ζ)=ξ+9η+81ζ的平移不变性质。该方法将6种坐标排序情况(Case)对应的固定偏移量三元组预先存储,其中V0和V3的偏移量恒定为0和91。硬件实现时只需根据Case选择对应常量组,无需实时计算坐标,显著提高了处理效率。该方案利用线性寻址公式的特性,确保相同局部结构在不同位置具有一致的偏移模式。(149字)

大熊 47

深入解析ARM64内核Oops:从原理到实战调试

ARM64 内核 Oops 是内核态非法操作触发的错误报告(如空指针、非法内存访问),调试核心是定位错误指令→分析异常原因→验证修复效果。本文从 “日志解析→工具调试→实战案例” 三个维度,给出一套标准化的 ARM64 Oops 分析调试流程。

qq_26624977的博客 441

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux panic分析

Oops: 0000 [#1] PREEMPT SMP                Modules linked in: capidrv kernelcapi isdn slhc ipv6 loop dm_multipath snd_ens1371 gameport snd_rawmidi snd_ac97_codec ac97_bus snd_seq_dummy snd_seq_oss

YuZhiHui_No1的专栏 1332

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux内核态和用户态调试

调试

夏天Alex 1089

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

实验探究2.1:时钟中断的调试与追踪

本文详细介绍了在Linux-0.11内核中时钟中断的调试与追踪方法,包括实验环境搭建、中断追踪分析以及内核源码修改。通过使用Bochs模拟器和GDB调试器,读者可以深入理解时钟中断的处理机制,并掌握相关调试技巧。文章还提供了修改内核输出调试信息的实用示例,帮助开发者更好地进行内核级调试。

weixin_30855761的博客 296

vmlinux 反汇编_如何反汇编核心的某个指定函数(如setup_arch),如何使反汇编中包含源代码的行号?...

Subject: 如何反汇编核心的某个指定函数(如setup_arch),如何使反汇编中包含源代码的行号?请指教,谢谢Author: sanford Posted: 2003-07-02 13:36 Length: 0 byte(s)[Original] [Print] [Top][Original] [Print] [Top]Subject: Re: 如何反汇编核心的某个指定函数(如...

weixin_36226933的博客 519

使用gdb分析kernel panic

http://blog.youkuaiyun.com/leopard_ray/article/details/5144525 Oops: 0000 [#1] PREEMPT SMP                Modules linked in: capidrv kernelcapi isdn slhc ipv6 loop dm_multipath snd_ens1371 gameport s

2190

Linux调试工具

gdb,git,readelf,objdump,nasm常用命令

Take Easy,Work Hard! 3385
上一篇: 深入Linux网络核心堆栈--netfilter详解(整理)
下一篇: 在qemu中增加pci设备并用linux驱动验证
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值