脱壳存根执行了以下三个步骤:
(1)将原始程序脱壳到内存中
(2)解析原始可执行文件的所有导入函数
(3)将可执行程序转移到原始的程序入口点(OEP)
这种方法应用在ESP定律法中:
(1) 首先step-over,直到esp的值产生变化,记录下esp值
(2)在命令中用dd,在数据窗口中跟随记录下的地址
(3)然后在该地址设置硬件断点,可以用命令hr xxxxxx
(4)F9执行程序,然后step-over到达程序的OEP
导入表在内存中实际上有两个表:
UPX、ASPack、Petite、WinUpack(Upack)、Themida
OllyDump为什么能通过跨段找到OEP: 通常,脱壳存根在一个节里,而可执行程序被打包到另一节中,使用step-over或者step-into方法,当程序从一个节跳转到另一个节运行时,OllyDbg可以探测到这种转移,并且在那里进行中断。step-over方法跳过所有call指令,然而如果一个call函数没有返回,那么OllyDbg将会定位到OEP。
pushA指令:用来存在寄存器的栈地址,在这些地址上设置硬件断点 popAD指令:调用该指令时会触发设置的硬件断点,此时就能在不远的地方找到OEP(在尾部跳转之前会有一个popad或者popfd指令)
Lab18-1:直接找到尾部跳转(JMP),然后找到OEP Lab18-2:利用插件(find oep by section hop(Trace Over)) Lab18-3:插件无法利用,查找可能的尾部跳转(查找指令retn),设置硬件断点,但是没有命中断点。找到程序开头处pushFD和pushAD,在esp第一次改变的地址上设下硬件访问断点。 Lab18-4:和实验三一样的思路 Lab18-5:用ctrl+G定位,在LoadLibrary和GetProcAddress上设置断点,单步执行直到找到OEP