阅读:1045回复:8
装了SoftIce为何不能进ring0?
SI改了什么?改了什么内存保护策略???难道把GDT搬家了?
大家看看进入ring0的一段地址转换代码 ULONG MiniMmGetPhysicalAddress(ULONG virtualaddress) { if(virtualaddress<0x80000000||virtualaddress>=0xA0000000) return 0; return virtualaddress&0x1FFFF000; } 我看ntoskrnl里的代码是那个return 0的地方其实也用一种复杂的方法转换了,但这里返回0,怎么回事?我记得以前好像看到过解释,忘记了 :( |
|
|
沙发#
发布于:2002-06-25 12:22
改了什么内存保护策略
------------------------------------------------------------------------ 见HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management下EnforceWriteProtection 主要是Softice需要在钩挂函数入口加int3(0xCC)等操作,直接让内核保护地址可写(我这装了SI,CR0的WP始终为0),其它并没有变什么。 但这里返回0,怎么回事 ------------------------------------------------------------------------------ 你这是那个ring3->ring0程序的片段吧。因为那个程序只需要改GDT,所以只需要得到表所在的地址区间(0x80000000-0xa0000000),其它的返回0就可以了,不用管它. |
|
板凳#
发布于:2002-06-25 12:34
你这是那个ring3->ring0程序的片段吧。因为那个程序只需要改GDT,所以只需要得到表所在的地址区间(0x80000000-0xa0000000),其它的返回0就可以了,不用管它. 霍藿,但它在我的2K(装了SI)也返回0,霍藿,我问的是是不是SI把GDT搬家了? |
|
|
地板#
发布于:2002-06-25 12:43
当然没有搬的理由啦。我这的GDT基址:0x800036000
你一定其它地方错了,hehe 不过还是用SI“GDT”指令查一下吧,不可能改呀。 |
|
地下室#
发布于:2002-06-25 12:44
当然没有搬的理由啦。我这的GDT基址:0x800036000 我的也没错,但我的那个ring0程序就是没用,我再仔细看看 |
|
|
5楼#
发布于:2002-06-25 12:53
哦,s h i t,原来是符号扩展的问题。
我说我那个ring0程序怎么过不去呢。现在改好了。 faint,gdt低16位竟然被编译成有符号扩展,如果直接用汇编就没这问题了:( |
|
|
6楼#
发布于:2002-06-25 12:56
本身这个函数就不完整,要不还叫什么了Mini呢?
如果你有CR3 Register的值,你就可以自己做转换了,如下: //-------------------------------------------------------- // // MmGetPhysicalAddress // // Return the physical address of specified virtual addr // //-------------------------------------------------------- ULONG MmGetPhysicalAddress(ULONG virtualaddress, ULONG *Remain) { // Mapped address of CR3 ULONG *MapPDE, *MapPTE; ULONG PPTE; ULONG Length; ULONG PDE, PTE, OFF; ULONG VARet = 0; *Remain = virtualaddress & (0x0FFF); virtualaddress &= ~(0x0FFF); if(virtualaddress >= 0x80000000 && virtualaddress < 0xA0000000) return (virtualaddress & 0x1FFFF000); if (CR3) { Length = 4096; OFF = 0; PTE = (virtualaddress & (((1<<10) - 1) << 12)) >> 12; PDE = (virtualaddress & (((1<<10) - 1) << 22)) >> 22; if(MapPhysicalMemory(physmem, &CR3, &Length, &((ULONG)MapPDE) )) { PPTE = MapPDE[PDE] & (((1<<20) - 1) << 12); if(MapPhysicalMemory(physmem, &PPTE, &Length, &((ULONG)MapPTE) )) { VARet = MapPTE[PTE] & (((1<<20) - 1) << 12) + OFF; UnmapPhysicalMemory((ULONG) MapPTE); } UnmapPhysicalMemory((ULONG) MapPDE); } } return VARet; } |
|
|
7楼#
发布于:2002-06-25 12:59
霍藿,MapPhysicalMemory是个未公开函数耶
|
|
|
8楼#
发布于:2002-06-25 13:05
这不是自己做转换的问题(做转换可以利用Nt/2000的结构,无需用CR3了),那个程序是从Ring3->Ring0,那个Mini*是在Ring3下执行的,不能访问页表的,是在ring0的话大家都去用MmGetPhysicalAddress了,呵呵。
|
|