阅读:1372回复:8
请教Ring0问题
1.怎样给Ring0程序传递参数?
2.Ring0程序段中能使用SEH吗? { DWORD dwRing0CodeAddr; g_dwBuffer = (DWORD)lpBuffer; g_dwAddress = dwAddress; g_dwLen = dwLen; __asm { mov eax, offset Ring0Code_Start mov dwRing0CodeAddr, eax jmp Ring0Code_End Ring0Code_Start: cli push offset m_SEHandler push fs:[0] mov fs:[0], esp jmp near j_Start m_SEHandler: pop eax pop ebx mov fs:[0], eax mov g_dwRet, 0 sti retf j_Start: cld mov ecx, g_dwLen mov edx, ecx shr ecx, 2 mov esi, g_dwAddress mov edi, g_dwBuffer rep movsd mov ecx, edx and ecx, 0x3 rep movsb pop eax pop ebx mov fs:[0], eax mov g_dwRet, 1 sti retf Ring0Code_End: } return Ring0Exec((DWORD)dwRing0CodeAddr, 0x1000) & g_dwRet; } 上面的程序段回蓝屏,是什么原因呢? 谢谢大家,我的qq:275804080 [编辑 - 2/16/05 by fire2fire] |
|
沙发#
发布于:2005-02-12 22:04
以上程序段是读取任意线性地址的指定长度的数据,用VC调试,如果该线性地址不存在,调试器会停在m_SEHandler处,(难道此处不是在Ring0了)?如果直接运行,则会立即重启!
[编辑 - 2/12/05 by fire2fire] |
|
板凳#
发布于:2005-02-13 17:12
你这段程序是在驱动中吗?怎么运行,在什么环境,没有上下文无法考虑
|
|
|
地板#
发布于:2005-02-13 20:03
Ring0Exec((DWORD)dwRing0CodeAddr, 0x1000)
是在Ring0中运行dwRing0CodeAddr开始处0x1000字节的代码。 不是在驱动程序中,是通过调用门进入Ring0运行的。 |
|
地下室#
发布于:2005-02-14 17:18
Ring0Exec((DWORD)dwRing0CodeAddr, 0x1000) 那么肯定你在win9x下执行这段代码了? |
|
|
5楼#
发布于:2005-02-15 12:08
1.怎样给Ring0程序传递参数?
在X86-32下的CALLGATE中可以指定传递参数个数,可以最多拷贝32个参数由RING3堆栈到RING0堆栈,但你在RETF返回的时候必须自己平衡堆栈. 在X86-64下的CALLGATE不支持堆栈间的参数拷贝,不过你可以在RING0中访问RING3堆栈,所以也没影响. 2.Ring0程序段中能使用SEH吗? 可以,SEH是由OS来实现,FS:[0]来实现,而RING3,和RING0的FS指向不同的SEH连表.... |
|
|
6楼#
发布于:2005-02-16 09:05
1.怎样给Ring0程序传递参数? 首先,我觉得应搞清楚他要怎么样进ring0,在什么操作系统,9x下通过后门可以进入,nt下一般要用驱动程序,(否则通过ntvdm),调用门的事情,只有有ring0许可才可以干! |
|
|
7楼#
发布于:2005-02-16 10:21
[quote]1.怎样给Ring0程序传递参数? 首先,我觉得应搞清楚他要怎么样进ring0,在什么操作系统,9x下通过后门可以进入,nt下一般要用驱动程序,(否则通过ntvdm),调用门的事情,只有有ring0许可才可以干! [/quote] nt下通过\\DEVICE\PHYSICALMEMORY即可在GDT上生成CALLGATE,而NTVDM的方法已经被MS在XP-SP2里禁止了. |
|
|
8楼#
发布于:2005-02-16 20:44
谢谢楼上的,能不能加你qq?
怎么给你加分呢? 我曾经尝试在调用门里面设置了参数,然后在Ring3堆栈压如了指定个数的参数,进入ring0后不过好像不行~ 在Ring0中使用SEH,堆栈怎么平衡不太清楚,帮我看看上面的程序中的SEH处理程序的问题? |
|