10-10-12分页与P/RW页属性

16 篇文章 0 订阅
14 篇文章 3 订阅

分页

物理地址
线性地址、有效地址、物理地址
如下指令:MOV eax,dword ptr ds:[0x12345678]
其中,0x12345678是有效地址
ds.Base+0x12345678是线性地址
如果Base是0则有效地址和线性地址是一样的。
线性地址
上述例子中0x12345678+ds.Base是线性地址。
线性地址是不存在的真正的数据在物理地址,
其中线性地址转换为物理地址是由CPU进行转换的。
比如所有EXE里面的系统DLL其实都是存在于物理地址中,
然后将对每个EXE都映射了一份线性地址。
可以直接将物理地址的DLL进行HOOK这样其他EXE也会使用HOOK的DLL。
线性地址转换物理地址(X86 32位转换)
101012分页	10-10-12 加起来正好32位
29912分页
999912分页(64位分页机制)
(64位形式) 
通过线性地址找到物理地址
101012分页:
原始地址:0x000AABA0
数据拆分:
0000 0000 00	对应10
AA	00 1010 1010  	对应10
8A0	1000 1010 0000	对应12
每个进程都有一个CR3(准确的说是都一个CR3值),
CR3本身是个寄存器是唯一一个指向物理地址的寄存器,
一个核,只有一套寄存器),CR3指向一个物理页,一共4096字节
CR3指向物理页有第一级和第二级再到物理页,可以把一二级看做是目录,
需要注意的是每一级都是4096字节,比如1级是4096,2级也是4096.
每个成员是4个字节,4096个字节可以存储1024个地址。

10-10-12分页 Windbg分析

#### 调整为10-10-12分页形式
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute=optin /fastdetect /debug /debugport=com2 /baudrate=115200
改为:
noexecute = execute
笔记程序地址字符修改练习
1.字符串线性地址:000B0E00
   10:	0000 0000 00
   10:	0010 1100 00 B0*4=2C0 需要乘4
   12:	1110 0000 0000   E00不用乘4
2.查找CR3物理地址
使用windbg输入命令:!process 0 0 显示所有进程的基本信息
Failed to get VadRoot
PROCESS 894ed020  SessionId: 0  Cid: 07f8    Peb: 7ffde000  ParentCid: 0708
 DirBase: 17174000  ObjectTable: e2597500  HandleCount:  52.
 Image: notepad.exe
DirBase: 是CR3地址
windbg输入!dd 查看的是物理地址,需要注意的是加上!是物理地址。
0: kd> !dd 17174000+0(第一个10)
#17174000 17149867 173ae867 170be867 00000000
#17174010 170bc867 00000000 00000000 00000000
#17174020 00000000 00000000 00000000 00000000
#17174030 00000000 00000000 00000000 00000000
#17174040 00000000 00000000 00000000 00000000
#17174050 00000000 00000000 00000000 00000000
#17174060 00000000 00000000 00000000 00000000
#17174070 00000000 00000000 00000000 00000000
0: kd> !dd 17149000+2C0(第二个10)
#171492c0 174c4867 17409867 1744a867 1734b867
#171492d0 173cc867 1744d867 174ce867 2ebcd867
#171492e0 00000000 00000000 00000000 00000000
#171492f0 00000000 00000000 00000000 00000000
#17149300 00000000 00000000 00000000 00000000
#17149310 00000000 00000000 00000000 00000000
#17149320 00000000 00000000 00000000 00000000
#17149330 00000000 00000000 00000000 00000000
0: kd> !db 174c4000+E00(不需要*4)
#174c4e00 48 00 41 00 48 00 41 00-31 00 32 00 33 00 00 00 H.A.H.A.1.2.3...
#174c4e10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#174c4e20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#174c4e30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#174c4e40 00 00 00 00 14 00 89 00-94 00 0a 00 d9 01 0c 00 ................
#174c4e50 9c 75 68 74 01 00 00 00-94 cc ba be d3 5c 62 46 .uht.........\bF
#174c4e60 a1 e0 f3 31 99 49 36 69-96 9d c9 58 9b 2f ce 42 ...1.I6i...X./.B
#174c4e70 91 be 37 ef 18 60 f8 82-03 00 02 00 00 00 00 00 ..7..`..........
0: kd> !eb 174c4000+E00 49(修改物理页)
0: kd> !db 174c4000+E00
#174c4e00 49 00 41 00 48 00 41 00-31 00 32 00 33 00 34 00 I.A.H.A.1.2.3.4.
#174c4e10 35 00 36 00 37 00 70 00-00 00 00 00 00 00 00 00 5.6.7.p.........
#174c4e20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#174c4e30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#174c4e40 00 00 00 00 14 00 89 00-94 00 0a 00 d9 01 0c 00 ................
#174c4e50 9c 75 68 74 01 00 00 00-94 cc ba be d3 5c 62 46 .uht.........\bF
#174c4e60 a1 e0 f3 31 99 49 36 69-96 9d c9 58 9b 2f ce 42 ...1.I6i...X./.B
#174c4e70 91 be 37 ef 18 60 f8 82-03 00 02 00 00 00 00 00 ..7..`..........

PDT与PTE

PDT、PTE、PTT
80x86映射表分为2级
第一级:页目录表(PDT)大小4kb
	页目录表每个成员(4字节 DWORD)称为PDE。
	PDE拆分为位后,后3位代表的是属性。
第二级:页表(PTT)大小4kb
	页表每个成员(4字节 DWORD)称为PTE。
	PTE拆分为位后,后3位代表的是属性。
	PTE可以指向物理页,也可以不指向物理页(因为还没有分配),
	多个PTE可以同时指向同一个物理页,但是一个PTE不可以指向多个物理页。
所有寄存器中只有CR3寄存器存储的是物理地址,其余为线性地址。
线性地址是段.Base+有效地址。
页目录表(PDT):
CR3寄存器指向一个页目录表大小为4kb,每个页目录表成员为4字节一组。
这个4个字节大小称之为PDE。
页表(PTT)
PTT由PDT中的PDT指向,页表成员大小也是4kb跟PDT
挂页
一般情况下读写0地址会报错,因为0地址的PTE并没有指向物理页,也就是没用分配内存。
这种情况可以通过挂页的方式来进行内存读写,最简单的方式就是通过修改PTE指向的物理页地址实现。

P/RW属性

物理页的属性
物理页的属性=PDE属性&PTE属性。
物理页的属性是PDE与PET的属性比如PDE的P位与PTE的P位。
31-----------12  
1111 1111 1111 1111 1111 1111 1111 1111
页表基址
PDE属性
0 P位(有效位): P=1是有效物理页 P=0是无效物理页,
	线性地址为0因为不能访问是因为没有挂页,但是如果有挂页却P=0还是不能访问。
1 R/W(读写位):0=只读 1=可写
	比如 CONST 的地址是不可修改是因为页的R/W=0,可以通过修改物理页属性R/W为1来进行修改。
2 U/S
3 PWT
4 PCD
5 A
6 0
7 PS
8 G
9-10 有效
12-31 页表基址
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚构之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值