最近学习脱壳 好多事知其然不知其所以然。
脱壳只是一个小过程,不少的加壳软件已经有了相对应的脱壳机。
也有固定的脱壳方法知道怎么脱即可,其中脱壳的方法我感觉有一下几个(我接触到的)
首先说一下壳好文章有一切从”壳”开始,壳的作用有压缩程序和保护程序等等。
所以分压缩壳和加密壳
区分两种壳:
OD载入时有入口警告或询问是压缩程序吗?普通压缩壳OD调试时候没有异常
加密壳全部有反跟踪代码,会有许多SEH陷阱使OD调试时产生异常。
脱壳的根本目的是找到程序真正的OEP
对于压缩壳来说简单点有一些固定格式:
PUSHAD PUSHFD POPAD POPFD RETN JMP EAX(跨断跳跃到一地址)
单步跟踪这种壳有几个注意:
F7(步入) F8(步过) F4(运行到鼠标处) F2(下/取消访问断点)
寻找OEP的路上一定要勇往直前不能回头,使劲一切方法跳出其循环,他想回头就F4他,也有好多例外不过总会有解决的办法越过他去,继续前行。
注意一下几点:
JMP的时候看一下地址的差距很远F8即可很近就得F7进去否则程序会飞
CALL有的时候就是变形的JMP比较地址差选择F7 F8即可
F7是很安全的不过就是浪费时间
F8步过对压缩壳用的很多,F7步过加密壳用的很多
其他的脱壳方法(这里只说怎么做):
1简单常见有名的壳可以去下载其脱壳机脱之
2 ESP定律(堆栈平衡定律)(很有用可以脱去大部分压缩壳和少量的加密壳)
3内存镜像法 在rcsc这里断 F9第二次在code断F9差不多到OEP了就
4最后一次异常法不忽略所有异常shift+f9一路下去数着次数知道程序运行
重新加载再shift+f9一路下去次数比运行时的次数少一次,然后查看堆栈窗口处查看
下边找一实例
0012FFBC 0012FFE0 指向下一个SEH记录的指针
0012FFC0 0040CCD7 SE处理程序 //CTRL+G到这个地址处 下断 Shit+F9运行
0012FFC4 7C817077 返回到kernel32.7C817077
0012FFC8 7C930228 ntdll.7C930228
然后单步走即可,找OEP去,嘎嘎…
5懒方法(好像可以脱好多壳),设置OD如下
1、忽略所有的异常
2、“调试选项”–“SFX”–“字节模式跟踪实际入口”
等着OEP自己出来。
6模拟跟踪法打开内存找到 00405000 SFX,数据这地
直接这样下断tc eip< 00405000等OEP出现等等
脱壳完后还有重要的一步修复。
有的程序脱完壳就不能运行了。
1 直接ImportREC获取源程序(加壳的那个)的导入表然后DUMP咱脱完壳的程序
2 如果碰到有无效的函数指针、将其修复先尝试使用右击设置跟踪级别为1 2 3什么的 如果还有的话 直接右击反汇编进去找到那个函数复制
其名字然后双击这个无效的函数指针将这个函数名复制进去确定即可 最后没有了无效的DUMP。
3 有的时候是PE损坏了 用LOADPE的重建PE功能即可
4 我碰见过几回先LOADPE 再ImportREC修复就行了。
一点小笔记先记下接下来就是无限的去脱壳,总结经验。
下一篇:学OD -- 函数参考