Author Archive

GetNtdllBaseAddress

GetNtdllBaseAddress.cpp

pushad

pushad将8个32位的通用寄存器入栈,入栈顺序为eax、ecx、edx、ebx、esp、ebp、esi、edi。pusha是16位版的。

Window分页机制

Windows的分页机制是线性地址--->PDE--->PTE--->物理地址,那么具体是怎么映射的呢?

1个PTE占4bytes代表4kb页面大小,1个页表含1024个PTE,因此占4kb代表4M空间大小。那么映射整个地址空间4G需要1024个页表,占4M。

Windows使用了两级页表,即每个页表的基址又由1个PDE占4bytes指示,因此1个页目录占4kb。

Windows将页表本身也映射到了进程的地址空间(准确的说是进程地址空间的系统地址空间)。先看看如果是我们自己该如何安排?

假设把页表本身安排在最低的4M区域,那么页表里第1张页表映射的就是自己!那么第1张页表第1个PTE就是第1张页表的基址,第2个PTE就是第2张页表的基址!

看看这里的第1张页表的PTE是不是和页目录的PDE效果一样?没错,页目录和第1张页表的内容一样,所以可以等价。

现在来看看Windows是如何安排的。

Windows将页表安排在0xc0000000处,算一算页表中的哪张会映射到整个页表本身呢?没错,第(0xc0000000/0x400000(4M)+1=0x301=787)张页表(从1开始)!其偏移是0x300*0x1000(4kb)=0x300000!同样,它也是页目录的基址,即0xc0300000。这就是Windows的页目录自映射方案,节省了4kb页目录空间。

Windows系统中PDE和PTE所占的空间

天书夜读2.2思考与练习

int a, b, d;
d = a + b;
int i = 1, c = 0;
while(c < 0x64)
{
	c += i;
}
switch(c)
{
	case 0:
		d = 1;
	case 1:
		d = c;
		break;
	default:
		d = 0;
}
return d;

0xCC

经常在debug模式下看到有如下汇编代码用0xCC填充栈空间:

mov ecx, 30h

mov eax, 0CCCCCCCCh

rep stos dword ptr es:[edi]

今天才知道0xCC是int 3调试中断的机器码,恍然大悟。

无觅相关文章插件,快速提升流量