【ESP定律】一个简单的upx脱壳实验
本帖最后由 梦幻的彼岸 于 2018-4-22 11:40 编辑由于这几天没学破解:
就先把之前的手动脱壳部分先分享出来,嘻嘻希望表哥,表姐们指证与鼓励下 嘻嘻 也希望伙伴们学到些知识
1,手动脱壳
首先,
用PEiD查询是否有壳,并是什么壳,在去寻找相关的课程,嘻嘻不会脱壳只能这么做了
打开peid:
将CrackMe(要查看壳的程序)托入或载入peid 我这里使用托入办法,嘻嘻
从结果分分析出是这个加壳方式:UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
寻找教程阶段:嘻嘻就不说了
用od进行脱壳:
一样用od载入要脱壳的程序
看到:pushad
单步步过(快捷键F8)一次
根据所学知识判初步断可以使用ESP定律进行脱壳
判断原因:
单步步入后
寄存器区域显示效果:
就ESP显示为红色
开始用ESP定律进行脱壳:
ESP定律的两种使用方法:
一种ESP脱壳原理:
鼠标左键选择ESP区域,失去被其它颜色覆盖,判断为被选定状态就可以:若上图所示效果图
鼠标右键(在选的位置或空白地方都可:因为ESP区域已被选中)
在弹出的窗口选择:数据窗口中跟随
判断是否选择正确:看地址区域:是否 = ESP 后面的字符串:0019FF64 判断相等 则证明选择无错
在 HEX 数据区域 鼠标左键从第一个字节开始选择多少都行记住是第一个字节这里的第一个字节为00
鼠标右键:在弹出的窗口选择 断点 硬件访问 之后选择{ Byte :字节(1) Word :字值(2) Dword:双字值(4)}都可
这里我选择 :Byte:字节(1)
查看是否选中:点击:调试 选择硬件断点
点击确认返回
运行程序F9单步不入F8(为找到OEP:找到之后进行脱壳)
嘻嘻看到ESP:判断出这是ESP的辛酸史就不说了
注意:脱壳之前先删除之前的断点 删除方法
单击 调试 选择硬件断点点击删除
删除断点之后:点击确认返回:之后在选择PUSH 行的情况下右键在弹出的窗口选择用OllyDump脱壳调试进程
选择两种保存方式,避免一种脱壳方式不能运行带不带重建输入表
带重建输出表
点击脱壳进行保存
不带重建输入表
点击脱壳进行保存
运行两种脱壳之后的程序
用peid进行查壳
发现无壳,并看出编写语言为:Microsoft Visual Basic 5.0 / 6.0
载入od我们可以看出不同
一种ESP脱壳插件:
方法差不多:就是省略了一些步骤
省略的步骤展示:
在弹出的窗口选择:数据窗口中跟随
在 HEX 数据区域 鼠标左键从第一个字节开始选择多少都行记住是第一个字节这里的第一个字节为00
鼠标右键:在弹出的窗口选择 断点 硬件访问 之后选择{ Byte :字节(1) Word :字值(2) Dword:双字值(4)}都可
这里我选择 :Byte:字节(1)
查看是否选中:点击:调试 选择硬件断点
替换的方法为:
鼠标左键选择ESP区域,失去被其它颜色覆盖,判断为被选定状态就可以:若上图所示效果图
鼠标右键(在选的位置或空白地方都可:因为ESP区域已被选中)
查看硬件断点:可以发现帮助我们选择了Dword的方式:
之后就相同了
总结:常见寻找OEP脱壳的方法方法一:1.用OD载入,不分析代码!2.单步向下跟踪F8,是向下跳的让它实现3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点--运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就会到程序的OEP。方法二:ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)1.开始就点F8,注意观察OD右上角的寄存器中ESP有没出现。2.在命令行下:dd 0012FFA4(指在当前代码中的ESP地址),按回车!3.选种下断的地址,下硬件访问WORD断点。4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP,脱壳方法三:内存跟踪:1:用OD打开软件!2:点击选项--调试选项--异常,把里面的忽略全部√上!CTRL+F2重载下程序!3:按ALT+M,DA 打开内存镜象,找到第一个。rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,DA 打开内存镜象,找到。RSRC上面的CODE,按F2下断点!然后按SHIFT+F9,直接到达程序OEP,脱壳!方法四:一步到达OEP(前辈们总结的经验)1.开始按Ctrl+F,输入:popad(只适合少数壳,包括ASPACK壳),然后按下F2,F9运行到此处2.来到大跳转处,点下F8,脱壳之!方法五:1:用OD打开软件!2:点击选项--调试选项--异常,把里面的√全部去掉!CTRL+F2重载下程序!3:一开是程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按F9到程序运行的次数!4:CTRL+F2重载程序,按SHIFT+F9(次数为程序运行的次数-1次5:在OD的右下角我们看见有一个SE 句柄,这时我们按CTRL+G,输入SE 句柄前的地址!6:按F2下断点!然后按SHIFT+F9来到断点处!7:去掉断点,按F8慢慢向下走!8:到达程序的OEP,脱壳!
OEP:OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳。 PUSHAD (压栈) 代表程序的入口点
POPAD (出栈) 代表程序的出口点,与PUSHAD相对应,一般找到这个OEP就在附近啦。一般我感觉到oep的时候反汇编内的代码就变了,那种感觉很奇妙
ESP:ESP(Extended stack pointer)是指针寄存器的一种(另一种为EBP)。用于堆栈指针。ESP为栈指针,用于指向栈的栈顶(下一个压入栈的活动记录的顶部),而EBP为帧指针,指向当前活动记录的底部。栈指针与帧指针标识出了当前活动记录的位置。当函数被调用的时候,执行如下操作:⒈将帧指针压入栈中:push ebp⒉用ebp保存当前栈指针:mov esp,ebp⒊使得栈指针自减,自减得到的内存应当能够被用来存储被调用函数的本地状态:sub esp,0CCh 查壳结果显示: UPX v.3.91w - [ .... ] - 64 bit EXE signature- at2013-2016 - http://upx.github.io
用UPX -D 程序,则结果出现。CantUnpackExce ption: file is possibly modified/hacked/protected; take care!
楼主大牛有碰到过没,求指教一二! 感谢分享 感谢分享,图片都挂了吗?看不到? 感谢分享。。 ximo的24课脱壳我都会脱了,然而自己找个软件脱 未能脱掉! 觉得有点可悲 写的很详细适合我们小白学习 以前虽然用过ESP定律,不过一直不太懂,现在慢慢的,理解了,对付一般的壳,这方法还是非常好用地! 要是有直播教程最好了 这个太适合我这样的新手菜鸟了,学习学习!