第一个esp定律会写得详细一些。
1. ESP定律
有pushad,寄存器只改变esp,基本上就能用。
硬件断点只要从这个地址开始就行,选多少个字节都行。
注意观察大的跳转,ctrl+a或删除分析。
用完后记着删除,不然可能影响后面分析。
如果不知道是否重建输入表,那就两个都试一下。打不开的删除就好了。
2. 单步跟踪
如果有pushad,要注意popad。
注意peid查语言,了解入口特征!!!!!!!!!!!!!!!!
3. 两次断点
调试设置-异常-全部打勾,即忽略全部异常。
- 在M窗口的程序领空段下cc断点,shift+f9(忽略异常运行);
- 再在壳的段下cc断点,shift+f9.
4. 最后一次异常
与两次断点法相反,调试设置-异常-全部不打勾,捕获所有异常。
按shift+f9,数着按多少次,程序能正常开启。视频里按了两次,所以有一次异常。
重启,按一次shift+f9,在堆栈里可以看到SE处理程序。在这里右键-反汇编窗口跟随,下cc断点,shift+f9,中断在这里,然后单步跟踪。
发现popad后遇到jmp,没有向上或向下的箭头,而是“-”,说明是很大的跳转。跳过去就是OEP了。
5. SFX
这个方法很简单。
调试选项,异常全部打勾, SFX选择“字节方式跟踪真正入口处(非常慢)”。
SFX: Self File Extracting.
然后重载,状态栏会显示跟踪中,找到后会自动停下来。
这种方法用完后记着把SFX勾回“停在自解压的入口处”
6. 模拟跟踪
查看M窗口壳在当前区段xxxxx000
,command输入tc eip < 起始地址
,就会开始跟踪。非常非常慢。所以模拟跟踪也不是一开始就这样用的。
借用两次断点法,现在rsrc区块下cc断点,shift+f9,再在text下cc断点,shift+f9。
现在,可以用命令tc eip<xxxxx000
了。
网课的几个案例text否是01xxxxxx区块,而不是00401000。要判断一个程序的基址,可以查看E窗口。
7. 出口标志
回忆一下,之前说过popad很关键。所以可以ctrl+f搜索popad。
注意不要搜索整个块,而且像ASpack这样的壳会有多个popad,要注意popad之后的命令,判断应该在哪里f4。一般一个个试,跑飞了就寻找下一个ctrl+l
8. 秒到OEP
直接运行,堆栈窗口从高地址往低找返回到程序名.地址
,其中就有OEP,反汇编跟随。
在OEP处数据窗口跟随,下硬件执行断点,重载运行。
有些强壳(视频中的案例是zp壳),找到某个程序名.地址
删除分析后,堆栈才会显示一个个栈帧,然后才会显示返回到...
确定OEP脱壳后,特征明显不对,程序也没法执行,这时就需要LordPE,对该文件右键-修正镜像大小,右键-完全脱壳, 最后用impREC修复OEP,并自动查找IAT,获取输入表,查看无效函数,删除(没有dll的)指针