水煮新概念英语第一册脱壳学习
 

脱壳作者: HBQJXHW
使用工具: OllyDBG ,LordPE,ImportREC v1.6F,PEiD v0.94,FI 4.01a
脱壳平台: WinXP SP2
软件名称: 水煮新概念英语第一册
加壳方式: Armadillo v3.00
脱壳声明: 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
脱壳内容:

        一、准备工作
        老规矩设置Ollydbg忽略所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志。
        1 侦壳:用PEiD查壳 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay],
        我们再用FI 4.01a 查一下 显示为 Armadillo 3.00 {glue} 
        2 判断进程:
        启动程序。然后在 Windows 任务管理器或LordPE里查看是单进程的Armadillo还是双进程的。
        这个程序是单进程的,这里可以省略分离进程的过程。
      
        二 、脱壳
        OD载入
        0055D049 >/$  55            PUSH EBP                                 ;  停在这里
        0055D04A  |.  8BEC          MOV EBP,ESP
        0055D04C  |.  6A FF         PUSH -1
        0055D04E  |.  68 48225800   PUSH sznce1.00582248
        0055D053  |.  68 90CA5500   PUSH sznce1.0055CA90                     ;  SE 处理程序安装
        0055D058  |.  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
        1 避开IAT加密
        下断点HE GetModuleHandleA
        按F9运行中断后,看堆栈:
        00012FF38   0055D111  /CALL 到 GetModuleHandleA 来自 sznce1.0055D10B
        0012FF3C   00000000  \pModule = NULL
        0012ED4C   77F45BB0  /CALL 到 GetModuleHandleA 来自 77F45BAA
        0012ED50   77F44FF4  \pModule = "KERNEL32.DLL"
        0012E540   5D175394  /CALL 到 GetModuleHandleA 来自 5D17538E
        0012E544   5D1753E0  \pModule = "kernel32.dll"
        0012F560   00553073  /CALL 到 GetModuleHandleA 来自 sznce1.0055306D
        0012F564   00000000  \pModule = NULL
        0012D28C   00D1519B  /CALL 到 GetModuleHandleA 来自 00D15195
        0012D290   0012D3C8  \pModule = "kernel32.dll"                  ;  注意!在这里清除硬件断点后Alt+F9返回程序
      
        这里如果说的不对就请大侠们指教了。
        00D1519B    8B0D 80D7D300   MOV ECX,DWORD PTR DS:[D3D780]              ; 返回到这里
        00D151A1    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
        00D151A4    A1 80D7D300     MOV EAX,DWORD PTR DS:[D3D780]
        00D151A9    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
        00D151AC    75 16           JNZ SHORT 00D151C4
        00D151AE    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:[EBP-14C]
        00D151B4    50              PUSH EAX
        00D151B5    FF15 B850D300   CALL DWORD PTR DS:[D350B8]               ; kernel32.LoadLibraryA
        00D151BB    8B0D 80D7D300   MOV ECX,DWORD PTR DS:[D3D780]
        00D151C1    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
        00D151C4    A1 80D7D300     MOV EAX,DWORD PTR DS:[D3D780]
        00D151C9    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
        00D151CC    0F84 AD000000   JE 00D1527F                              ; 改成为 JMP 00D1527F 修改这是为了避开IAT加密
        00D151D2    33C9            XOR ECX,ECX
        00D151D4    8B03            MOV EAX,DWORD PTR DS:[EBX]
        00D151D6    3938            CMP DWORD PTR DS:[EAX],EDI
        00D151D8    74 06           JE SHORT 00D151E0
        00D151DA    41              INC ECX
        00D151DB    83C0 0C         ADD EAX,0C
        00D151DE  ^ EB F6           JMP SHORT 00D151D6
        2 寻找入口点
      
        I、继续下断点 bp GetCurrentThreadId
        按F9运行中断后,看堆栈:
        0012CB4C   73391E36  /CALL 到 GetCurrentThreadId 来自 73391E30
        0012CB2C   7339353F  /CALL 到 GetCurrentThreadId 来自 73393539
        0012CD90   76DB3705  /CALL 到 GetCurrentThreadId 来自 76DB36FF
        0012CDA0   76685F1A  /CALL 到 GetCurrentThreadId 来自 wininet.76685F14
        0012F5AC   00D2CF47  /CALL 到 GetCurrentThreadId 来自 00D2CF41          ; 注意!在这里清除断点后Alt+F9返回程序
        我判断返回的经验是00D2CF41跟上面跨段很大。前面都是7开头的,而这个是00D 开始的。
        这里如果说的不对就请大侠们指教了。
        00D2CF47    A3 8C16D400     MOV DWORD PTR DS:[D4168C],EAX           ; 返回到这里。F8单步向下走
        00D2CF4C    E8 5F85FEFF     CALL 00D154B0
        00D2CF51    6A 00           PUSH 0
        00D2CF53    E8 51E0FEFF     CALL 00D1AFA9
        00D2CF58    59              POP ECX
        00D2CF59    E8 074CFFFF     CALL 00D21B65
        00D2CF5E    8BF8            MOV EDI,EAX
        00D2CF60    A1 8016D400     MOV EAX,DWORD PTR DS:[D41680]
        00D2CF65    8B48 60         MOV ECX,DWORD PTR DS:[EAX+60]
        00D2CF68    3348 28         XOR ECX,DWORD PTR DS:[EAX+28]
        00D2CF6B    3348 04         XOR ECX,DWORD PTR DS:[EAX+4]
        00D2CF6E    03F9            ADD EDI,ECX
        00D2CF70    8B0E            MOV ECX,DWORD PTR DS:[ESI]
        00D2CF72    85C9            TEST ECX,ECX
        00D2CF74    75 2F           JNZ SHORT 00D2CFA5
        00D2CF76    8B78 60         MOV EDI,DWORD PTR DS:[EAX+60]
        00D2CF79    E8 E74BFFFF     CALL 00D21B65
        00D2CF7E    8B0D 8016D400   MOV ECX,DWORD PTR DS:[D41680]            ; sznce1.0057F238
        00D2CF84    FF76 14         PUSH DWORD PTR DS:[ESI+14]
        00D2CF87    8B51 28         MOV EDX,DWORD PTR DS:[ECX+28]
        00D2CF8A    FF76 10         PUSH DWORD PTR DS:[ESI+10]
        00D2CF8D    3351 04         XOR EDX,DWORD PTR DS:[ECX+4]
        00D2CF90    FF76 0C         PUSH DWORD PTR DS:[ESI+C]
        00D2CF93    33D7            XOR EDX,EDI
        00D2CF95    03C2            ADD EAX,EDX
        00D2CF97    8B51 58         MOV EDX,DWORD PTR DS:[ECX+58]
        00D2CF9A    3351 34         XOR EDX,DWORD PTR DS:[ECX+34]
        00D2CF9D    33D7            XOR EDX,EDI
        00D2CF9F    2BC2            SUB EAX,EDX
        00D2CFA1    FFD0            CALL EAX
        00D2CFA3    EB 25           JMP SHORT 00D2CFCA
        00D2CFA5    83F9 01         CMP ECX,1
        00D2CFA8    75 22           JNZ SHORT 00D2CFCC
        00D2CFAA    FF76 04         PUSH DWORD PTR DS:[ESI+4]
        00D2CFAD    FF76 08         PUSH DWORD PTR DS:[ESI+8]
        00D2CFB0    6A 00           PUSH 0
        00D2CFB2    E8 AE4BFFFF     CALL 00D21B65
        00D2CFB7    50              PUSH EAX
        00D2CFB8    A1 8016D400     MOV EAX,DWORD PTR DS:[D41680]
        00D2CFBD    8B48 60         MOV ECX,DWORD PTR DS:[EAX+60]
        00D2CFC0    3348 58         XOR ECX,DWORD PTR DS:[EAX+58]
        00D2CFC3    3348 34         XOR ECX,DWORD PTR DS:[EAX+34]
        00D2CFC6    2BF9            SUB EDI,ECX
        00D2CFC8    FFD7            CALL EDI                                   ; 真正的OEP,F7进去
        00D2CFCA    8BD8            MOV EBX,EAX
        00D2CFCC    5F              POP EDI
        00D2CFCD    8BC3            MOV EAX,EBX
        00D2CFCF    5E              POP ESI
        00D2CFD0    5B              POP EBX
        00D2CFD1    C3              RETN
        0052DD3C    55              PUSH EBP                                 ; 进来后这就是入口了。
        0052DD3D    8BEC            MOV EBP,ESP
        0052DD3F    83C4 F0         ADD ESP,-10
        0052DD42    53              PUSH EBX
        0052DD43    B8 84D85200     MOV EAX,sznce1.0052D884
        0052DD48    E8 EF91EDFF     CALL sznce1.00406F3C
        0052DD4D    8B1D C40F5300   MOV EBX,DWORD PTR DS:[530FC4]            ; sznce1.00532C14
        0052DD53    8B03            MOV EAX,DWORD PTR DS:[EBX]
        0052DD55    E8 FEA3F5FF     CALL sznce1.00488158
      
        II、也可使用内存访问断点法,可以直接到OEP。
        内存映射, 条目 23
        地址=00401000
        大小=0012D000 (1232896.)
        属主=sznce1   00400000
        区段=CODE
        类型=Imag 01001002
        访问=R
        初始访问=RWE
         
        三、修复IAT
        现在可以用 LordPE DUMP了。
        完整转存后用 ImportREC v1.6F 修复IAT
        OEP处填0012DD3C  自动搜索IAT 获取输入表 显示无效函数,        把无效指针全部CUT掉。修复抓取文件。
        OK!用PEiD查一下为: Borland Delphi 6.0 - 7.0,运行脱壳的文件可以运行。

上一篇   下一篇