• <fieldset id='7klrm'></fieldset>
    1. <i id='7klrm'></i>
      1. <tr id='7klrm'><strong id='7klrm'></strong><small id='7klrm'></small><button id='7klrm'></button><li id='7klrm'><noscript id='7klrm'><big id='7klrm'></big><dt id='7klrm'></dt></noscript></li></tr><ol id='7klrm'><table id='7klrm'><blockquote id='7klrm'><tbody id='7klrm'></tbody></blockquote></table></ol><u id='7klrm'></u><kbd id='7klrm'><kbd id='7klrm'></kbd></kbd>

          <code id='7klrm'><strong id='7klrm'></strong></code>
          <ins id='7klrm'></ins>

          <dl id='7klrm'></dl>

        1. <i id='7klrm'><div id='7klrm'><ins id='7klrm'></ins></div></i>
        2. <span id='7klrm'></span>

            <acronym id='7klrm'><em id='7klrm'></em><td id='7klrm'><div id='7klrm'></div></td></acronym><address id='7klrm'><big id='7klrm'><big id='7klrm'></big><legend id='7klrm'></legend></big></address>

            定位可动态加载的内核模块的OOPS代码行

            • 时间:
            • 浏览:2
            • 来源:124软件资讯网

              1. 从vmlinux获取详细的代码行

              文章中albcamus版主也提到了  ,需要有自己编译的vmlinux  ,而且编译时打开compile with debug info. 这个选项打开之后会使vmlinux文件比不加调试信息大一些  。我这里代调试信息的是49M 。建议若是学习的时间 ,想使用gdb的方式获取堕落代码行的 话 ,就加上这个编译条件  。

              然后就可以根据详细的要领去操作  ,可以定位到详细的C 代码行  。

              2. 从自己编译的内核模块堕落信息中获取代码行以ldd3中提供的misc-modules/faulty.c为例  。主要以faulty_write函数作剖析  。

              (1)由于作者提供的函数代码就一样 ,过于简朴  ,我这里简朴加上一些代码(也就是判断和赋值)  ,如下:

              ssize_t faulty_write (struct file *filp, const char __user *buf, size_t count,

              loff_t *pos)

              {

              if(count > 0x100)

              count = 0x100;

              *(int *)0 = 0;

              return count;

              }

              (2)编译该模块  ,而且mknod /dev/faulty(3)向该模块写入数据:echo 1 > /dev/faulty, 内核OOPS  ,信息如下:

              <1>BUG: unable to handle kernel NULL pointer dereference at virtual address 00000000

              printing eip:

              f8e8000e

              *pde = 00000000

              Oops: 0002 [#3]

              SMP

              Modules linked in: faulty autofs4 hidp rfcomm l2cap ...... //此处省略若干字符

              CPU: 1

              EIP: 0060:[] Not tainted VLI

              EFLAGS: 00010283 (2.6.18.3 #2)

              EIP is at faulty_write+0xe/0x19 [faulty]

              eax: 00000001 ebx: f4f6ca40 ecx: 00000001 edx: b7c2d000

              esi: f8e80000 edi: b7c2d000 ebp: 00000001 esp: f4dc5f84

              ds: 007b es: 007b ss: 0068

              Process bash (pid: 6084, ti=f4dc5000 task=f7c8d4d0 task.ti=f4dc5000)

              Stack: c1065914 f4dc5fa4 f4f6ca40 fffffff7 b7c2d000 f4dc5000 c1065f06 f4dc5fa4

              00000000 00000000 00000000 00000001 00000001 c1003d0b 00000001 b7c2d000

              00000001 00000001 b7c2d000 bfd40aa8 ffffffda 0000007b c100007b 00000004

              Call Trace:

              [] vfs_write+0xa1/0x143

              [] sys_write+0x3c/0x63

              [] syscall_call+0x7/0xb

              Code: Bad EIP value.

              EIP: [] faulty_write+0xe/0x19 [faulty] SS:ESP 0068:f4dc5f84

              其中  ,我们应该关注的信息是第一行红色标出部门:告诉我们操作了NULL指针  。其次  ,就是第二行红色部门:EIP is at faulty_write+0xe/0x19 。这个堕落信息告诉我们EIP指针泛起问题的地方时faulty_write函数  ,而且指出了是faulty 模块 。

              同时  ,faulty_write+0xe/0x19的后半部门0xe/0x19  ,说明该函数的巨细时0x019,堕落位置是在0x0e  。这两个值应该值得都是汇编代码的值  。

              (4)将faulty123下一页