愤怒的大鸟 发表于 2015-1-16 12:58:28

来谈谈:定位可静态加载的内核模块的OOPS代码行

写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。以上是我学习Linux的心得体会,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。
1.从vmlinux猎取详细的代码行
文章中albcamus版主也提到了,必要有本人编译的vmlinux,并且编译时翻开compilewithdebuginfo.这个选项翻开以后会使vmlinux文件比不加调试信息年夜一些。我这里代调试信息的是49M。倡议假如进修的时分,想利用gdb的体例猎取堕落代码行的话,就加上这个编译前提。
然后就能够依照详细的办法往操纵,能够定位到详细的C代码行。
2.从本人编译的内核模块堕落信息中猎取代码行以ldd3中供应的misc-modules/faulty.c为例。次要以faulty_write函数作剖析。
(1)因为作者供应的函数代码就一样,过于复杂,我这里复杂加上一些代码(也就是判别和赋值),以下:
ssize_tfaulty_write(structfile*filp,constchar__user*buf,size_tcount,
loff_t*pos)
{
/*makeasimplefaultbydereferencingaNULLpointer*/
if(count>0x100)
count=0x100;
*(int*)0=0;
returncount;
}
(2)编译该模块,而且mknod/dev/faulty(3)向该模块写进数据:echo1>/dev/faulty,内核OOPS,信息以下:
<1>BUG:unabletohandlekernelNULLpointerdereferenceatvirtualaddress00000000
printingeip:
f8e8000e
*pde=00000000
Oops:0002[#3]
SMP
Moduleslinkedin:faultyautofs4hidprfcomml2cap......//此处省略多少字符
CPU:1
EIP:0060:[<f8e8000e>]NottaintedVLI
EFLAGS:00010283(2.6.18.3#2)
EIPisatfaulty_write+0xe/0x19
eax:00000001ebx:f4f6ca40ecx:00000001edx:b7c2d000
esi:f8e80000edi:b7c2d000ebp:00000001esp:f4dc5f84
ds:007bes:007bss:0068
Processbash(pid:6084,ti=f4dc5000task=f7c8d4d0task.ti=f4dc5000)
Stack:c1065914f4dc5fa4f4f6ca40fffffff7b7c2d000f4dc5000c1065f06f4dc5fa4
0000000000000000000000000000000100000001c1003d0b00000001b7c2d000
0000000100000001b7c2d000bfd40aa8ffffffda0000007bc100007b00000004
CallTrace:
[<c1065914>]vfs_write+0xa1/0x143
[<c1065f06>]sys_write+0x3c/0x63
[<c1003d0b>]syscall_call+0x7/0xb
Code:BadEIPvalue.
EIP:[<f8e8000e>]faulty_write+0xe/0x19SS:ESP0068:f4dc5f84
个中,我们应当存眷的信息是第一行白色标出部分:告知我们操纵了NULL指针。其次,就是第二行白色部分:EIPisatfaulty_write+0xe/0x19。这个堕落信息告知我们EIP指针呈现成绩的中央时faulty_write函数,并且指出了是faulty模块。
同时,faulty_write+0xe/0x19的后半部分0xe/0x19,申明该函数的巨细时0x019,堕落地位是在0x0e。这两个值应当值得都是汇编代码的值。
(4)将faulty
123下一页


系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;

愤怒的大鸟 发表于 2015-1-16 13:09:20

来谈谈:定位可静态加载的内核模块的OOPS代码行

看不懂man文档的人.在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有.
模块反汇编出汇编代码:</P>objdump-dfaulty.ko>faulty.s

objdump-dfaulty.o>faulty.s然后,我们翻开faulty.s文件。因为我们必要存眷的部分恰好在文件的后面,因而我这里只贴出文件的后面一部份内容:
faulty.o:fileformatelf32-i386
Disassemblyofsection.text:
00000000<faulty_write>:
0:81f900010000cmp{GetProperty(Content)}x100,%ecx6:b800010000mov{GetProperty(Content)}x100,%eaxb:0f46c1cmovbe%ecx,%eaxe:c7050000000000movl{GetProperty(Content)}x0,0x0
15:000000
18:c3ret
00000019<cleanup_module>:
19:a100000000mov0x0,%eax1e:ba00000000mov{GetProperty(Content)}x0,%edx
23:e9fcffffffjmp24<cleanup_module+0xb>
00000028<faulty_init>:
28:a100000000mov0x0,%eax2d:b900000000mov{GetProperty(Content)}x0,%ecx32:ba00000000mov{GetProperty(Content)}x0,%edx
37:e8fcffffffcall38<faulty_init+0x10>
3c:85c0test%eax,%eax
3e:7813js53<faulty_init+0x2b>
40:833d0000000000cmpl
上一页123下一页


对于linux命令,一定要学会用man和info去查他们的解释;

愤怒的大鸟 发表于 2015-1-16 13:19:39

来谈谈:定位可静态加载的内核模块的OOPS代码行

安装和登录命令:login、shutdown、halt、reboot、mount、umount、chsh
{GetProperty(Content)}x0,0x0</P>47:7403je4c<faulty_init+0x24>
49:31c0xor%eax,%eax
4b:c3ret
4c:a300000000mov%eax,0x051:31c0xor%eax,%eax
53:c3ret
由以上汇编代码能够看出,faulty_write函数的巨细的确是0x18-0x00+1=0x19.那末EIP指针出成绩的中央是0x0e处,代码为:
e:c7050000000000movl{GetProperty(Content)}x0,0x0
这行汇编代码就是将0值保留到0地点的地位。那末很明显长短法的。这一行对应的C代码应当就是:
*(int*)0=0;
(5)以上是对模块堕落信息的剖析。不外也有必定的范围。
起首就是EIP堕落的地位恰好在本模块外部,如许能够在本模块定位成绩;其次,请求必定的汇编基本,出格是当一个函数的代码对照多时,对应的汇编代码也对照年夜,怎样正确定位到C代码行必要必定的履历和工夫。
实践使用中,能够将内核代码行的定位和可静态加载的内核模块代码行的定位分离起来利用,应当能够较快的定位成绩。
剖析中有忽略大概不当的中央但愿人人指出,也但愿有网友分享更无效的办法
</p>上一页123


但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的。

乐观 发表于 2015-1-18 16:45:59

下面笔者在论坛看到的一个好问题: “安装红旗4.0后,系统紫光输入法自带的双拼方案和我的习惯不一样,如何自定义双拼方案解决?谢谢?”这个问题很简练。

再见西城 发表于 2015-1-27 12:33:23

放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。

柔情似水 发表于 2015-2-5 13:35:32

随着IT从业人员越来越多,理论上会有更多的人使用Linux,可以肯定,Linux在以后这多时间不会消失。

蒙在股里 发表于 2015-2-12 02:00:16

如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。 Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人。

冷月葬花魂 发表于 2015-3-2 22:10:05

熟读Linux系统有关知识,如系统目录树,有关内容可购书阅读或搜索论坛。

只想知道 发表于 2015-3-11 08:30:32

Linux?最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具,所以Linux操作系统有着广泛的应用空间。

若相依 发表于 2015-3-18 07:20:59

我是学习嵌入式方向的,这学期就选修了这门专业任选课。

变相怪杰 发表于 2015-3-25 18:26:05

虽然大家都比较喜欢漂亮的mm,但是在学 linux 的过程中,还是要多和“男人”接触一下:P 遇到问题的时候,出来看说和上网查之外,就是要多用 linux 下的 man 命令找找帮助。
页: [1]
查看完整版本: 来谈谈:定位可静态加载的内核模块的OOPS代码行