能力值:
( 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.
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢tnttools,你的回答太切题了.
不知道你在上面提到的那些知识,我应该去哪里学习呢?
|
能力值:
( LV12,RANK:1010 )
|
-
-
4 楼
操作系统的基本概念,需要看关于操作系统的书.eg:
<WINDOWS操作系统原理>
|
|
|