文档详情

VMP主程序脱壳分析.doc

发布:2016-04-29约1.06万字共11页下载文档
文本预览下载声明
窗体顶端 NOOBY牛已经玩得差不多了 我来补一刀 ^_^ 引用:55 push ebpE8 30C52800 call 0029D7AE ; 0029D7AE 0001127E 8BC0 mov eax,eax50 push eaxE8 E8E92700 call 0028FC6E ; 0028FC6E8BC0 mov eax,eax55 push ebpE8 5B333700 call 003845E9 ; 003845E9 0001128E 8BC0 mov eax,eax52 push edxE8 FBE02C00 call 002DF391 ; 002DF391 被错位了 写段脚本恢复FF25的错位 引用: luanxu: inc search find search,#E8??????008BC0# cmp $RESULT,0 je exit mov search,$RESULT GCI search,DESTINATION cmp $RESULT,001F3000 //UPX0-VA jb luanxu cmp $RESULT,003DE000 //UPX2-VA jae luanxu GCI search,COMMAND dec search mov [search],#909090909090# asm search,$RESULT jmp luanxu 修复后: 引用:E8 31C52800 call 0029D7AE ; 0029D7AE 0001127D 90 nop 0001127E 8BC0 mov eax,eaxE8 E9E92700 call 0028FC6E ; 0028FC6E90 nop8BC0 mov eax,eaxE8 5C333700 call 003845E9 ; 003845E9 0001128D 90 nop 0001128E 8BC0 mov eax,eaxE8 FCE02C00 call 002DF391 ; 002DF39190 nop 找个CALL跟跟看 有什么新花样 EIP单步 什么都不用看 只看3条 引用: MOV EXX,A LEA EXX,[EXX+B] LEA EXX,[EXX+C] 这个CALL里用到以下3条 引用: 002ADE81 BDmov ebp,57256 002ADE8A 8BAD AF693000 mov ebp,dword ptr ss:[ebp+3069AF] 0034A300 8DAD 626F45AB lea ebp,dword ptr ss:[ebp+AB456F62] 前面2条合起来指向一个DWORD 和最后一条组装成最终的函数地址 引用: [A+B]=[57256+3069AF]=[0035DC05]=D13B2C85----记为R1 R1+AB456F62=7C809BE7--指向我本机的kernel32.CloseHandle NOOBY牛的视频里 找的就是这个 视频里面最后生成的LOG文件里面 每一行的4个成员 后面2个一目了然 是真实函数以及对应的DLL 前面2个则是A+B,C了 这里VMP把A+B拆分成了A和B 使得我们难以在第一次看到A或者B时就能确定是哪个函数(关于NOOBY的VMP1.8脚本可能会另外撰文补充或者等NOOBY牛的BIN ^_^) 经过这3条之后 最终函数的真实地址保存在EXX中 这里的EXX不是固定的 给通用脚本编写增加不少难度 最后保存在EXX中的函数会通过一个 引用: push dword ptr ss:[esp+D] retn E 结构返回真实API地址 这里的D,E也不是固定的 看完FF25后 再来看看IAT调用 一般的DELPHI程序 第一处IAT调用CALL便是这个 引用:53 push ebx83C4 BC add esp,-44BB 0A000000 mov ebx,0A54 push esp 0001143A E8 260E3A00 call 003B2265 ; 003B2265 0001143F F64424 2C 01 test byte ptr ss:[esp+2C],174 05 je short
显示全部
相似文档