程序加壳主要分为压缩壳、加密壳,多层壳等等,目的都是为了隐藏程序真正的入口点OEP,防止逆向人员轻松分析程序代码。
概念
壳最开始的目的是为了让逆向分析人员无法轻易获取程序的入口函数,在静态分析时也能隐藏内部代码,
属于代码保护技术。
加壳软件与查壳软件
加壳:ASPACK,UPX, PEcompact,PE-PACK; PETITE NEOLITE等
一般用来加壳的也可以用来脱壳
查壳: Fi ,GetTyp ,peid ,pe-scan等
如何识别OEP
这里只分享笔者遇到过的加壳软件中的OEP特征。
- 关键词
PUSHAD
,将所有寄存器压入栈中,POPAD
与PUSHAD
相对应,将所有寄存器弹出,一般运行到POPAD
说明OEP已经不远了。 - 观察地址,一般壳程序的地址比源程序的地址要大,也就是源程序在壳程序的上方,当经过了一个大跳转到达原本调试的地址上方,同时观察到有
PUSH EBP
等开辟栈帧的语句出现,大概率已经到达了OEP
脱壳方法
当遇到无法使用工具帮助我们解决壳时,可以使用手脱方法进行脱壳。加壳相当于在程序外套了另外一层程序,当程序运行起来时壳先获取到程序控制权,将壳程序运行结束(自解密阶段),再接着运行原程序,这时程序就执行到了OEP下,我们可以在这个时机下dump源程序。
单步跟踪
这是最笨的方法,在调试器中单步运行,不断单步步入或步过,直到到达OEP当中。
ESP定律
原理是利用了程序堆栈平衡。在程序自解密时需要先保存寄存器中的值,会进行压栈操作,而当自解密完成需要还原现场时,会将原来压栈的寄存器都弹出,原程序代码恢复。此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪,就很容易到达正确的OEP位置。
关键词搜索
根据所要脱壳程序的脱壳特征,定位到距离OEP最近的汇编,下断点,再运行程序到OEP之后dump。例如UPX可以定位汇编到popad附近,OEP距离popad的距离很近