资源描述:
《教你如何寻找程序的oep》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、教你如何寻找程序的OEP教你如何寻找程序的OEP一般的压缩壳,如Aspack等都有专用的脱壳机。而加密壳(如ASProtect,Armadillo)一般很少有脱壳机,必须手工脱壳。手工脱壳一般情况是分三步:一是查找程序的真正入口点(0EP);二是抓取内存映像文件;三是输入表重建。(当然现在的加密壳复杂些,要考虑更多的东西)0EP是OriginalEntryPoint缩写,即程序加壳前的真正的入口点。外壳初始化的现场环境(各寄存器值)与原程序的现场环境是相同的。加壳程序初始化时保存各寄存器的值,外壳执行完毕,会恢复各寄存器内容。PUSHFD其代码形
2、式一般如下:;将标志寄存器入栈保存PUSHAD:pusheax,ecx,edx,ebx,esp,ebp,esi,edi;外壳代码部分POPAD:popedi,esi,ebp,esp,ebx,edx,ecx,eaxPOPFD;恢复标志寄存器JMPOEPOEP:……•;解压后的程序原代码为了讲述方便,本节用UPX加壳的Win98记事本来演示。首先用PEid查看加壳前的记事本:PEid显示Notepad,exe程序是用MicrosoftVisualC++6.0编译的,接下来用UPX来加壳,方法是开个DOS窗口,用命令upxnotepad.exe。如下图
3、所示:这吋再用PEid查看加壳的文件,PEid会给出如下信息:UPXO.89.6-1.02/1.05-1.24->Markus&LaszloUPX的壳可以用UPX.exe自身来脱,命令是:upx-d文件名。一些变种的UPX壳用UPX.EXE自身脱不了,这吋可以试试UPXShellEx这款工具。脱壳前建议用PE工具LordPE打开目标文件查看一下区块,以尽可能地多了解一些信息,对脱壳有帮助,如下图:1.根据跨段指令寻找0EP推荐用Ollydbg来调试脱壳,比SoftICE和TRW2000方便多了。运行Ollydbg,点击菜单“选项/调试设置”,将第
4、一次暂停设在WinMain函数上。再用Ollydbg打开实例notepad,upx.exe就可中断在外壳的入口点处了:上图相关代码如下:0040E8C0>60pushad//一开始0llydbg就会中断这行,这个就是外壳的入口点,注意这个pushad指令绝大多数加壳程序在被加密的程序中加上一个或多个段,所以依据跨段的转移指令(JMP)就可找到真正的入口点,此时就会有P0PAD/P0PFD指令出现。UPX用了一次跨段的转移指令(JMP),在跳到0EP处会看到虚拟地址的值有一个突变,此时就能确定OEPToUPX壳比较简单,大家不必要跟踪去找这个跨段的
5、转移指令,中断WinMain后,只需要在0llydbg里往下翻屏,就会发现这个跨段转移指令:上图和关代码如下:0040EA0E的popad指令,0040EA0F将光标移到这,//注意这里61popad和开始的pushad对应-E9B826FFFFjmp004010CC//这里跳到0EP,按F4执行到这行这一句0040EA0Fjmp004010CC就是跳到0EP的指令,执行到这,UPX外壳己将程序解压完毕,并模拟加载器的将原始程序加载到内存,004010CC就是映射到内存目标程序的入口点,此吋就可抓取内存映像文件了。1.根据堆栈平衡原理找0EP这个
6、堆栈平衡原理其找0EP原理这篇文档描述的比较详细:寻找真正的入口(0EP)—广义ESP定律操作方法:多数壳在运行到0EP的吋候ESP二0012FFC4,这就是说程序的第一句是对0012FFC0进行写入操作,只要在0012FFC0下硬件写入断点(命令行里键入IIW12FFC0),我们就能停在0EP的笫二句处。用OllyDBG重新加载实例程序notepad,upx.exe,在命令彳亍下硬件写断点:按F9执行程序,就会中断在OEP笫二行:此吋如果将光标向上移,会发现笫一句代码变乱了:004010C7000D0A000055add[5500000A],c
7、l004010CD8BECmovebp,esp这是因为Ollydbg将数据当汇编代码来分析了,你可以按Ctrl+ALT+向上光标键将当前显示的代码向上滚动一个字节就可看到正确的汇编代码了:004010CC55004010CD8BECpushebpmovebp,esp//中断在这行004010CF83EC44subesp,44004010D256pushesi004010D3FF15E4634000call[4063E4];kernel32.GetCommandLineA中断后,别忘点击菜单“调试/硬件断点/”打开硬件断点面板,将刚才的硬件断点删除
8、。1.根据编译语言特点找0EP各类语言编译的文件入口点都有一些规律,可以这利用这点来寻找入口点。1)Delphi程序执行程序,用Lord