cu629944 发表于 2012-3-31 20:28

ESP定律背后的原理之一:0x12FFC4,为什么是这个数

标 题: 【原创】ESP定律背后的原理之一:0x12FFC4,为什么是这个数
作 者: tnttools
时 间: 2008-02-05,16:13:41
链 接: http://bbs.pediy.com/showthread.php?t=59352

ESP定律背后的原理之一:0x12FFC4
ESP定律:如果压缩壳执行前后的堆栈会维持平衡,在12FFC0上下读写断点,会中断在OEP的第一条指令push ebp上。那么各位有没有探究过ESP的尾数值为什么不是0xFFFC,而是0x0FFC4?这是由windows源代码的实现所确定的。

Windows创建进程的函数链为kernel32.dll!_CreateProcessInternalW -> … -> kernel32.dll!_BaseProcessStartThunk() -> kernel32.dll!_BaseProcessStart() -> EP

在进入_BaseProcessStartThunk()时,堆栈的状态确实为
+ 0012FFFC   00000000                <- ESP

---------------------------------------------------------<code>
   _BaseProcessStartThunk@8 proc near
xor   ebp, ebp
push    eax
push    0
jmp   _BaseProcessStart@4 ; BaseProcessStart(x)
_BaseProcessStartThunk@8 endp
----------------------------------------------------------</code>

在执行完_BaseProcessStartThunk时,堆栈的状态为
+ 0012FFFC   00000000               
+ 0012FFF8   EAX
+ 0012FFF4   0x00000000             <- ESP
   
---------------------------------------------------------<code>
    _BaseProcessStart proc
push    0Ch
push    offset dword_7C816FE0
call    __SEH_prolog
and   , 0
push    4
lea   eax,
push    eax
push    9
push    0FFFFFFFEh
call    ds:__imp__NtSetInformationThread@16 ; NtSetInformationThread(x,x,x,x)
call    dword ptr
push    eax             ; dwExitCode
call    _ExitThread@4
nop
nop
nop
---------------------------------------------------------</code>

在执行完BaseProcessStart()后,堆栈的状态为

+ 0012FFFC   0x00000000
+ 0012FFF8   OldEAX -2-> EntryPoint By NtSetInformationThread()
+ 0012FFF4   reserved, inited to 0x00000000
+ 0012FFF0   OldEBP(0x00000000)    <-p- NowEBP
+ 0012FFEC   TryLevel, inited to 0xFFFFFFFF
+ 0012FFE8   ScopeTable
+ 0012FFE4   __except_handler3 in kernel32.dll
+ 0012FFE0   0xFFFFFFFF            <-p- fs:00h
+ 0012FFDC   ExceptionInfo, Parameter of UnhandledExceptionFilter()
+ 0012FFD8   OldESP(0x0012FFC8)
+ 0012FFD4   ExceptionCode, Parameter of kernel32.dll!ExitProcess
+ 0012FFD0   EBX(pPEB)
+ 0012FFCC   ESI
+ 0012FFC8   EDI                   <-p- OldESP
+ 0012FFC4   retaddr in kernel32.dll!_BaseProcessStartThunk
                                             <-p- NowESP


附:
    DWORD   SizeOfStackReserve;                         // 0x48-4b
    DWORD   SizeOfStackCommit;                        // 0x4c-4f
    DWORD   SizeOfHeapReserve;                        // 0x50-53
    DWORD   SizeOfHeapCommit;                           // 0x54-57

这是IOH中的四个域。
Reserved保留的, Committed提交的是两种类型的虚拟内存。
Reserved指这段内存已有用途,不能再被分配;Committed提交的内存指的是已经与物理内存有映射的虚拟内存段(当然也可以被移到硬盘上的缓存文件pagefile.sys中)。因为Stack, Heap这两种类型的内存段都有随着程序的运行尺寸不断增大的特性,所以一开始不必占用太多宝贵的物理内存,当它们用完了,会引发内存异常,windows内存管理器就又为程序分配一部分。

SizeOfStackReserve程序开始时保留用作堆栈空间的内存段的大小
SizeOfStackCommit   程序开始时在保留的堆栈内存段中与物理内存映射的提交的内存段的大小
SizeOfHeapReserve程序开始时保留用作堆空间的内存段的大小
SizeOfHeapCommit   程序开始时在保留的堆内存段中与物理内存映射的提交的内存段的大小

yiyang 发表于 2012-3-31 20:33

哦是这样吗

龙啸风尘 发表于 2012-3-31 21:05

具体的不太清楚。反正这个地址好像并不是定值吧?

resote 发表于 2012-3-31 21:09

学习了 还是不懂

yfl21cn 发表于 2012-3-31 22:25

leegi 发表于 2012-3-31 22:58

不清楚哦。。。。

zb66 发表于 2012-4-1 00:50

这个暂时还看不懂!
页: [1]
查看完整版本: ESP定律背后的原理之一:0x12FFC4,为什么是这个数