GetNtdllBaseAddress
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页目录空间。
天书夜读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调试中断的机器码,恍然大悟。