脱一些简单的压缩壳
文章目录
脱一些简单的压缩壳.
首先看看一个壳的基本流程
1:保存入口参数, 一般都有这一步了
2:获取外壳所需的地址, 比如LoadLibrary, GetProcAddress
3:解密源程序的各个区块
4:IAT的初始化, 这个所有的壳都必须做的事情, 这一步也是斗争最激烈的战场
5:重定位的处理, EXE加密就没有了, DLL有这一步.
6:Hook Api函数, 外壳为了能够不停的得到控制权, 所以一般都会将原来IAT的地址替换成外壳的地址.
7:跳到源程序的oep..
根据上面的情况我们可以看出来, 我们只要的第七步dump程序出来就可以了.. 这时间时机很好, 各项全局变量也
没有初始化. 挺好. 但是现在到第7步的程序, 一般IAT表都已经被壳给处理了, 所以在oep处, 我们还需要做一些工作.
找OEP.
1: 根据跨段指令寻找OEP. 这个主要是根据外壳程序每次处理的步骤一个漏洞.
2: 程序退出法找oep, 这个对窗口程序比较有效果, 运行程序, 然后绑定上去, 中断, 让所有的跳转都不往回跳转, 然后程序就会走到退出的位置, 就是这样. 退出的位置也在oep附近了.
3: esp定律寻找oep, 这个更加快.esp定律还用两种方法, 一种是在堆栈顶部下硬件读取断点, 断在popad的地方, 另外一种是对堆栈底部下硬件写入断点, 这种就刚好停在入口了.
dump:
dump这里没什么好说的, 除了一些限制我们dump的手段外, 就是这个修复IAT了, 主要是这个麻烦点. 不过手工修复几次, 然后用ImportREC搞几次, 应该就印象比较深刻了.
简单的壳就是这样了. 呵呵.
DLL文件的脱壳.
想都想得到, 对于DLL文件的脱壳, 除了相等的EXE的难度外, 另外还需要处理一个重定位表, 这个表处理套路其实也很简单.
对于DLL来说, 入口会在Load和Free的时候都调用, 所以如果我们遇到未知的壳, 又想简单找入口, 用DLL会比较简单, 在Free那次断在入口.跑几步就到oep了.
另外一个DLL文件的话, 有一个重定位表的处理, 这个的话在代码段找一个有重定位的项目, 在代码段解压出来还没有重定位的时候, 在一个重定位项目上面下个
内存写入断点, 这样很容易就可以找到我们需要定位的地方.
exe文件脱壳过程:
1:找oep, 因为我们这里使用的壳非常的简单, 主要是用于实验性目的, 就用upx了. upx的oep的话, 是非常好找的. esp定律就行.
2:到oep, 使用LordPE dump出来就可以了.
3:ImportRec修复IAT表 OK就这么简单.
dll文件脱壳过程:
1:找oep, dll的oep比较好找, 一般在退出程序free的时候找一次就可以.
2:dll dump的时候和exe不大一样, 首先在跑到oep之前, 我们应该跳过dll的重定位代码, 不要给做重定位. dump一份出来
3:dump了一份没有重定位的代码, 然后重新运行exe跑到oep, 这次是使用importRec修复IAT. 和exe一样
4:dump出来以后, 这次我们要将DLL的重定位数据抽取一份出来, 这个要具体分析外壳的重定位格式和代码.
4:重定位信息修复出来以后, 使用看雪加密解密3的一个工具, 将抽取出来的重定位表, 再次导入我们dump出来的DLL中.
文章作者 忆杰
上次更新 2012-09-06