用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

Cube.js 安装避坑指南:从零到一键启动

本文是一份详细的Cube.js安装避坑指南,旨在帮助开发者从零开始顺利启动Cube.js。文章重点强调了安装前的环境准备,包括Node.js版本、包管理工具和项目路径等关键“地基”,并深入解析了使用npx安装的优势、数据库类型选择以及数据库连接配置的核心步骤与常见陷阱,确保您能高效完成安装并成功启动服务。

weixin_29218509的博客 429

内核调试的几种方法

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

嵌入式与人工智能 3540

3D点云修复实战:用PCN网络快速补全缺失的激光雷达数据(附代码)

本文详细介绍了PCN(Point Completion Network)网络在3D点云修复领域的实战应用。针对激光雷达数据常见的缺失问题,PCN通过端到端的深度学习架构,直接处理原始点云,实现由粗到精的快速补全。文章深入解析了其核心思想与编码器-解码器架构,并提供了完整的环境搭建、数据准备、模型实现、训练评估及在真实场景下的优化策略与代码示例,为自动驾驶、机器人等领域的开发者提供了高效的数据修复解决方案。

weixin_29041195的博客 392

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

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

☆ 默默地牛逼着 7617

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

详解电路设计中的RC电路

​ 一、什么是RC电路 RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用到 的电路。 常见的RC充、放电电路、RC积分电路合RC微分电路接下来详细讲解。 二、RC充、放电电路 RC充、放电电路如下图所示,下面通过充电和放电两个过程来分析此电路。 ​RC充、放电电路图 (1)RC充电电路 RC充电电路图如下图(a)所示 RC充电电路图及充电曲线图 ​由上图分析: 将上图a中开关S置于“1”处,电源E开始通过电阻R对电容C充电,由于刚开始充电时电容两端没有..

IT xiaobai 4万+

内核的静态分析

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

829

Multisim新手必看:从零搭建数字时钟仿真电路(附完整原理图)

本文详细介绍了如何使用Multisim从零开始搭建数字时钟仿真电路,涵盖晶振电路设计、计数电路实现、校时功能配置等关键步骤。通过完整的原理图和实用技巧,帮助新手快速掌握Multisim仿真设计,实现精准的数字时钟功能。

ios99的博客 328

转载_Linux内核OOPS调试

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

wxie的Linux人生 8691

【Simscape】用Simscape实现三维物理仿真(三)——创建一个滑块单摆系统

1 首先创建一个Simscape Multibody 模型 (方法见 【Simscape】用Simscape实现三维物理仿真(一)——创建一个自由落体小球) 2 创建四个Solid模块 (1)摆杆 Shape : Brick Dimensions : [0.1 0.05 1] m (2)摆杆轴 Shape : Cylinder Radius : 0.02 m Le...

ReadAir的专栏 9034

Amesim管路仿真进阶:如何用阻力管实现不规则管路的高精度模拟

本文深入探讨了在Amesim仿真中,如何利用阻力管(Orifice with Table)元件,特别是TFORT0子模型,实现对不规则管路的高精度模拟。通过直接输入基于测试或CFD的流量-压降数据,该方法能有效弥补标准管路模型在复杂流道、内部结构复杂等场景下的不足,为液压、热管理等系统仿真提供精准可靠的部件模型。

cicd6pipeline的博客 670

gdb调试高级用法

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

weixin_30340819的博客 1000

ollama服务暴露公网?三步搞定Nginx反向代理配置(避坑指南)

本文详细介绍了如何通过Nginx反向代理安全地将Ollama服务暴露到公网,避免直接修改OLLAMA_HOST带来的安全隐患。文章提供了从SSL证书部署到高级安全加固的全流程实战指南,包括IP白名单、基础认证、速率限制等企业级安全措施,帮助用户实现安全可靠的外部访问。

wood5的博客 177

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

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

qq_26624977的博客 441

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

linux内核态和用户态调试

调试

夏天Alex 1089

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

实验探究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、付费专栏及课程。

余额充值