WEB开发网
开发学院网络安全黑客技术 脱壳基础知识入门之寻找OEP 阅读

脱壳基础知识入门之寻找OEP

 2007-01-15 16:44:11 来源:WEB开发网   
核心提示: 0040EA0E61popad//注意这里的popad指令,和开始的pushad对应0040EA0F-E9B826FFFFjmp004010CC//这里跳到OEP,将光标移到这,脱壳基础知识入门之寻找OEP(3),按F4执行到这行这一句0040EA0Fjmp004010CC就是跳到OEP的

0040EA0E  61       popad      //注意这里的popad指令,和开始的pushad对应      

0040EA0F -E9B826FFFF  jmp  004010CC //这里跳到OEP,将光标移到这,按F4执行到这行

这一句0040EA0F jmp 004010CC就是跳到OEP的指令,执行到这,UPX外壳己将程序解压完毕,并模拟Windows加载器的将原始程序加载到内存,004010CC就是映射到内存目标程序的入口点,此时就可抓取内存映像文件了。

2.根据堆栈平衡原理找OEP

这个堆栈平衡原理其找OEP原理这篇文档描述的比较详细:寻找真正的入口(OEP)--广义ESP定律

操作方法:多数壳在运行到OEP的时候ESP=0012FFC4,这就是说程序的第一句是对0012FFC0进行写入操作,只要在0012FFC0下硬件写入断点(命令行里键入HW12FFC0),我们就能停在OEP的第二句处。

用OllyDBG重新加载实例程序notepad.upx.exe,在命令行下硬件写断点:

按F9执行程序,就会中断在OEP第二行:

此时如果将光标向上移,会发现第一句代码变乱了:

004010C7  000D0A000055 add  [5500000A],cl
004010CD  8BEC     mov  ebp,esp

这是因为Ollydbg将数据当汇编代码来分析了,你可以按Ctrl+ALT+向上光标键将当前显示的代码向上滚动一个字节就可看到正确的汇编代码了:

004010CC  55       push  ebp
004010CD  8BEC      mov  ebp,esp //中断在这行
004010CF  83EC44    sub  esp,44
004010D2  56       push  esi
004010D3  FF15E4634000 call  [4063E4]  ;kernel32.GetCommandLineA

中断后,别忘点击菜单“调试/硬件断点/”打开硬件断点面板,将刚才的硬件断点删除。

3.根据编译语言特点找OEP

各类语言编译的文件入口点都有一些规律,可以这利用这点来寻找入口点。

1)Delphi程序

执行程序,用LordPE(或Prodump)选dump(full)脱壳,存为dump.exe。接着用HexWorkshop打开dump.exe,搜索文本“runtime”,搜到后,向前查找离“runtime”最近的十六进制数字“558BEC”,数字所在的地址就是程序的OEP。

2)VisualC程序

可以利用VisualC启动部分的几个函数GetCommandLineA(W)、GetVersion、GetModuleHandleA(W)、GetStartupInfoA(W)等来定位程序的OEP。

常见的各类编译语言的入口汇编代码都要熟悉,因为一些加密强壳会偷OEP处的代码到壳里,一般情况各编译语言入口代码都相同,到时只需要直接引用相关程序的入口代码,这给我们恢复代码带来方便。

上一页  1 2 3 

Tags:脱壳 基础知识 入门

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接