首页
社区
课程
招聘
关于动态获取kernel32.dll基地址的不解
发表于: 2008-5-1 19:39 8692

关于动态获取kernel32.dll基地址的不解

2008-5-1 19:39
8692
刚学习了一下罗云彬win32教程中的动态获取kernel32.dll基地址的算法,有几处不太明白:
 mov edi,[esp]  ;在程序的入口处用[esp]得到了kernel32.dll的地址,
 and edi,0ffff0000h ;将地址按页对齐
 此处不明白:为什么要取高16位??一页是4KB,即1000h,如果要按页对齐,应该是and edi,0fffff000h才对啊,接下来:
 sub edi,010000h 
 这里也不明白,书上说的是以每次一个页的间隔在内存中查找,但按照一页4KB,这里010000h=01000h*16,即每次16页的间隔了.最后:
 break  .if edi < 070000000h ;查找的页超出了地址.
这里不明白,为什么是以070000000h为判断的界限呢?有什么根据??

谢谢解答!

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
2
这里有两处预备知识,你需要掌握:
(1)
不同的内存模块,内存单元的粒度不一样,很容易搞混了。

对于节是SectionAlignment
对于文件是FileAlignment
对于windows虚拟内存管理器来说,物理内存分配的粒度是4KB或4MB;确实有4MB的内存策略。
对于windows loader来说,装载exe, dll等文件的粒度是64KB。

4KB  - 0x00001000
4MB -  0x00400000
64KB - 0x00010000

这个64KB起源于早期的MS-DOS COM,EXE

(2)
对于kernel32.dll和ntdll.dll等这些在windows loader眼中另眼相待的特殊的系统DLL:采用Copy-On-Write策略,相对固定的基址,这些基址值在各个不同系统中都满足的条件是>0x70000000。你提到的语句break .if edi < 070000000h,其实是一种停止死循环的条件。但我也见过一些找PE文件基址的代码段,没有这种停止死循环的条件,比如:

25 00 00 FF FF    and     eax, 0FFFF0000h
05 00 00 01 00    add     eax, 000010000h
2D 00 00 01 00    sub     eax, 000010000h
66 81 38 4D 5A    cmp     word ptr [eax], 5A4Dh
75 F4             jnz     $-10

虽然有死循环到程序出错的机率,但从通用性方面考虑,还不如不要那个停止循环的条件。因为不可能所有的DLL、EXE都有这种特点,基址大于70000000h

Enjoy it.
2008-5-1 20:52
0
雪    币: 214
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢tnttools,你的回答太切题了.
不知道你在上面提到的那些知识,我应该去哪里学习呢?
2008-5-1 21:32
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
操作系统的基本概念,需要看关于操作系统的书.eg:
<WINDOWS操作系统原理>
2008-5-1 21:43
0
游客
登录 | 注册 方可回帖
返回
//