揭开神秘面纱之幻影
【目 标】:幻影v2.2主程序
【工 具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任 务】:脱主程序的壳
【操作平台】:WINDOWS 2000 ADV SP2
【作 者】:loveboom[DFCG]
【相关链接】: http://dbpe.allit.net/
【简要说明】:这款壳在我刚中上壳的“毒”的时候,感觉它很神秘,有点像现在的xprotect一样,因为在当时没有找到过一篇关于幻影脱壳相关的文章(可能当时有,我没有条件上网吧),现在才知道原来不是幻影很神秘,而是因为……,当时认为神秘的一个主要原因是:当我第一次调试失败后,再加载系统就crash了,win2k之类的系统蓝屏可算是少见的多。当然这款壳还是相当不错的,国产精品,在世界壳之林来说也可以进入TOP10(个人观点)。如果幻影在以后的版本中加上定身定造,加上强劲的输入表加密及传说中的壳和程序融为一体的话,那脱壳者真的没得混了!
你可然会觉得奇怪,fly的2.3的脱文都早以出来了,为什么还要写2.2的呢?难道2.2比2.3更强?当然不是,2.2可能没有2.3的强,但如果不用IDT tool 在2k下调试不用去花指令插件,应该别有一番意思吧。我只是菜鸟一只,没有fly等高手那么变态,只会用笨方法跟,经过N次crash之后,终于看到了一丝阳光(找到一个快一点的脱壳方法)。现写出来与大家共享。因壳比较猛,所以在不用插件的情况下要十万分小心。
【详细过程】:
设置:忽略内存异常,不用隐身的了,因为这个版本还不会检查ollydbg.
载入后:
00504000 > EB 20 JMP SHORT dbpe.00504022 //典型入口
00504002 0000 ADD BYTE PTR DS:[EAX],AL
在命令栏下he CloseHandle,再运行,现在注意堆栈的变化:
第一次中断
0012FF78 00505DF7 /CALL to CloseHandle from dbpe.00505DF1
0012FF7C 00000038 hObject = 00000038 (window)
……
第二次
0012FF2C 77DA4E25 /CALL to CloseHandle from advapi32.77DA4E1F
0012FF30 00000038 hObject = 00000038 (window)
……
第三次
0012FF98 005090FE /CALL to CloseHandle from dbpe.005090F8
0012FF9C 00000034 hObject = 00000034
……
三次中断后,HD CloseHandle取消硬件断点
在内存页面中的Code段下F2断点,然后F9运行
Memory map, item 12
Address=00401000
Size=000C8000 (819200.)
Owner=dbpe 00400000
Section=.text
Contains=code
Type=Imag 01001002
Access=R
Initial access=RWE
这样会弹出试用框,关闭试用框后到这里:
009C2A5F 66:3103 XOR WORD PTR DS:[EBX],AX //停在这里
009C2A62 74 03 JE SHORT 009C2A67
到这里后,你可以下mr GetProcAddress来跟(如果在没有找到规律前跟踪时要很小心的,有很多地方像pushf之类的是骗人来的不能F7或F8或F4的,遇到这种情况时你就在它的下面指令处下硬件断点,然后执行,有的地方不能下硬件断点的就下内存断点,我自己是用“双保险”内存断点和硬件断点一起上:0。),不过如果你跟过几次之后就会发现它的规律所在,我也就用找到的规律而不一步一步跟了.CTRL+B找89BD:
第一次
009C4B9B ^75 89 JNZ SHORT 009C4B26
009C4B9D BD 6DA54100 MOV EBP,41A56D
009C4B9C 89BD 6DA54100 MOV DWORD PTR SS:[EBP+41A56D],EDI //整理后
第二次
009C4CD7 ^75 89 JNZ SHORT 009C4C62
009C4CD9 BD 6DA54100 MOV EBP,41A56D
009C4CD8 89BD 6DA54100 MOV DWORD PTR SS:[EBP+41A56D],EDI //整理后
第三次
009C4DFC ^75 89 JNZ SHORT 009C4D87
009C4DFE BD AAF14100 MOV EBP,41F1AA
009C4DFD 89BD AAF14100 MOV DWORD PTR SS:[EBP+41F1AA],EDI //整理后
第四次
009C4E19 ^75 89 JNZ SHORT 009C4DA4
009C4E1B BD A6F14100 MOV EBP,41F1A6
009C4E1A 89BD A6F14100 MOV DWORD PTR SS:[EBP+41F1A6],EDI //整理后
后面就不用找了
把第四次nop掉,再找CTRL+B 找890F,在第四次不远处
009C4E45 ^75 89 JNZ SHORT 009C4DD0
009C4E47 0F9C72 0A SETL BYTE PTR DS:[EDX+A]
009C4E46 890F MOV DWORD PTR DS:[EDI],ECX
找到后改为8907:
009C4E46 8907 MOV DWORD PTR DS:[EDI],EAX //传入正确的api
改完后CTRL+B 找 FFE0
009CDBA7 FFE0 JMP EAX
在找到的地址处下内存断点(mr 009cdba7).F9运行后停在这里,这时eax==oep.再按一次f8到了程序地盘了.现在先别dump,你看看后面的跳转表就知道了
004C84B4 FF25 1C014E80 JMP DWORD PTR DS:[804E011C]
……
,打开winhex内存编辑,选择dbpe的主程序.ctrl+alt+h查找4E80替换为4E00向下替换.做完这项工作后,关闭winhex再回到ollydbg中,现在看看是不是全部修复好了.这时你再AC(Analyse Code)一下就像加载没加壳的程序那样有相关的说明.
用ImportREC1.6写入oep->iat autosearch晕了,只有一点函数.看来要我们自己写iat位置了,如果你这里看ollydbg里就可以知道iat大小,E0EC4-E011C=DA8,也就是VRA=E011C SIZE=DA8,现在可以用lordpe纠正imagesize一下再dump->fixdump->cut那没有名字的段并rebuilder一下。这样幻影2.2的主程序也就脱完了,主程序破解是妖等人做的事,我是菜鸟所以不会.
附:
主程序算法RSA1024:
N=76507FA4328A3A6D6FFF0227AD20B2FAF2C07DD8F6E11A3BD3D9B6AD315B97FE704490B6A45173D394B76BDF302FBF50D1D6BC1E53C9B36F6562CCB27250ED4FBF51DA6355A5AFC18FA4B553A3EC1A9BD260B4DDCC36E640AC14BFECCD321FDD7610FCCD81419FD7243AA7DF041A4BE912C858D5346BAE1C703509D2398C43C1
E=65537
献给我亲爱的DFCG,愿它能够蒸蒸日上!
Thanks:
Fly 辉仔yock、jingulong、二哥、所有曾经关心支持或帮助过我的朋友!谢谢您们!
by loveboom[DFCG]
Email:bmd2chen@tom.com
2004-3-8