阅读:3002回复:5
面对双核和64位,我把这几天的经验总结一下......
网上很多代码都还停留在32位单核的时代 , 放代码时也没说明测试环境和注意事项 ,
所以往往导致一部分人莫名其妙的重启死机....... 我建议以后大家放RING0代码时都应该注明一下运行环境! 最近工作不算忙,于是兴趣来了, 准备再玩玩N年前的调用门.......问题由此引发...... 找到了沉睡N年的代码(就是wowocook的RING3下安装调用门进RING0),直接运行,让扬声器叫了几声, 成功是意料之中的......接着再调用 ExAllocatePoolWithTag 分配非分页内存,也异常顺利..... 后来因为不想折磨我的本本了,就把代码拿到隔壁办公室的机子上去调试,问题来了...... 一运行就重启......用softice抓BUG,结果花屏+蓝屏....无语!! 冷静下来,想起这机子是64位双核! 再冷静,这 系统是XP SP2,而且记得64位CPU是支持硬件DEP的!! 对了! 我那个 ret 放在了gdt区域,而gdt区域是数据段属性,当然会惹怒DEP了... 马上在BOOT.INI中关闭DEP,重启后再运行,OK,正常! 看来真的是DEP在作怪... 慢!还没完,程序运行时会偶尔的出错! 原来双核CPU有2个GDT,里面的描述是一样的,而我只修改了其中一个,当我的线程执行调用门时要是恰好被切换到另一个CPU,而那个CPU的GDT中并没有安装调用门的话,当然就是保护违例了........ 还有!!我只是进了R0,但什么都没做......后来加了点发声的代码,大概让扬声器叫1秒,结果又重启了!!!! 仔细一想,我使用的是 mov ecx,0c000000h loop$ 硬延时,这么长的时间,线程会切换,CPU会切换... 延时那么久,要是从R0返回R3时正好切换到另一块CPU的话...... 此时的环境已经变了,当然会出问题了, 解决办法就是用CLI锁定当前CPU ,这么做了后,果然不再死机 但现在还有一个问题没有解决,就是调用ExAllocatePoolWithTag 仍然会重启!希望各位牛指教一下! 还有不知道在多核中是不是每个核的IDTR也不一样? ================================================================== 个人认为在多核中使用调用门来进R0已经不适用了,虽然上面说的问题有解决的办法, 比如绑定CPU分别设置调用门,但很麻烦了, 我个人认为安装R0门应该使用SSDT的方法,用fastcall门... 还有要注意DEP的影响!!现在64位CPU已经很普及了!大家一定要引起重视 |
|
沙发#
发布于:2008-03-15 23:42
DEP的话,可以随便找个内核函数,有RET即可,CALLGATE指向他即可.同时确实要对每个Cpu都HOOK.不过现在CPU的更新了不少,老代码问题很多,建议不要修改XDT了,还是走点规范的历程吧.出来混的总有一天要还的.
|
|
|
板凳#
发布于:2008-03-16 13:20
呵呵,首先感谢 znsoft老大的鼓励,也不枉费我那2天死了几十次机.....
wowocock 说的方法我也想过,但还是有问题,如果你调用系统函数的话,CPU时间片一到,在系统内部切换CPU后就有很大的问题......... (我2个CPU都HOOK了,但调用ExAllocatePoolWithTag 还是会重启...) ,wowocock 你有空的话试试!! 反正我感觉在多核系统中,运行的时候不能轻易切换选择子,你可以试试,就算你不调用系统函数而是用mov ecx,0c000000h loop$ ,不加CLI也会重启!! |
|
地板#
发布于:2008-03-29 22:02
请把代码贴出来,让我们分析下。。
多核CPU,每个核都有自己的xDT。Windows的内核线程调度和中断处理都作了改变。貌似内存管理基本没变。。当然x64下,内存管理做了些改变。。 如果有可能的话,进入rong0用一个spin lock,哈哈。。。 |
|
|
地下室#
发布于:2008-03-30 20:42
spin lock 没有用,还不如CLI
其实还是有不少办法的,我发在看雪里了....... |
|
5楼#
发布于:2008-10-01 21:25
现在还看不太懂~~~~
|
|