• 标 题:LiNSoN 的新版 仙剑 脱壳
  • 作 者:fly
  • 时 间:2004年3月07日 12:57
  • 链 接:http://bbs.pediy.com

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