第四讲内核模块不可调试之谜 李林 电子科技大学计算机学院
第四讲 内核模块不可调试之谜 李 林 电子科技大学 计算机学院
内核模块不可调试之谜 问题 练习程序员手段之调试驱动程序 调试内核版本3.13.0中的驱动程序(代码 4.1) 问题 停在断点之后,不能继续往下运行了 可能是什么原因?
内核模块不可调试之谜——问题 ◼ 练习程序员手段之调试驱动程序 ◼ 调试内核版本3.13.0中的驱动程序(代码 4.1) ◼ 问题: ◼ 停在断点之后,不能继续往下运行了 ◼ 可能是什么原因?
内核模块不可调试之谜 问题 利用反汇编手段,分析问题 再次调试程序,并反汇编发现: 0xffffffffa0272235 <+30> mov %cr3,%rax Oxffffffffa0272238 <+33>: mov %rax,-0x8(%rbp) Oxffffffffa027223c <+37>: int3 Oxffffffffa027223d <+38>: out %eax,(%dx) Oxffffffffa027223e <+39>: std Oxffffffffa027223f <+40>: (bad) Oxffffffffa0272240 <+41> dec %ecx Oxffffffffa0272242 <+43>: retq 什么是int3(trap)? 为什么会有int3(机器码0xcc)?能想到 什么?
内核模块不可调试之谜——问题 ◼ 利用反汇编手段,分析问题 ◼ 再次调试程序,并反汇编发现: ◼ 什么是int 3(trap)? ◼ 为什么会有int 3(机器码0xcc)?能想到 什么?
内核模块不可调试之谜 问题 调试器的基本原理 设置断点并continue后,调试器会将断点处的 内存修改为0xcC 运行到断点处后,相当于执行int3的处理函数, 即调试器的主要工作环境 ·同时,调试器会将断点处的0xcc修改为原值 kgdb不能往下执行的原因:在于没有将Oxcc 改回原值 问题来了:为什么没有改回原值?
内核模块不可调试之谜——问题 ◼ 调试器的基本原理 ◼ 设置断点并continue后,调试器会将断点处的 内存修改为0xcc ◼ 运行到断点处后,相当于执行int 3的处理函数, 即调试器的主要工作环境 ◼ 同时,调试器会将断点处的0xcc修改为原值 ◼ kgdb不能往下执行的原因:在于没有将0xcc 改回原值 ◼ 问题来了:为什么没有改回原值?
内核模块不可调试之谜 猜想 为什么没有改回原值? 代码有bug 代码忘写了 会不会驱动代码所在的物理页面不可写?
内核模块不可调试之谜——猜想 ◼ 为什么没有改回原值? ◼ 代码有bug ◼ 代码忘写了 ◼ …………… ◼ 会不会驱动代码所在的物理页面不可写?