【文章标题】: Yoda's Crypter v1.3 脱壳笔记
【文章作者】: 王猛
【作者邮箱】: 12985462@QQ.com
【作者主页】: www.81mil.cn
【作者QQ号】: 12985462
【软件名称】: QQ空间人精灵
【软件大小】: 283 KB
【下载地址】: 自己搜索下载
【加壳方式】: Yoda's Crypter v1.3!
【保护方式】: 网络认证
【编写语言】: VB6
【使用工具】: ProtectionID v5.2C, OllyDBG v1.10
【操作平台】: Windows XP SP2
【软件介绍】: 刷QQ空间人气的小工具!
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  一、查壳
  
  将文件拖到 ProtectionID v5.2C 识别该程序使用 Yoda's Crypter v1.3 加密!
  
  二、脱壳步骤
  
  程序载入后停在:
  
  004D9060 >  55              PUSH EBP
  004D9061    8BEC            MOV EBP,ESP
  004D9063    53              PUSH EBX
  004D9064    56              PUSH ESI
  004D9065    57              PUSH EDI
  004D9066    60              PUSHAD 
  
  在[命令]工具条,输入 bp IsDebuggerPresent 命令并按[回车键]下断点。如果您看不到该工具条,可以使用快捷键ALT+F1打开。
  
  按F9,程序运行到断点IsDebuggerPresent处后自动停止,我们会看到下面的代码:
  
  7C813093 >  64:A1 18000000  MOV EAX,DWORD PTR FS:[18]
  7C813099    8B40 30         MOV EAX,DWORD PTR DS:[EAX+30]
  7C81309C    0FB640 02       MOVZX EAX,BYTE PTR DS:[EAX+2]
  7C8130A0    C3              RETN
  
  按F8跟进到7C8130A0处的RETN指令程序后,程序将返回并出现下列代码,我们开始寻找POPAD指令。
  
  004D988A    0BC0            OR EAX,EAX
  004D988C    74 02           JE SHORT QQ空间人.004D9890
  004D988E    61              POPAD                                    ; 第一次
  004D988F    C3              RETN
  …… …… ……
  004D98F7    CD 07           INT 7
  004D98F9    61              POPAD                                    ; 第二次
  004D98FA    EB 02           JMP SHORT QQ空间人.004D98FE
  004D98FC    CD 01           INT 1
  004D98FE    C3              RETN
  …… …… ……
  004D9975    61              POPAD                                    ; 第三次
  004D9976    50              PUSH EAX
  004D9977    33C0            XOR EAX,EAX
  004D9979    64:FF30         PUSH DWORD PTR FS:[EAX]
  004D997C    64:8920         MOV DWORD PTR FS:[EAX],ESP
  004D997F   /EB 01           JMP SHORT QQ空间人.004D9982
  004D9981   |CC              INT3
  004D9982   \0000            ADD BYTE PTR DS:[EAX],AL
  
  第三次出现的POPAD指令正是我们需要的!鼠标选中 004D9975 按F2下断点后按F9
  运行到这里,之后按F8步进。我们步进到 004D9982 会跳转到系统领空,会出现下面的代码:
  
  7C92EAF0    8B1C24          MOV EBX,DWORD PTR SS:[ESP]
  7C92EAF3    51              PUSH ECX
  7C92EAF4    53              PUSH EBX
  7C92EAF5    E8 C78C0200     CALL ntdll.7C9577C1
  7C92EAFA    0AC0            OR AL,AL
  7C92EAFC    74 0C           JE SHORT ntdll.7C92EB0A
  7C92EAFE    5B              POP EBX
  7C92EAFF    59              POP ECX
  7C92EB00    6A 00           PUSH 0
  7C92EB02    51              PUSH ECX
  7C92EB03    E8 11EBFFFF     CALL ntdll.ZwContinue
  
  用F8键步进到 7C92EB03 ,观察寄存器窗口,注意EDI中出现的值,我们要在寻找内存中此值出现的地址。
  
  寄存器窗口信息如下:
  EAX 00000001
  ECX 0012FCE0
  EDX 7C9237D8 ntdll.7C9237D8
  EBX 0012FCC4
  ESP 0012FCBC
  EBP 0012FFC0
  ESI FFFFFFFF
  EDI 7C930738 ntdll.7C930738
  EIP 7C92EB03 ntdll.7C92EB03
  
  内存中信息如下:
  
  0012FD7C   7C930738  ntdll.7C930738
  0012FD80   FFFFFFFF
  0012FD84   2E009B00刷
  0012FD88   7C92EB94  ntdll.KiFastSystemCallRet
  0012FD8C   0012FFB0
  0012FD90   00000000
  0012FD94   0012FFC0
  0012FD98   004D8017  QQ空间人.004D8017
  
  0023FD7C地址出现了刚才我们要找到EDI中出现的数值 7C930738 。向下几行出现的QQ空间人.004D8017便是我们要找的第一层入口点。下面,处理第二层壳,这层壳同UPX有些相似,作PE检测时老版本软件真就识别为UPX〈修改版〉。
  
  我们在命令行下断点,使用命令 bp 004D8017,并按F9。我们将看到如下代码:
  004D8017    90              NOP
  004D8018    90              NOP
  004D8019    B8 F45A4D00     MOV EAX,QQ空间人.004D5AF4
  004D801E    FFE0            JMP EAX
  
  在这里我们将开始脱第二层壳!一直用按F8键步进,我们一路走到 004D5960  时,就要瞪大眼睛了!这里便是第二层壳的SFX入口!这一步的工作可以完全按照UPX脱壳准则一路向下,利用F4+F8跳过循环和回跳。
  
  004D5960    60              PUSHAD
  004D5961    BE 00204900     MOV ESI,QQ空间人.00492000
  004D5966    8DBE 00F0F6FF   LEA EDI,DWORD PTR DS:[ESI+FFF6F000]
  004D596C    57              PUSH EDI
  004D596D    83CD FF         OR EBP,FFFFFFFF
  004D5970    EB 10           JMP SHORT QQ空间人.004D5982
  
  遵照刚才说过的"F4+F8跳过循环和回跳"原则,谨慎操作!和UPX一样一不留神,程序一启动你可就要重新来过了!
  
  当我们走到 004d5A5F - 004d5A84时,我们遇到了第一个也是唯一一个循环,在这里要小心格外小心!!到了这里距离OEP只有一步之遥了!
  
  004D5A5F    3C 01           CMP AL,1
  004D5A61  ^ 77 F7           JA SHORT QQ空间人.004D5A5A
  004D5A63    803F 04         CMP BYTE PTR DS:[EDI],4
  004D5A66  ^ 75 F2           JNZ SHORT QQ空间人.004D5A5A
  004D5A68    8B07            MOV EAX,DWORD PTR DS:[EDI]
  004D5A6A    8A5F 04         MOV BL,BYTE PTR DS:[EDI+4]
  004D5A6D    66:C1E8 08      SHR AX,8
  004D5A71    C1C0 10         ROL EAX,10
  004D5A74    86C4            XCHG AH,AL
  004D5A76    29F8            SUB EAX,EDI
  004D5A78    80EB E8         SUB BL,0E8
  004D5A7B    01F0            ADD EAX,ESI
  004D5A7D    8907            MOV DWORD PTR DS:[EDI],EAX
  004D5A7F    83C7 05         ADD EDI,5
  004D5A82    88D8            MOV AL,BL
  004D5A84  ^ E2 D9           LOOPD SHORT QQ空间人.004D5A5F
  004D5A86    8DBE 00300D00   LEA EDI,DWORD PTR DS:[ESI+D3000]
  004D5A8C    8B07            MOV EAX,DWORD PTR DS:[EDI] ;!!F4
  004D5A8E    09C0            OR EAX,EAX
  004D5A90    74 45           JE SHORT QQ空间人.004D5AD7
  
  点选 004D5A8C 一行按F4键跳过!向下拉代码,我们在不远处就可以看到 004D5AD7出现了POPAD下一行004D5AD8紧跟着一个jmp跳转指令!还记得怎么找寻UPX的OEP吗?嘿嘿,我们找到了!
  
  004D5ACF  ^\EB D8           JMP SHORT QQ空间人.004D5AA9
  004D5AD1    FF96 B46D0D00   CALL DWORD PTR DS:[ESI+D6DB4]
  004D5AD7    61              POPAD ;;!! F4
  004D5AD8  - E9 47B7F2FF     JMP QQ空间人.00401224 ; <== OEP!!
  
  点选004D5AD7一行,按F4跳过来!再按一下F8跳到00401224,这里就是OEP!
  
  
--------------------------------------------------------------------------------
【经验总结】
  本想参照 yC v1.2 来脱 yC v1.3结果无功而返,最后才搞明白我碰到的是一个双层壳!
  
--------------------------------------------------------------------------------
【版权声明】: 本文由王猛(www.81mil.cn)原创撰写,转载请注明作者并保持文章的完整,谢谢!

                                                       2007年02月24日 18:34:30