能力值:
( LV9,RANK:220 )
2 楼
最近一直在玩PEP,陆陆续续对它的IAT加密,VM,ANTI,资源加密都有了点认识,IAT和ANTI前面已经写过了,在这里http://bbs.pediy.com/showthread.php?t=97579
今天来简单谈谈他的资源加密.
从头说起.
PEP会把原始文件的资源片加密后分散保存,然后Hook
FindResourceExW FindResourceExA FindResourceW FindResourceA SizeofResource LoadResource
这么几个资源相关的函数,并判断调用是否来自目标程序,如果是则指向壳里面PEPVM.DLL对应的hookxx函数,反之还原被hook jmp占用的几个字节,并调往原始函数继续执行.
关于它的资源加密,fxyang以及DarkBull两位前辈都是通过LoadResource,LoadStringX,LoadBitmapX,LoadCursorX,LoadIconX观察返回值确定资源片地址,这样做不仅体力活重且容易漏,因为不是每个程序都会一一调用到这些函数.
所以我们不得不寻求更高效的修复法:
既然要在调用资源的时候能够正确被找到,那么肯定要查表.壳通过查表才知道被他加密的资源片保存在哪里.既然查表,肯定有索引.
所以壳通过FindResourceA(W)返回索引值,通过LoadResource查表得到资源片地址,通过SizeofResource得到当前资源片大小.
索引值从1开始,与原始文件的资源片在顺序上一一对应.
这里我们可以强行喂给它索引值,并递加此索引,让壳查表解密,然后再强行跳往hookSizeofResource,让壳计算资源片大小.这样一来,体力活全部都由壳自己来完成了.^_^
当hookLoadResource返回值为0时,表示当前索引不存在,也就是说所有的资源片已经全部被我们找到了.
分析完毕,可以写脚本了.
//////////////////////////////////////////// // PEP2.x~3.x Resource Dumper.txt // Kissy[UpK] // // info:reach to oep,run the script,then you'll get all the pieces of Resource which were encrypted by Pep 2.x~3.x. //////////////////////////////////////////// var imgbase var Loadrc var Loadret var Sizeofrc var Sizeofret var num var dumpva var dumpname var dumpsize var tmp cmp $VERSION, "1.52" jb odver mov num,1 gmi eip,MODULEBASE mov imgbase,$RESULT //获取基址 gpa "LoadResource","Kernel32.dll" mov Loadrc,$RESULT find Loadrc,#E9#,1 cmp $RESULT,0 je error gci Loadrc,DESTINATION mov Loadret,$RESULT find Loadret,#68????????C3# mov tmp,$RESULT mov Loadret,[tmp+1] find Loadret,#C20800# mov Loadret,$RESULT bp Loadret //hookLoadResource //查找壳导出函数hookLoadResource的返回RETN gpa "SizeofResource","Kernel32.dll" mov Sizeofrc,$RESULT find Sizeofrc,#E9#,1 cmp $RESULT,0 je error gci Sizeofrc,DESTINATION mov Sizeofret,$RESULT find Sizeofret,#68????????C3# mov tmp,$RESULT mov Sizeofret,[tmp+1] find Sizeofret,#C20800# mov Sizeofret,$RESULT bp Sizeofret //hookSizeofResource //查找壳导出函数hookSizeofResource的返回RETN loopdumprc: mov [esp+4],imgbase //镜像基址,告诉壳当前调用来自程序,让他放心干苦力 ^_^ mov [esp+8],num //num为索引 mov eip,Loadrc esto cmp eax,0 //判断索引是否结束 je exit mov dumpva,eax //得到资源片起始地址 mov eip,Sizeofrc esto cmp eax,0 je error mov dumpsize,eax //得到资源片大小 eval "{num}.bin" mov dumpname,$RESULT dm dumpva,dumpsize,dumpname inc num //索引递加 jmp loopdumprc error: msg "no resource needed to be dumped or you made some mistake." pause odver: msg "plz update ODbgScript.dll to 1.65 or above." ret exit: dec num eval "All {num} pieces of resource were dumped! You can fix them to your target later." msg $RESULT msg "Kissy[UpK]" ret
脚本我写成了全自动的,停在OEP后跑脚本,跑完后原始程序中所有的资源片就全部DUMP出来了.贴回dump+fix的程序中即可.
能力值:
( LV2,RANK:10 )
3 楼
脱壳没学会
倒是学了点脱壳脚本的知识
谢谢楼主