【目 标】:仙剑新版加壳程序
【工 具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任 务】:脱主程序的壳
【操作平台】:WINDOWS 2000 ADV SP2
【作 者】:loveboom[DFCG]
【相关链接】: 看雪那里找找
【简要说明】:嘿嘿,好久没什么壳玩的了,本人功力很菜,昨天弄几个软件都没有一个成功的(好失败).,今天趁还有一点时间,来玩玩linson的壳,他的东东我可是第一次碰,因为自己水平菜,所以以前不敢试的说。今天有幸骗壳过关,哈哈哈!
【详细过程】:
设置:忽略全部异常,隐身OD。
先用“照妖镜”(peid)看一下,晕倒,怎么可能是幻影的壳呢,同时“惊鼓喜”交加,惊是担心它真的像幻影那样让我的机子crash,喜的是,不管怎么说,自己还算成功脱过幻影的壳。作好思想准备后:),按f9运行一次,程序中断:
00412167 F0:0FC7C8 LOCK CMPXCHG8B EAX ;非法使用寄存器
0041216B AA STOS BYTE PTR ES:[EDI]
怎么感觉像ExEcryptor呢,在我碰过的壳里,只看过Execryptor和pelock两个壳用过这一招。不管它先,我们现在打开选项框,在异常里添加最后的异常,并在前面打上钩,这样用自己DIY的OD就可以忽略它继续前进.
因为壳都要对输入表进行“处理”,所以不管它加不加密都要这一步,那我们也就下这个断
bp LoadLibraryA,下断后,shift+f9继续运行,这样就会中断在LoadLibraryA系统Dll中:
77E6A254 > 55 PUSH EBP ;中断在这里,取消断点,再返回
77E6A255 8BEC MOV EBP,ESP
77E6A257 53 PUSH EBX
77E6A258 56 PUSH ESI
77E6A259 57 PUSH EDI
返回到下面,看到这么整齐,就知道有好东西了(其实到这里,有一个更快的方法找到OEP,具体我是不会说的,留给大家的“作业”,做不出来要打pp的说,那样也太对不起fly兄的苦心.)
00412238 8BF0 MOV ESI,EAX ;回到这里
0041223A 8985 D7294000 MOV DWORD PTR SS:[EBP+4029D7],EAX
00412240 8DBD 97204000 LEA EDI,DWORD PTR SS:[EBP+402097]
00412246 8D85 DB294000 LEA EAX,DWORD PTR SS:[EBP+4029DB]
0041224C FFD7 CALL EDI
0041224E 8985 EC294000 MOV DWORD PTR SS:[EBP+4029EC],EAX
00412254 8D85 F0294000 LEA EAX,DWORD PTR SS:[EBP+4029F0]
0041225A FFD7 CALL EDI
0041225C 8985 FF294000 MOV DWORD PTR SS:[EBP+4029FF],EAX
00412262 8D85 032A4000 LEA EAX,DWORD PTR SS:[EBP+402A03]
00412268 FFD7 CALL EDI
0041226A 8985 162A4000 MOV DWORD PTR SS:[EBP+402A16],EAX
00412270 8D85 1A2A4000 LEA EAX,DWORD PTR SS:[EBP+402A1A]
00412276 FFD7 CALL EDI
00412278 8985 262A4000 MOV DWORD PTR SS:[EBP+402A26],EAX
返回后,按三次Ctrl+f9(每按完后记得按F8一次):
//第一次
004122D8 50 PUSH EAX
004122D9 C3 RETN
//第二次
004123DE 50 PUSH EAX
004123DF C3 RETN
//第三次
0041241B 50 PUSH EAX
0041241C C3 RETN
第三次Ctrl+f9后按一次F8就到这里:
004124F3 8B85 36284000 MOV EAX,DWORD PTR SS:[EBP+402836] //到这里停下
004124F9 0385 3A284000 ADD EAX,DWORD PTR SS:[EBP+40283A] //哈哈,这里加上去的话就是OEP了。
004124FF EB 02 JMP SHORT Main.00412503
00412501 CD 20 INT 20
00412503 C1C8 07 ROR EAX,7 //这里EAX等于OEP,怎么这么熟,“长”得好像YODA的某个壳中的东东.
00412506 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
到这里我们就得到了程序的OEP,下面我们要跳过iat加密,找到正确的输入表,要不进入程序OEP后,就有得玩了。接着下bp GetProcAddress,下断后,按F9飞一下停住了:
77E69AC1 > 55 PUSH EBP //停在这里
77E69AC2 8BEC MOV EBP,ESP
77E69AC4 51 PUSH ECX
停下后,ALT+F9回到程序代码处:
0041263B 0BC0 OR EAX,EAX ; KeRnEl32.CloseHandle
0041263D 75 07 JNZ SHORT Main.00412646
0041263F 59 POP ECX
停下后Ctrl+f9再次运行到ret处:
004129EB 40 INC EAX
004129EC 8038 00 CMP BYTE PTR DS:[EAX],0
004129EF ^ 75 F7 JNZ SHORT Main.004129E8
004129F1 C3 RETN //停在这里
停下来按f8就看到好东西:
00412663 61 POPAD
00412664 8902 MOV DWORD PTR DS:[EDX],EAX ; KeRnEl32.CloseHandle
//这里不就是传递API吗
00412666 EB 1D JMP SHORT Main.00412685 //跳去判断处
00412668 52 PUSH EDX
00412669 51 PUSH ECX
0041266A 8B01 MOV EAX,DWORD PTR DS:[ECX]
0041266C 2D 00000080 SUB EAX,80000000
00412671 50 PUSH EAX
00412672 53 PUSH EBX
00412673 FF95 C6294000 CALL DWORD PTR SS:[EBP+4029C6]
00412679 85C0 TEST EAX,EAX
0041267B 0F84 B6000000 JE Main.00412737
00412681 59 POP ECX
00412682 5A POP EDX
00412683 8902 MOV DWORD PTR DS:[EDX],EAX
00412685 F785 3E284000 2>TEST DWORD PTR SS:[EBP+40283E],20 //看到这个我怎么又想起OBS来了,OBS我还是蒙过来的。
0041268F 0F84 83000000 JE Main.00412718 //这里改一下它就不会乱来了
//这里改成jmp addr
00412695 EB 02 JMP SHORT Main.00412699
改完后,自以为没事了,go一下oep怎么回事,退出了,看来还有桩没去除,没事,不是幻影那样让我的机子“蓝屏”就不怕它,再来,重复一次来到这里。
现在向下看看:
0041272A 837E 04 00 CMP DWORD PTR DS:[ESI+4],0
0041272E ^ 0F85 6EFEFFFF JNZ Main.004125A2
00412734 33C0 XOR EAX,EAX
00412736 40 INC EAX
00412737 83F8 01 CMP EAX,1
0041273A 74 02 JE SHORT Main.0041273E //直接F4到这里
0041273C 61 POPAD
0041273D C3 RETN
F4直接运行到41273a处,因为上面一大段都是GetProcAddress来做事.运行到41273A处后,慢慢按F7、F8了.其实并不远:
004127DD 8B9D 46284000 MOV EBX,DWORD PTR SS:[EBP+402846]
004127E3 33C3 XOR EAX,EBX //嘿嘿,发现“二伍仔”了
004127E5 74 08 JE SHORT Main.004127EF //为了防止再次被“暗算”,我直接改标志,这样它就不能把我怎么样了吧,改标志,让这里跳转成功.
004127E7 EB 01 JMP SHORT Main.004127EA
过了这一关后,我们按f8到这里了:
00412801 2AC3 SUB AL,BL
00412803 C0C0 02 ROL AL,2
00412806 AA STOS BYTE PTR ES:[EDI]
00412807 43 INC EBX
00412808 ^ E2 F4 LOOPD SHORT Main.004127FE
0041280A EB 03 JMP SHORT Main.0041280F //这里直接F4跳过上面的循环,这后,按几次f8看到很多比较的东东,我们要找的就是CMP AX,25FF:
004128DE 83C6 05 ADD ESI,5 //颜色变深红,难看的说.
004128E1 ^ E9 53FFFFFF JMP Main.00412839
004128E6 3C CC CMP AL,0CC
004128E8 75 06 JNZ SHORT Main.004128F0
004128EA 46 INC ESI
004128EB ^ E9 49FFFFFF JMP Main.00412839
004128F0 66:3D FF25 CMP AX,25FF //就是这里
004128F4 75 08 JNZ SHORT Main.004128FE //直接F4到这里
004128F6 8D85 AF274000 LEA EAX,DWORD PTR SS:[EBP+4027AF]
004128FC FFD0 CALL EAX
004128FE 61 POPAD
直接F4到4128f4处,为什么是这里呢,原因很简单,25FF不就是jmp api里的机器码.
现在在4128F4处改标志,让程序跳,这样就不会动手脚.
跳过这里后,就不会有什么东东了,我们直下G OEP(这个就是我们上面看到eax的值)。
到oep后纠正大小->dump->fixdump(某鸟曰:怎么dump呀?狂晕中@_@……)就可以收工了。
【总 结】:
脱个东东,怎么让我想到幻影、yoda、obs,怀疑自己中了“乱想”症,FSMM快帮我检查一下先。
BTW:现实中,我是一个比较爱静、多愁伤感、不喜欢说话的人,也不是很会讲笑的人,我只是觉得我自己写的文章,不用像教程那样一板一眼,难接受,所以我写的东东多数有“灌水”之疑.
Thanks:
Fly 辉仔yock、jingulong、二哥、所有曾经关心支持或帮助过我的朋友!谢谢您们!
by loveboom[DFCG][FCG]
Email:bmd2chen@tom.com