LiNSoN 的新版 仙剑 脱壳
直接下载: http://bbs2.pediy.com/download.php?id=1805 或 点击此处本地下载
软件大小: 47.2 KB
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、flyODBG、PEiD、LordPE、ImportREC
—————————————————————————————————
【脱壳过程】:
老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。
一、去掉 lock cmpxchg
这个版本 LiNSoN 引进了EXECryptor的lock cmpxchg异常,使Ollydbg不断弹出烦人的提示
00412060 EB 20 jmp short Main.00412082//进入OD后停在这
00412082 9C pushfd
00412083 55 push ebp
00412084 57 push edi
00412085 56 push esi
00412086 52 push edx
00412087 51 push ecx
00412088 53 push ebx
00412089 9C pushfd
0041208A E8 00000000 call Main.0041208F//伪装幻影入口
Ctrl+B搜索2进制字符:F00FC7C8 在00412167处,下断,F9运行断在00412167处
00412167 F0:0FC7C8 lock cmpxchg8b eax; 非法使用寄存器//把这里NOP掉!★
0041216B AA stos byte ptr es:[edi]
0041216C EB 02 jmp short Main.00412170
F9断在00412167,仔细看了一下这段代码,发觉LiNSoN用这个异常除了让OD不断提示外好像还没有其他附加功能,索性NOP掉,彻底让其清净下来 8) 下个版本LiNSoN或许会在这里加点其他东西了。
00412170 E2 C4 loopd short Main.00412136
00412172 64:8F00 pop dword ptr fs:[eax]
00412175 58 pop eax
00412176 8B85 811E4000 mov eax,dword ptr ss:[ebp+401E81]
0041217C 3D 570B0000 cmp eax,0B57//这里有个校验
00412181 74 02 je short Main.00412185//改为JMP ★
00412183 61 popad
00412184 C3 retn
—————————————————————————————————
二、Magic Jump ,避开IAT加密
LiNSoN 这次的IAT加密直接用ImportREC就无法搞定了,要找到其Magic Jump
00412185 8B4424 20 mov eax,dword ptr ss:[esp+20]
00412189 40 inc eax
0041218A 78 0A js short Main.00412196
0041218C C785 4A2840000100000 mov dword ptr ss:[ebp+40284A],1
00412196 8D85 1D1E4000 lea eax,dword ptr ss:[ebp+401E1D]
0041219C B9 AA070000 mov ecx,7AA
004121A1 E8 3A020000 call Main.004123E0
走到这里,下面的代码早已经解开了,所以可以简化一下步骤直接找其特征代码
Ctrl+F 搜索命令:mov dword ptr ds:[edx],eax 找到00412664 ,下断,F9断下
00412664 8902 mov dword ptr ds:[edx],eax//还原输入表
00412666 EB 1D jmp short Main.00412685
00412685 F785 3E2840002000000 test dword ptr ss:[ebp+40283E],20
0041268F 0F84 83000000 je Main.00412718//改为jmp :-) Magic Jump 跳过输入表加密 ★
00412695 EB 02 jmp short Main.00412699
00412718 83C1 04 add ecx,4
0041271B 83C2 04 add edx,4
0041271E 8339 00 cmp dword ptr ds:[ecx],0
00412721 0F85 EEFEFFFF jnz Main.00412615
00412727 83C6 0C add esi,0C
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//下硬件断点
0041273C 61 popad
0041273D C3 retn
注意:输入表处理结束后还有个校验,所以在0041273A处下断,来处理自校验
Ctrl+F 在当前位置下查找命令:xor eax,ebx 在004127E3处,下断,F9断下
当然,你也可以单步走过去,呵呵。
004127DD 8B9D 46284000 mov ebx,dword ptr ss:[ebp+402846]
004127E3 33C3 xor eax,ebx//校验 ★ 改为xor eax,eax
004127E5 74 08 je short Main.004127EF//不跳就OVER啦
004127E7 EB 01 jmp short Main.004127EA
004127EF 8DBD C7254000 lea edi,dword ptr ss:[ebp+4025C7]
004127F5 8BF7 mov esi,edi
004127F7 B9 DC010000 mov ecx,1DC
004127FC 33DB xor ebx,ebx
004127FE AC lods byte ptr ds:[esi]
004127FF 34 58 xor al,58
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
走过上面的loopd后,下面的代码也解开了,还有一处需要修改,防止LiNSoN动手脚 :-)
Ctrl+F 查找命令:cmp ax,25FF 在004128F0处,下断,F9断下
004128F0 66:3D FF25 cmp ax,25FF
004128F4 75 08 jnz short Main.004128FE//改为JMP
004128F6 8D85 AF274000 lea eax,dword ptr ss:[ebp+4027AF]
004128FC FFD0 call eax
004128FE 61 popad
004128FF 8D85 872A4000 lea eax,dword ptr ss:[ebp+402A87]
00412905 50 push eax
00412906 FFB5 D7294000 push dword ptr ss:[ebp+4029D7]
0041290C FF95 C6294000 call dword ptr ss:[ebp+4029C6]
—————————————————————————————————
三、寻找OEP、Dump完成脱壳
程序已经没有自校验了,现在我们来利用 异常 走到OEP。直接F9运行,程序在内存异常处中断
00412952 CD 68 int 68//异常
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
00412952处异常堆栈:
0012FF9C 0012FFE0 指针到下一个 SEH 记录
0012FFA0 00412A48 SE 句柄//此处下断
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
00412A48 55 push ebp//Shift+F9断在这里
00412A49 8BEC mov ebp,esp
00412A4B 57 push edi
00412A4C 8B45 10 mov eax,dword ptr ss:[ebp+10]
00412A4F 8BB8 9C000000 mov edi,dword ptr ds:[eax+9C]
00412A55 FFB7 BE294000 push dword ptr ds:[edi+4029BE]
00412A5B 8F80 B8000000 pop dword ptr ds:[eax+B8] ;00412954//呵呵 :-)
去00412954处下断,F9断下。呵呵,其实也可以直接查找命令:jmp dword ptr ss:[esp-30]
00412954 33DB xor ebx,ebx
00412956 64:8F03 pop dword ptr fs:[ebx]
00412959 83C4 04 add esp,4
0041295C 66:81FF 9712 cmp di,1297
00412961 74 0E je short 00412971
00412963 66:81FF 7712 cmp di,1277
00412968 74 07 je short 00412971
0041296A 66:81FF 3013 cmp di,1330
0041296F 75 08 jnz short 00412979
00412979 32C0 xor al,al
0041297B 8DBD 1D1E4000 lea edi,dword ptr ss:[ebp+401E1D]
00412981 B9 19090000 mov ecx,919
00412986 AA stos byte ptr es:[edi]//清扫战场
00412987 E2 FD loopd short 00412986
00412989 8DBD A3274000 lea edi,dword ptr ss:[ebp+4027A3]
0041298F B9 F6020000 mov ecx,2F6
00412994 AA stos byte ptr es:[edi]
00412995 E2 FD loopd short 00412994
00412997 8B4424 1C mov eax,dword ptr ss:[esp+1C]
0041299B 894424 F0 mov dword ptr ss:[esp-10],eax
0041299F C14424 F0 07 rol dword ptr ss:[esp-10],7
004129A4 61 popad//[esp-10]=00402E45
004129A5 EB 03 jmp short 004129AA
004129AA FF6424 D0 jmp dword ptr ss:[esp-30] ; Main.00402E45//飞向光明之巅!:-)
————————————————————————
00402E45 6A 00 push 0//用LordPE纠正ImageSize后完全DUMP这个进程
00402E47 E8 36000000 call Main.00402E82 ; GetModuleHandleA
00402E4C A3 00104000 mov dword ptr ds:[40>
00402E51 6A 00 push 0 ; /lParam = NULL
00402E53 68 C82B4000 push Main.00402BC8 ; |DlgProc = Main.00402BC8
00402E58 6A 00 push 0 ; |hOwner = NULL
00402E5A 6A 64 push 64 ; |pTemplate = 64
00402E5C 50 push eax ; |hInst = 8A00805C
00402E5D E8 56000000 call Main.00402EB8 ; DialogBoxParamA
00402E62 6A 00 push 0 ; /ExitCode = 0
00402E64 E8 0D000000 call Main.00402E76 ; ExitProcess
运行ImportREC,选择这个进程。把OEP改为00002E45,点IT AutoSearch,点“Get Import”,FixDump,正常运行!
—————————————————————————————————
, _/
/| _.-~/ _ , 青春都一晌
( /~ / ~-._ |
`\ _/ ~ ) 忍把浮名
_-~~~-.) )__/;;,. _ //'
/'_, --~ ~~~- ,;;___( (.-~~~-. 换了破解轻狂
`~ _( ,_..-- ( ,;'' / ~-- /._`
/~~//' /' `~ ) /--.._, )_ `~
" `~" " `" /~'` `\~~
" " "~' ""
Cracked By 巢水工作坊——fly [OCN][FCG][NUKE][DCM]
2004-03-06 21:00
- 标 题:LiNSoN 的新版 仙剑 脱壳
- 作 者:fly
- 时 间:2004年3月07日 12:57
- 链 接:http://bbs.pediy.com