在17.6章第一个例子中,
他有一个例子是查找kernel32.dll基地址的子函数如下:
mov edi,_dwKernelRet
and edi,0ffff0000h (他说这里 是为了对齐64k,说pe加载就是64k对齐的,不是按照内存页4k对齐的么?而且为什么这么操作就能对齐?)
while:true
if word ptr [edi] == image_dos_signature
mov esi,edi
add esi,[esi+003ch]
if word ptr [esi] == image_nt_signature
mov @dwReturn,edi
break
endif
endif
_pageerror:
sub edi,01000h(这里为什么这样减?)
break if edi<070000000h (这里又是什么原因?)
------解决方案--------------------------------------------------------
这个不是内存分页4k的问题,而是kernel.dll加载地址必定不会小于这个值的原因。
查找其他的模块首地址必须用4k对齐计算的。这个作者只是搞了个小技巧