我正在尝试破解/理解nullfs内核模块(在FreeBSD上)所以为此,我做了 以下内容:
在目标计算机上:
kldstat
给出:
Id Refs Address Size Name
1 10 0xffffffff80200000 17e10c8 kernel
2 1 0xffffffff819e2000 4cf0 vmxnet.ko
3 1 0xffffffff819e7000 16e0 echo.ko
4 1 0xffffffff81c11000 23dc vmmemctl.ko
5 1 0xffffffff81c14000 641b nullfs.ko
nm /boot/kernel/nullfs.ko | grep mount
00000000000018f0 t null_getwritemount
0000000000000540 t nullfs_mount
0000000000000930 t nullfs_unmount
U vfs_mountedfrom
U vop_getwritemount_desc
在通过命名管道连接到目标的本地计算机上 作为串行控制台(我正在使用虚拟机):
(kgdb) tr0
kdb_sysctl_enter (oidp=<value optimized out>, arg1=<value optimized out>,
arg2=0xfffffe004e7cc7f0,
req=<value optimized out>) at /usr/src/sys/kern/subr_kdb.c:446
446 kdb_why = KDB_WHY_UNSET;
Current language: auto; currently minimal
(kgdb) getsyms
During symbol reading, Incomplete CFI data; unspecified registers at
0xffffffff8099497a.
Id Refs Address Size Name
1 10 0x80200000 17e10c8 kernel
2 1 0x819e2000 4cf0 vmxnet.ko
3 1 0x819e7000 16e0 echo.ko
4 1 0x81c11000 23dc vmmemctl.ko
5 1 0x81c14000 641b nullfs.ko
Select the list above with the mouse, paste into the screen
and then press ^D. Yes, this is annoying.
5 1 0x81c14000 641b nullfs.ko
add symbol table from file
"/usr/obj/usr/src/sys/AIJAZ-DEBUG/modules/usr/src/sys/modules/nullfs/nullfs.ko.debug"
at
.text_addr = 0x81c14000
.data_addr = 0x81c14000
.bss_addr = 0x81c14000
(kgdb) add-kld nullfs.ko
add symbol table from file "/boot/kernel/nullfs.ko.symbols" at
.text_addr = 0xffffffff81c14000
set_sysinit_set_addr = 0xffffffff81c15c90
set_sysuninit_set_addr = 0xffffffff81c15cb0
.rodata.str1.1_addr = 0xffffffff81c15cc8
set_modmetadata_set_addr = 0xffffffff81c15e48
set_sysctl_set_addr = 0xffffffff81c15e58
.data_addr = 0xffffffff81c15e60
.bss_addr = 0xffffffff81c16360
(y or n) y
Reading symbols from /boot/kernel/nullfs.ko.symbols...
location expression too complex...done.
(kgdb) b nullfs_mount
Cannot access memory at address 0x81c14540
从上面的'nm'和'kldstat'的输出可以看出地址 确实是对的。
我甚至尝试在上面的地址设置“硬件断点”:
(kgdb) hbreak *0x81c14540
Hardware assisted breakpoint 1 at 0x81c14540: file
/usr/src/sys/modules/nullfs/../../fs/nullfs/null_vfsops.c, line 74.
(kgdb) c
Continuing.
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0x81c14540: Input/output error.
但是这次虽然注册了断点,但它永远不会被插入。在Linux上搜索此错误时,似乎可以解决这个问题 通过关闭CONFIG_DEBUG_RODATA作为内核配置的一部分(作为 每个link似乎是某种保护机制,它检测内核的文本部分由于某种原因被覆盖的时间)。这有助于设置软件断点,否则将无法设置。我不知道这是否也是原因。
其次我想知道虽然目标上的实际地址在0xffffffff00000000
以上,但调试器只报告低8位。是因为它被理解/假设?
很高兴收到你们的消息
答案 0 :(得分:0)
没有直接回答为什么它发生了(我还没有研究过),我建议在QEMU中运行,它实现了自己的GDB服务器,而不是使用FreeBSD内核中的那个。如果在没有硬件虚拟化的情况下运行QEMU,您甚至可以在任何地方可靠地设置SW断点。