【目标程序】:幻影 V2.33加壳的EdrLib.dll。附件中含有输入表和UnPacked以供参考。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg1.10修改版、IdtTool、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脱壳过程】:
关于用 幻影 加壳DLL的脱壳,直至如今还没有公开一篇教程。于是我琢磨着写了这点东西,聊以充数吧。
先运行 飞叶流枫 兄的IdtTool保存中断地址,调试出错后恢复IDT,免得重启。
老规矩:用IsDebug 1.4插件去掉flyODBG的调试器标志。设置flyODBG忽略所有的异常选项。
其实幻影加壳DLL的脱壳难点就在于重定位表的处理,因为没有资料可以参考,所以只好自己分析了。
你可以先跟到OEP,然后在DLL需要重定位的地址下内存写入断点,从而得到幻影对DLL重定位数据的处理代码段。下面提供的简便方法是在这个基础上归纳、总结出来的,或许不适用于幻影的所有版本。
常听见有朋友说公开的教程大部分只是过程记录而已,没有破解思路,进而怀疑写教程的兄弟害怕观者学习。
不知上面的一段话可否算为 简单的思路?其实很多时候作者的思路皆蕴涵在其过程之中!关键是看你自己怎么去看罢了。
至于“害怕观者学习”等等说法更是无稽之谈了。整理出笔记是件比较辛苦的事,能够发布笔记的兄弟都是忙里偷闲劳神费力无私分享出自己的成果,如果存在防他人学习的意思又何苦写这些东西呀?
另外:幻影 的威力依然不看小觑,刚开始学习脱壳的朋友暂时别碰了,不小心则爱机重启没商量。
卖油翁曰:“唯手熟而”,世上事大多如此,熟练之后方能产生技巧,方能得到属于你自己的感觉。
―――――――――――――――――――――――――――――――――
一、得到 重定位表 信息
首先我们可以跟到OEP,具体可以参看我以前发的《1分钟寻找 幻影 V2.33 壳的OEP》。
随便找一处DLL需重定位的代码,如:
003B11DC 833D 60533B00 00 cmp dword ptr ds:[3B5360],0
003B11E0处的3B肯定是被重定位之后的,记住这个地址。
用Ollydbg重新载入DLL,再次开始我们的DLL脱壳之旅…… …… GO GO GO! ^O^
003B7000 EB 20 jmp short EdrLib.003B7022//进入OD后停在这
003B7022 9C pushfd
003B7023 55 push ebp
003B7024 57 push edi
003B7025 56 push esi
003B7026 52 push edx
003B7027 51 push ecx
003B7028 53 push ebx
003B7029 9C pushfd
003B702A E8 00000000 call EdrLib.003B702F
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
HE VirtualAlloc 时的堆栈:
0006F8B4 003B7100 /CALL 到 VirtualAlloc 来自 EdrLib.003B70FA
0006F8B8 00000000 |Address = NULL
0006F8BC 0002DA70 |Size = 2DA70 (186992.)
0006F8C0 00001000 |AllocationType = MEM_COMMIT
0006F8C4 00000004 \Protect = PAGE_READWRITE
0006F8B8 003D4215 /CALL 到 VirtualAlloc 来自 EdrLib.003D420F
0006F8BC 00000000 |Address = NULL
0006F8C0 00030629 |Size = 30629 (198185.)
0006F8C4 00102000 |AllocationType = MEM_RESERVE|MEM_TOP_DOWN
0006F8C8 00000040 \Protect = PAGE_EXECUTE_READWRITE
0006F8BC 003D4234 /CALL 到 VirtualAlloc 来自 EdrLib.003D422E
0006F8C0 7FF60000 |Address = 7FF60000
0006F8C4 00030629 |Size = 30629 (198185.)
0006F8C8 00101000 |AllocationType = MEM_COMMIT|MEM_TOP_DOWN
0006F8CC 00000040 \Protect = PAGE_EXECUTE_READWRITE
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
003D4234 72 03 jb short EdrLib.003D4239//第1次
7FF7D504 83C4 04 add esp,4//第2次
7FF7D507 EB 02 jmp short 7FF7D50B
mov di,word ptr ds:[esi]
cmp di,word ptr ds:[esi+2]
7FF80FB9 33C0 xor eax,eax
7FF80FBB 8BB5 FBCC4200 mov esi,dword ptr ss:[ebp+42CCFB]//直接F4到这里!
//[ebp+42CCFB]=[7FF864E2]=00006000 ★ 这个00006000就是重定位表的RVA!
7FF80FC1 83FE 00 cmp esi,0
7FF80FC4 74 60 je short 7FF81026
//可以使这里跳转,避开重定位!★
7FF80FC6 03B5 CBCA4200 add esi,dword ptr ss:[ebp+42CACB]
7FF80FCC 66:8B3E mov di,word ptr ds:[esi]//找到这里
7FF80FCF 66:3B7E 02 cmp di,word ptr ds:[esi+2]
7FF80FD3 74 51 je short 7FF81026
//重定位处理完毕后则跳转
7FF80FD5 8B3E mov edi,dword ptr ds:[esi]
7FF80FD7 83FF 00 cmp edi,0
7FF80FDA 74 4A je short 7FF81026
7FF80FDC 03BD CBCA4200 add edi,dword ptr ss:[ebp+42CACB]
7FF80FE2 8B4E 04 mov ecx,dword ptr ds:[esi+4]
7FF80FE5 83E9 08 sub ecx,8
7FF80FE8 83F9 00 cmp ecx,0
7FF80FEB 74 39 je short 7FF81026
7FF80FED D1E9 shr ecx,1
7FF80FEF 83C6 08 add esi,8
7FF80FF2 66:8B06 mov ax,word ptr ds:[esi]
7FF80FF5 66:25 00F0 and ax,0F000
7FF80FF9 66:3D 0030 cmp ax,3000
7FF80FFD 75 1C jnz short 7FF8101B
7FF80FFF 66:33C0 xor ax,ax
7FF81002 66:8706 xchg word ptr ds:[esi],ax
//注意:这里把重定位表清0!如果没在7FF80FC4处跳转的话则需要先把重定位表DUMP出来,脱壳后再粘贴回去!★
7FF81005 66:25 FF0F and ax,0FFF
7FF81009 8B9D 0FCD4200 mov ebx,dword ptr ss:[ebp+42CD0F]
7FF8100F 291C07 sub dword ptr ds:[edi+eax],ebx
7FF81012 8B9D CBCA4200 mov ebx,dword ptr ss:[ebp+42CACB]
7FF81018 011C07 add dword ptr ds:[edi+eax],ebx
7FF8101B 83C6 02 add esi,2
7FF8101E 49 dec ecx
7FF8101F 83F9 00 cmp ecx,0
7FF81022 75 CE jnz short 7FF80FF2
7FF81024 EB A6 jmp short 7FF80FCC//循环处理
7FF81026 61 popad
//这里下硬件断点,或者直接F4到这里。ESI=003B63B0
7FF81027 C3 retn
7FF7D504 83C4 04 add esp,4//来到7FFXXXXX地段
7FF7D507 EB 02 jmp short 7FF7D50B
7FF80FC4 74 60 je short 7FF81026
//修改为:jmp short 7FF81026
[注意]APP应用上架合规检测服务,协助应用顺利上架!