PEP的脱文比较少,高版本ANTI-DUMP,资源保护,IAT加密 的处理也比较有意思,最高的注册版为2.71版, 选择DELPHI7无壳试炼品,entry point virtualization mode可以按照语言特征很快恢复,故不勾选,其他保护选项全选.
这里有必要一提的是,PEP的live protection at run-time不太稳定,大家抱怨PEP兼容性差也多是勾选了这个选项的缘故.
加壳完毕后发现第二个段虚拟大小为25100000,这就是PEP的典型ANTI-DUMP特征.兼容性差也与这个有莫大关系.很多OD无法正确识别加壳后文件的区段,就是这里在作怪,可以选用SOD来辅助处理.
使用原版OD,勾选SOD全选项,并使用PATCH之后的phantom1.54保护DRX,方便下硬件断点.
SHIFT+F9跑起来 到401000搜索
找到DELPHI程序的第一个CALL为00405BC8,从而找到OEP为0044CA98.跟进第一个函数,观察被处理成了
这是勾选了do not restore iat的缘故,否则这里只会加密IAT而不处理FF25.单步走
这里我NOP了几个字节,方便看后面的RETN 4.
DarkBull在以前的文章中将此RETN命名为VM_RETN,暂且借用这个叫法.
在这里下个断,中断下来后在esp+8处出现了真实的GetModuleHandleA,这里还有一种情况,就是在esp+0处出现真实函数.
PEP2.3之后的版本在IAT处理上有点变化,壳会HOOK掉FindResourceA,LoadResource,SizeofResource等几个函数,以前的版本把代码中的FF25直接指向HookFindResourceA等.这几个函数在PEPVM.DLL中导出,PEPVM.DLL是PEP的功能DLL,可以从主程序中想想办法抓出来.
而新版则指向真实函数,当然真实函数入口被HOOK了.
所以在写脚本的时候,我们需要判断的情况也就少了一种.等于是新版本变相降低了强度.
中断在此RETN时,还有一种情况,就是返回壳模拟的几个函数.因为数量很少,所以脚本中不需要考虑这几个函数,留待后续手工处理.
脚本如下:
重载试炼品,修改脚本中相关数值,直接跑脚本.把OD窗口缩小,可以有效提高脚本运行速度.脚本跑完后会把大部分的FF25修复成JMP API.这里有4个漏掉的,分别是壳模拟的4个函数.
单步跟一下就出来了,具体跟踪过程,详见附件中动画.
至此API全部找出来了.用UIF修复成FF25即可.
用LOADPE修正镜像大小,用区域转存400000-460000.如果用完整转存的话,那个超级大的ANTI-DUMP区段就会让LOADPE假死.
修改区段数量为1,修改ROFFSET,RSIZE与VOFFSET,VSIZE一致.修改文件对齐为1000,部首大小为1000,RVA数及大小为10.清空输入表,资源表,TLS目录.
用IMPORTREC重建输入表.保存为unpacked.exe.
发现文件没有图标,这是因为PEP会把资源分块加密保存到壳里,运行调用时再解密,这是这个壳的一大特色.对此目前没有好的解决办法,只能从LoadResource等函数的返回值确定资源块的位置,然后保存下来贴进unpacked.exe里.
用FixResDemo DUMP加壳过后程序里面的图标,版本等资源信息.能找回一点是一点 ^_^ 保存为.rsrc,贴到unpacked.exe里.
为了方便后续资源的修复,扩充.rsrc段RSIZE到1000.
对HookFindResourceA下断,中断下来从堆栈找回资源名为TFrom1,紧接着断HookLoadResource和HookSizeofResource,找回
把这部分数据贴入TForm1.bin,用Stud_PE载入unpacked.exe
新增资源->number-RT_RCDATA->string-TForm1
资源文件选择TForm1.bin即可.
这样处理之后的unpacked.exe就可以运行了.针对PEP的资源加密,实际上没必要全部恢复,恢复必须的就行了.
用PE Optimizer优化下大小.
处理完毕大小为341KB
原版无壳文件为359KB.
收工.
附上视频,很详细.
http://www.brsbox.com/filebox/down/f...944c8731bb8f29