VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1045回复:8

装了SoftIce为何不能进ring0?

楼主#
更多 发布于:2002-06-25 08:57
SI改了什么?改了什么内存保护策略???难道把GDT搬家了?
大家看看进入ring0的一段地址转换代码
ULONG MiniMmGetPhysicalAddress(ULONG virtualaddress)
{
    if(virtualaddress<0x80000000||virtualaddress>=0xA0000000)
       return 0;
    return virtualaddress&0x1FFFF000;
}
我看ntoskrnl里的代码是那个return 0的地方其实也用一种复杂的方法转换了,但这里返回0,怎么回事?我记得以前好像看到过解释,忘记了 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分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就可以了,不用管它.
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-25 12:34
你这是那个ring3->ring0程序的片段吧。因为那个程序只需要改GDT,所以只需要得到表所在的地址区间(0x80000000-0xa0000000),其它的返回0就可以了,不用管它.

霍藿,但它在我的2K(装了SI)也返回0,霍藿,我问的是是不是SI把GDT搬家了?
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-25 12:43
当然没有搬的理由啦。我这的GDT基址:0x800036000
你一定其它地方错了,hehe
不过还是用SI“GDT”指令查一下吧,不可能改呀。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-25 12:44
当然没有搬的理由啦。我这的GDT基址:0x800036000
你一定其它地方错了,hehe
不过还是用SI“GDT”指令查一下吧,不可能改呀。

我的也没错,但我的那个ring0程序就是没用,我再仔细看看
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-25 12:53
哦,s h i t,原来是符号扩展的问题。
我说我那个ring0程序怎么过不去呢。现在改好了。
faint,gdt低16位竟然被编译成有符号扩展,如果直接用汇编就没这问题了:(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;
}
System Internals http://sys.xiloo.com
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-25 12:59
霍藿,MapPhysicalMemory是个未公开函数耶
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-25 13:05
这不是自己做转换的问题(做转换可以利用Nt/2000的结构,无需用CR3了),那个程序是从Ring3->Ring0,那个Mini*是在Ring3下执行的,不能访问页表的,是在ring0的话大家都去用MmGetPhysicalAddress了,呵呵。
游客

返回顶部