linson的eXcalibur V1.03脱壳――eXcalibur.exe 主程序
下载页面:
http://bbs.pediy.com/showthread.php?s=&postid=1130#post1130
软件大小: 20 K
【软件简介】:linson 的新壳
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg、PEiD、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脱壳过程】:
linson喜欢吓人,eXcalibur伪装成Xtreme-Protector 1.00-1.05 -> Rafael Ahucha & Sergio Lara壳。
eXcalibur比较精悍。具有压缩效果,新增了几处反跟踪和Stolen Call,没有自校验。熟悉之后脱壳就没什么难度了。
eXcalibur对于汇编和Delphi的程序支持较好。Yjjh.mid大小:13.9K,欣赏linson提供的音乐吧。
―――――――――――――――――――――――――――――――――
一、EnableWindow 反跟踪
设置Ollydbg忽略所有异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
0040B000 E9 00000000 jmp eXcalibu.0040B005//进入OD后停在这
0040B005 60 pushad
0040B006 E8 14000000 call eXcalibu.0040B01F
BP GetForegroundWindow 断下后取消断点,Alt+F9返回
003B0219 FFD0 call eax ; USER32.GetForegroundWindow
003B021B 8985 A4394000 mov dword ptr ss:[ebp+4039A4],eax//返回这里
003B0221 E8 0D000000 call 003B0233
003B0233 56 push esi
003B0234 FFD7 call edi
003B0236 8985 94394000 mov dword ptr ss:[ebp+403994],eax; USER32.EnableWindow
003B023C 6A 00 push 0//改为:push 1 ★
003B023E FFB5 A4394000 push dword ptr ss:[ebp+4039A4]
003B0244 FFD0 call eax ; USER32.EnableWindow
003B0246 E8 0A000000 call 003B0255
――――――――――――――――――――――――
二、避开 Stolen Call
linson 这次把程序中的不少Call都“偷走”了,呵呵,想办法让他住手!
BP VirtualAlloc 断下后取消断点,Alt+F9返回
003B02EB FF15 12B44000 call dword ptr ds:[<&KERNEL32.VirtualAlloc>]
003B02F1 FC cld
003B02F2 8BF8 mov edi,eax
003B02F4 8BB5 3C374000 mov esi,dword ptr ss:[ebp+40373C]
003B02FA 46 inc esi
003B02FB B9 10000000 mov ecx,10
003B0300 E8 5E000000 call 003B0363
003B0305 85C0 test eax,eax//目标CALL
003B0307 74 07 je short 003B0310//改变标志位Z=1, 使这里JMP ★
003B0309 E8 08000000 call 003B0316//linson开始破坏 :-) Stolen Call
003B030E E2 F0 loopd short 003B0300
003B0310 61 popad
003B0311 E9 BE000000 jmp 003B03D4
――――――――――――――――――――――――
三、ZwSetInformationThread 反跟踪
003B03D4 8BBD 98394000 mov edi,dword ptr ss:[ebp+403998]
003B03DA 85FF test edi,edi
003B03DC 74 0F je short 003B03ED
003B03DE FF95 78394000 call dword ptr ss:[ebp+403978]; kernel32.GetCurrentThread
003B03E4 6A 00 push 0
003B03E6 6A 00 push 0
003B03E8 6A 11 push 11
003B03EA 50 push eax
003B03EB FFD7 call edi; ntdll.ZwSetInformationThread//不能客气,当然是NOP掉!★
003B03ED BE B4120000 mov esi,12B4
003B03F2 85F6 test esi,esi
003B03F4 0F84 CA050000 je 003B09C4//记住这个地址,在003B09C4处下断
――――――――――――――――――――――――
四、避开IAT加密
快点的方法:Ctrl+B 在当前位置下搜索16进制值:61 80 找到在003B0985处
003B0975 61 popad//这里下断,F9运行断下
003B0976 3385 E0394000 xor eax,dword ptr ss:[ebp+4039E0]
003B097C 8907 mov dword ptr ds:[edi],eax//修改
003B097E 8385 E4394000 04 add dword ptr ss:[ebp+4039E4],4
003B0985 61 popad//找到这里
003B0986 80BD EC394000 00 cmp byte ptr ss:[ebp+4039EC],0
003B098D 75 1C jnz short 003B09AB
003B097C处改为:
003B097C 61 popad//呵呵,先来个POPAD ★
003B097D 8907 mov dword ptr ds:[edi],eax//正确的函数写入地址
003B097F 8385 E4394000 04 add dword ptr ss:[ebp+4039E4],4
003B0986 80BD EC394000 00 cmp byte ptr ss:[ebp+4039EC],0
003B098D 75 1C jnz short 003B09AB
――――――――――――――――――――――――
五、走至OEP、DUMP、完成脱壳
还记得在003B09C4处下断吧?避开IAT加密后F9运行断在003B09C4处
003B09C4 E8 23020000 call 003B0BEC//中断。断下后取消断点
下断:BP VirtualFree 断下后取消断点,Alt+F9返回
0040B001 FF15 16B44000 call dword ptr ds:[<&KERNEL32.VirtualFree>]
0040B007 9C pushfd//返回这里
花指令晃眼。Ctrl+B 在当前位置下搜索16进制值:9D EB 找到在0040B030处
0040B02D 83C4 04 add esp,4
0040B030 9D popfd//下断,F9断下
0040B031 EB 01 jmp short eXcalibu.0040B034
0040B034 33C0 xor eax,eax
0040B036 64:8F00 pop dword ptr fs:[eax]
0040B039 83C4 0C add esp,0C
0040B03C E8 01000000 call eXcalibu.0040B042
0040B042 58 pop eax
0040B043 9D popfd
0040B044 61 popad
0040B045 E8 15000000 call eXcalibu.0040B05F
0040B057 68 203A4000 push eXcalibu.00403A20
0040B05C EB 01 jmp short eXcalibu.0040B05F
在0040B062处中断几次就走到OEP啦
0040B05F 58 pop eax
0040B060 40 inc eax
0040B061 50 push eax ; eXcalibu.00403A21
0040B062 C3 retn
//返回00403A21 飞向光明之巅!:-)
00403A21 6A 00 push 0//在这儿用LordPE纠正ImageSize后完全DUMP这个进程
00403A23 E8 8A000000 call eXcalibu.00403AB2 ; GetModuleHandleA
00403A28 A3 9C504000 mov dword ptr ds:[40509C],eax
00403A2D E8 3A010000 call eXcalibu.00403B6C ; InitCommonControls
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
下面可以看见linson或者说forgot给大家的留言:
00403A4A 68 69 20 2C 20 69 20 61 6D 20 66 6F 72 67 6F 74 hi , i am forgot
00403A5A 2C 20 64 69 64 20 79 6F 75 20 75 6E 70 61 63 6B , did you unpack
00403A6A 20 74 68 69 73 20 70 61 63 6B 65 72 3F 20 3A 44 this packer? :D
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
运行ImportREC,选择这个进程。把OEP改为00003A21,改RVA=00001408,大小=000000C8,点“Get Import”。
所有的函数都是有效的,当然是FixDump,正常运行啦!
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
Cracked By 巢水工作坊――fly [OCN][FCG][NUKE][DCM]
2004-04-29 21:35
[课程]Linux pwn 探索篇!