首页
社区
课程
招聘
[求助]内存地址问题--看过SDTrestore的指教一下
发表于: 2008-12-27 21:32 5055

[求助]内存地址问题--看过SDTrestore的指教一下

2008-12-27 21:32
5055
学习SDTrestore时候,遇到一些问题,请高手指教一下
1、
DWORD kernelPhyBase = GetKernelBase() - PROT_MEMBASE;
//#define PROT_MEMBASE 0x80000000       
// ntoskrnl的物理地址减去0x00400000是什么意思啊?
// kernelOffset代表什么具体含义啊?
DWORD kernelOffset = kernelPhyBase - peXH2.imageBase;// peXH2.imageBase=0x00400000


2、
DWORD *fileServiceTable = (DWORD *)((DWORD)exeAddr + wantedAddr - kernelOffset - peXH2.imageBase);
用vc跟了一下,
//fileServiceTable:00b3b6c8映射进用户空间的SSDT地址
//为何ssdt内的不是虚拟地址,而是物理地址呢?如下:
//fileServiceTable[0]=004a838e,fileServiceTable[1]=004a1c0c,......

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
想帮忙,可惜不是所云

给个 reference 的 link
2008-12-27 22:12
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这是sudami的学习注释,正在学习,现在对其中一个部分的疑惑,其实完全是一个
独立的问题,跟原来的代码没有什么关系的
http://bbs.pediy.com/showthread.php?t=58157&highlight=SDTrestore
2008-12-27 22:36
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
4
内核态对象,物理地址和虚拟地址都是这样的转换关系呢?
不是。。
参考 MmGetPhysicalAddress
from ntddk.h
PHYSICAL_ADDRESS MmGetPhysicalAddress(void *BaseAddress);
---

PHYSICAL_ADDRESS是quad-word (64 bits)的。原本打算在文章开头分析一下汇编代码,但是它太长
了。地址转化也很普通,我只想快点进行这个题目。

quad-word的低位被传递给eax,高位传递给edx。要转化虚拟地址到物理地址,可以有两种办法:

* case 0x80000000 <= BaseAddress < 0xA0000000:
我们唯一要做的只是提供一个0x1FFFF000掩码虚拟地址

* case BaseAddress < 0x80000000 && BaseAddress >= 0xA0000000
这种办法对于我们来说有点问题,因为我们并没有办法在这个范围转化地址,因为我们需要读cr3记
录或者运行非ring3可调用的汇编指令。需要更多信息,可参考Intel Software Developer's Manual
Volume 3 (see [5]).

EliCZ告诉我,以他的经验可以猜测一个物理地址偏移掩码,保留部分的索引。掩码:0xFFFF000

这是一个轻量级版本的MmGetPhysicalAddress()

PHYSICAL_MEMORY MyGetPhysicalAddress(void *BaseAddress) {
if (BaseAddress < 0x80000000 || BaseAddress >= 0xA0000000) {
return(BaseAddress & 0xFFFF000);
}
return(BaseAddress & 0x1FFFF000);
}

对于限定地址边界为[0x80000000, 0xA0000000]主要是这情况不能更成功地猜测正确。这就是为什么
如果你想更准确最好还是调用实际上的MmGetPhysicalAddress()。我们可以在一些章节中看到怎么做的。


简单来说 一部分地址是可以直接 猜测 到物理地址的
如果还不明白 去读读Playing with Windows /dev/(k)mem
2008-12-28 11:57
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
多谢zhuwg大侠的提示,我先看看Playing with Windows /dev/(k)mem~~~
2008-12-28 19:12
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
if (BaseAddress < 0x80000000 || BaseAddress >= 0xA0000000) {
      return(BaseAddress & 0xFFFF000);
   }
   return(BaseAddress & 0x1FFFF000);
---------------
& 0xFFFF000
1FFFF000
为什么与一下他们就是物理地址了呢?还是不懂啊
2008-12-28 23:33
0
游客
登录 | 注册 方可回帖
返回
//