-
-
[旧帖]
[原创]内核学习的心得体会与关键技术
0.00雪花
-
发表于:
2012-7-12 08:44
1782
-
[旧帖] [原创]内核学习的心得体会与关键技术
0.00雪花
写下这篇帖子是因为我最近老是遇到蓝屏问题,并且对问题发问还得到的都是一些错误答案,经过两天的深入学习和到各大学资料库里整理,学习,最终得到以下几点误区,希望新手同学能够少走一些弯路,当然以下如果有不对的地方也请指出,相互学习。
第一点 SSDT SHADOW表并非被分页到了硬盘
第二点 ring 0并不是计算机的最高权限,在奔腾4以后,已经在硬件上引入了ring -1的概念,当然前提是进入ring 0控制关键寄存器使程序接管ring -1,这也是基于VT技术的调试器原理,当然AMD也是支持的,国内外相关资料很少,但是国外有个开源项目,blue pills 蓝色药丸
第三点 在SSDT 表中的一些不被常用的函数,是经常被交换的,当你使用硬编码或者读取内存时,先判断是否可读写再进行操作,或者适当降低中断级,也可以先调用一次那个函数,例如 kd就没有降低,导致有些函数反汇编的时候是无响应的,而XT做的比较好,会在读取不出的情况降低中断级再一次尝试读取。
第四点 在多核情况下,每个核都维护各自的相关寄存器
第五点 因为第四点,所以在关保护与中断的时候,并不是绝对安全的,或者这么说,在你的程序里HOOK了一个函数,但是别的CPU正在读取那个函数,这样就会产生非预料的错误,因为你只关闭了当前的CPU的中断,我查尽了所有资料,都没有确保稳定的方法,也有向CPU所有核心插入APC的,当然我们这些小菜,用一下自旋锁就差不多了
第六点 对于IRQL的概念,在使用的时候尽量使中间代码少一点,这样非预料的错误就少一点,比如有些函数在WDK中查不到,但是我们在并不知道他的中断级下用了,这样蓝屏的几率就大了,有一些函数会在内部使用自旋锁,这样中断级就到了2,这都是后台的,我们看不见的。这时读取分页内存时会发生一定几率的蓝屏。
最后一点 说一下我最讨厌的两类人
第一类 有技术但是不喜欢共享的人,偶然间发现他会的没有分享技术被别人分享了,就会跳出来振振有词。
第二类 啥也不会的但是自认为自己啥都会了的脚本小子。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)