studehard
驱动牛犊
驱动牛犊
  • 注册日期2008-02-28
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分1分
  • 专家分0分
阅读:2884回复:5

面对双核和64位,我把这几天的经验总结一下......

楼主#
更多 发布于:2008-03-15 11:28
网上很多代码都还停留在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已经很普及了!大家一定要引起重视



wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-03-15 23:42
DEP的话,可以随便找个内核函数,有RET即可,CALLGATE指向他即可.同时确实要对每个Cpu都HOOK.不过现在CPU的更新了不少,老代码问题很多,建议不要修改XDT了,还是走点规范的历程吧.出来混的总有一天要还的.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
studehard
驱动牛犊
驱动牛犊
  • 注册日期2008-02-28
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2008-03-16 13:20
呵呵,首先感谢 znsoft老大的鼓励,也不枉费我那2天死了几十次机.....  

wowocock 说的方法我也想过,但还是有问题,如果你调用系统函数的话,CPU时间片一到,在系统内部切换CPU后就有很大的问题......... (我2个CPU都HOOK了,但调用ExAllocatePoolWithTag 还是会重启...) ,wowocock 你有空的话试试!!

反正我感觉在多核系统中,运行的时候不能轻易切换选择子,你可以试试,就算你不调用系统函数而是用mov ecx,0c000000h    loop$  ,不加CLI也会重启!!
   
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-03-29 22:02
请把代码贴出来,让我们分析下。。
多核CPU,每个核都有自己的xDT。Windows的内核线程调度和中断处理都作了改变。貌似内存管理基本没变。。当然x64下,内存管理做了些改变。。
如果有可能的话,进入rong0用一个spin lock,哈哈。。。
I will do the best with what the God gave me.
studehard
驱动牛犊
驱动牛犊
  • 注册日期2008-02-28
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2008-03-30 20:42
spin lock 没有用,还不如CLI

其实还是有不少办法的,我发在看雪里了.......
chelalv
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2010-04-15
  • 粉丝1
  • 关注0
  • 积分22分
  • 威望146点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-10-01 21:25
现在还看不太懂~~~~
游客

返回顶部