软件壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳(强壳)两种,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。
壳的工作原理
某些加壳程序加壳后会修改了原来导入目录表的位置为壳的导入表,这样默认的导入表指向壳部分的导入表,你就看不到原来的导入表的内容了。程序启动后,操作系统为壳的导入表加载,在壳代码运行完成之后,壳代码会跳到原程序的入口点OEP,壳模拟操作系统填充原来导入表IAT,这样保证代码段能正常调用函数。一般壳的工作原理也就是这样了,随着现在加壳加密技术的进步,不是所有加壳软件都会这样。
脱壳原理
首先修改被加壳程序的入口点到程序原来的OEP,然后修改PE程序导入表目录地址为原来导入表地址,或者新建一个节,将这个新节作为导入表节,并将原导入表内容写入新节导入表。
普通壳脱壳
例如:先用peid查一下壳,发现有壳(这里是upx壳)[查壳工具主要以peid和fileinfo这两个软件为代表]
接下里分别用下面5种方法脱壳
1、单步跟踪法
一般先f8单步步过,遇见向上的f4跳到下一条语句,然后会发现,一般有很大的跳转(大跨段),比如jmp XXXXXX 或者JE XXXXXX或者有RETN的一般很快就会到程序的OEP
2、ESP定律法
原理:利用堆栈平衡
OD加载,会看见pushad,运行一步,下硬件断点
运行,就会在硬件断点的位置啦,删除硬件断点,接着往下执行几步就可以看见OEP啦
3、两次内存镜像法
如图:
点击运行,到达这里
接着
点击运行
4、一步到达OEP(对少数壳有用)
OD加载后,Ctrl+F,搜索popad,接着f4运行到这里,接着一步步往下找就可以找到OEP啦。
5、模拟跟踪法
上面都可以属于模拟跟踪法。
6、SFX
重载后,自动跳到程序入口点
7、修复IAT
先找到OEP,先用loadPE脱下壳,然后用ImportREC修复IAT,操作如下:
loadPE先dump下文件
PEID查
ImportREC修复IAT(这里我是手动OEP修改的,有些直接自己获取OEP)
接着转储文件选择刚才dump下来的文件,点击运行
vmprotect脱壳
这里有vc的程序作为示例:
正常的vc的程序的入口是的机器码是: 55 8b ec
而vmp的壳的程序,是找不到55 8b ec,这里学习记录一下脱壳方法
1、用exeinfo PE查壳
2、设置OD:选项->调试设置->事件->系统断点
3、将程序载入od,f9运行,便会来到一个call,(ctrl+g)搜索,VirtualProtect:
4、接着便会来到一个地址,在这里下断点,继续f9,
5、然后运行几次f9都会断到这里,NewProtect = READONLY且最后一次时(运行几次就知道啦,低位不会变),此时alt+B,断点界面取消或禁用断点,然后alt+M,对text段下内存访问断点:
6、来到这里
7、(ctrl+g)搜索401000,硬件访问断点。运行,接着可以搜索特征码:EB0B85F375078BC6C1E0100BF0
8、这时就会找到OEP啦,可以直接dump出来,IDA可以看见算法啦,如果要运行,还需要IAT修复
这里分享一下vmp脱壳教程
链接: http://pan.baidu.com/s/1qWt14lA 密码: 2wmq 解压密码:www.lthack.com
文学修养
衣带渐宽终不悔,
为伊消得人憔悴。