【文章标题】: eXPressor.PacK V1.5.0.X.简单手脱笔记
【文章作者】: wuhanqi
【作者邮箱】: wuhanqi@qq.com
【作者声明】: 小菜一个.高手别笑话我哦~嘿嘿.
--------------------------------------------------------------------------------
【详细过程】
  半夜闲来没事.写篇脱文玩玩.
  PEiD查壳:eXPressor.PacK V1.5.0.X -> CGSoftLabs   * Sign.By.fly *
  这个软件新版更新到1.7.0.X了.还没来得及玩.版本差这么多了.想必功能一定增强不少.
  1.5.0.X的还是好解决的.现在开始吧~
  目标是个unpackme.
  OD载入程序.
  0040DECE    55              PUSH EBP               <--停在这里
  0040DECF    8BEC            MOV EBP,ESP
  0040DED1    833D 10D04000 0>CMP DWORD PTR DS:[40D010],0
  0040DED8    56              PUSH ESI
  0040DED9    74 2E           JE SHORT 0040DF09
  0040DEDB    A1 24D04000     MOV EAX,DWORD PTR DS:[40D024]
  0040DEE0    8B48 1C         MOV ECX,DWORD PTR DS:[EAX+1C]
  
  打开内存镜像.在00401000处下内存写入断点.shift+f9.来到这里:
  0040D374    8A08            MOV CL,BYTE PTR DS:[EAX]
  0040D376    80F9 E1         CMP CL,0E1
  0040D379    73 5F           JNB SHORT 0040D3DA
  0040D37B    33DB            XOR EBX,EBX
  0040D37D    80F9 2D         CMP CL,2D
  0040D380    895D FC         MOV DWORD PTR SS:[EBP-4],EBX
  0040D383    72 13           JB SHORT 0040D398
  0040D385    0FB6C1          MOVZX EAX,CL
  0040D388    6A 2D           PUSH 2D
  0040D38A    33D2            XOR EDX,EDX
  0040D38C    5E              POP ESI
  0040D38D    F7F6            DIV ESI
  0040D38F    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
  0040D392    80C1 D3         ADD CL,0D3
  0040D395    48              DEC EAX
  0040D396  ^ 75 FA           JNZ SHORT 0040D392
  0040D398    80F9 09         CMP CL,9
  0040D39B    72 12           JB SHORT 0040D3AF
  0040D39D    0FB6C1          MOVZX EAX,CL
  0040D3A0    6A 09           PUSH 9
  0040D3A2    33D2            XOR EDX,EDX
  0040D3A4    5E              POP ESI
  0040D3A5    F7F6            DIV ESI
  0040D3A7    8BD8            MOV EBX,EAX
  0040D3A9    80C1 F7         ADD CL,0F7
  0040D3AC    48              DEC EAX
  0040D3AD  ^ 75 FA           JNZ SHORT 0040D3A9
  0040D3AF    0FB6F1          MOVZX ESI,CL
  0040D3B2    B8 00030000     MOV EAX,300
  0040D3B7    6A 04           PUSH 4
  0040D3B9    8D0C1E          LEA ECX,DWORD PTR DS:[ESI+EBX]
  0040D3BC    68 00100000     PUSH 1000
  0040D3C1    D3E0            SHL EAX,CL
  0040D3C3    8DBC00 6C0E0000 LEA EDI,DWORD PTR DS:[EAX+EAX+E6C]
  0040D3CA    57              PUSH EDI
  0040D3CB    6A 00           PUSH 0
  0040D3CD    FF15 D8D04000   CALL DWORD PTR DS:[<&KERNEL32.VirtualAll>; kernel32.VirtualAlloc
  0040D3D3    85C0            TEST EAX,EAX
  0040D3D5    8945 F4         MOV DWORD PTR SS:[EBP-C],EAX
  0040D3D8    75 05           JNZ SHORT 0040D3DF
  0040D3DA    6A 01           PUSH 1
  0040D3DC    58              POP EAX
  0040D3DD    EB 5D           JMP SHORT 0040D43C
  0040D3DF    8D4D F8         LEA ECX,DWORD PTR SS:[EBP-8]
  0040D3E2    51              PUSH ECX
  0040D3E3    8B4D 0C         MOV ECX,DWORD PTR SS:[EBP+C]
  0040D3E6    6A FF           PUSH -1
  0040D3E8    83C1 FB         ADD ECX,-5
  0040D3EB    FF75 10         PUSH DWORD PTR SS:[EBP+10]
  0040D3EE    51              PUSH ECX
  0040D3EF    8B4D 08         MOV ECX,DWORD PTR SS:[EBP+8]
  0040D3F2    83C1 05         ADD ECX,5
  0040D3F5    51              PUSH ECX
  0040D3F6    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
  0040D3F9    53              PUSH EBX
  0040D3FA    56              PUSH ESI
  0040D3FB    57              PUSH EDI
  0040D3FC    50              PUSH EAX
  0040D3FD    E8 E70F0000     CALL 0040E3E9
  0040D402    83C4 28         ADD ESP,28
  0040D405    8B75 F8         MOV ESI,DWORD PTR SS:[EBP-8]
  0040D408    33DB            XOR EBX,EBX
  0040D40A    8BF8            MOV EDI,EAX
  0040D40C    68 00800000     PUSH 8000
  0040D411    53              PUSH EBX
  0040D412    FF75 F4         PUSH DWORD PTR SS:[EBP-C]
  0040D415    FF15 D4D04000   CALL DWORD PTR DS:[<&KERNEL32.VirtualFre>; kernel32.VirtualFree
  0040D41B    8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]
  0040D41E    895D EC         MOV DWORD PTR SS:[EBP-14],EBX
  0040D421    50              PUSH EAX
  0040D422    8D45 EC         LEA EAX,DWORD PTR SS:[EBP-14]
  0040D425    50              PUSH EAX
  0040D426    53              PUSH EBX
  0040D427    56              PUSH ESI
  0040D428    C745 F0 FBFFFFF>MOV DWORD PTR SS:[EBP-10],-5
  0040D42F    FF75 10         PUSH DWORD PTR SS:[EBP+10]
  0040D432    E8 A50B0000     CALL 0040DFDC
  0040D437    83C4 14         ADD ESP,14
  0040D43A    8BC7            MOV EAX,EDI
  0040D43C    5F              POP EDI
  0040D43D    5E              POP ESI
  0040D43E    5B              POP EBX
  0040D43F    C9              LEAVE
  0040D440    C3              RETN
  
  
  如果你仔细看过hyperchem牛的脱壳经验谈之二的话.你一定会了解上面两个函数的作用的.
  VirtualAlloc 申请一段内存.
  VirtualFree 释放申请的内存.
  说明壳子申请内存准备开始解码了.
  再次shift+f9.停在这里:
  0040E5D2    8B4D 14         MOV ECX,DWORD PTR SS:[EBP+14]
  0040E5D5    FF45 14         INC DWORD PTR SS:[EBP+14]
  0040E5D8    881C01          MOV BYTE PTR DS:[ECX+EAX],BL       <---停在这里.壳子开始解码了.
  0040E5DB    E9 63010000     JMP 0040E743
  0040E5E0    8D845E B0010000 LEA EAX,DWORD PTR DS:[ESI+EBX*2+1B0]
  0040E5E7    50              PUSH EAX
  0040E5E8    E8 CBFBFFFF     CALL 0040E1B8
  0040E5ED    59              POP ECX
  0040E5EE    85C0            TEST EAX,EAX
  0040E5F0    59              POP ECX
  0040E5F1    75 05           JNZ SHORT 0040E5F8
  0040E5F3    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]
  0040E5F6    EB 2B           JMP SHORT 0040E623
  0040E5F8    8D45 CC         LEA EAX,DWORD PTR SS:[EBP-34]
  
  我们取消内存断点.在段尾0040E75D 下断.shift+f9.然后取消断点F8步出.
  0040D402    83C4 28         ADD ESP,28
  0040D405    8B75 F8         MOV ESI,DWORD PTR SS:[EBP-8]
  0040D408    33DB            XOR EBX,EBX
  0040D40A    8BF8            MOV EDI,EAX
  0040D40C    68 00800000     PUSH 8000
  0040D411    53              PUSH EBX
  0040D412    FF75 F4         PUSH DWORD PTR SS:[EBP-C]
  0040D415    FF15 D4D04000   CALL DWORD PTR DS:[<&KERNEL32.VirtualFre>; kernel32.VirtualFree
  0040D41B    8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]
  0040D41E    895D EC         MOV DWORD PTR SS:[EBP-14],EBX
  0040D421    50              PUSH EAX
  0040D422    8D45 EC         LEA EAX,DWORD PTR SS:[EBP-14]
  
  又看到上面那个熟悉的函数了吧?
  再次段尾下断步出!
  0040D91B    E8 48FAFFFF     CALL 0040D368
  0040D920    83C4 0C         ADD ESP,0C
  0040D923  ^ E9 18FFFFFF     JMP 0040D840       <--- 一个大循环.在解码咯~
  0040D928    A1 24D04000     MOV EAX,DWORD PTR DS:[40D024]
  0040D92D    8B0D 28D04000   MOV ECX,DWORD PTR DS:[40D028]            ; Test.00400000
  0040D933    0348 5C         ADD ECX,DWORD PTR DS:[EAX+5C]
  0040D936    898D B8FDFFFF   MOV DWORD PTR SS:[EBP-248],ECX
  0040D93C    83A5 E0FDFFFF 0>AND DWORD PTR SS:[EBP-220],0
  在0040D928 处下断.shift+f9.
  此时可以向下看一看代码.有VirtualProtect.GetModuleHandleA.LoadLibraryExA.这三个函数.
  0040D972    6A 14           PUSH 14
  0040D974    FFB5 B8FDFFFF   PUSH DWORD PTR SS:[EBP-248]
  0040D97A    FF15 ECD04000   CALL DWORD PTR DS:[<&KERNEL32.VirtualPro>; kernel32.VirtualProtect
  0040D980    8B85 B8FDFFFF   MOV EAX,DWORD PTR SS:[EBP-248]
  0040D986    8B0D 28D04000   MOV ECX,DWORD PTR DS:[40D028]            ; Test.00400000
  0040D98C    0348 0C         ADD ECX,DWORD PTR DS:[EAX+C]
  0040D98F    898D F4FEFFFF   MOV DWORD PTR SS:[EBP-10C],ECX
  0040D995    FFB5 F4FEFFFF   PUSH DWORD PTR SS:[EBP-10C]
  0040D99B    FF15 E8D04000   CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; kernel32.GetModuleHandleA
  0040D9A1    8985 C0FDFFFF   MOV DWORD PTR SS:[EBP-240],EAX
  0040D9A7    83BD C0FDFFFF 0>CMP DWORD PTR SS:[EBP-240],0
  0040D9AE    75 29           JNZ SHORT 0040D9D9
  0040D9B0    6A 08           PUSH 8
  0040D9B2    6A 00           PUSH 0
  0040D9B4    FFB5 F4FEFFFF   PUSH DWORD PTR SS:[EBP-10C]
  0040D9BA    FF15 E4D04000   CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; kernel32.LoadLibraryExA
  0040D9C0    8985 C0FDFFFF   MOV DWORD PTR SS:[EBP-240],EAX
  
  解码好后开始载入DLL了哦~离OEP越来越近了.
  我们在00401000处下内存访问断点.shift+f9
  一次..
  0040D92D    8B0D 28D04000   MOV ECX,DWORD PTR DS:[40D028]            ; Test.00400000
  0040D933    0348 5C         ADD ECX,DWORD PTR DS:[EAX+5C]
  0040D936    898D B8FDFFFF   MOV DWORD PTR SS:[EBP-248],ECX
  0040D93C    83A5 E0FDFFFF 0>AND DWORD PTR SS:[EBP-220],0
  
  两次..
  0040D949    8378 0C 00      CMP DWORD PTR DS:[EAX+C],0
  0040D94D    0F84 17030000   JE 0040DC6A
  0040D953    A1 24D04000     MOV EAX,DWORD PTR DS:[40D024]
  0040D958    8378 5C 00      CMP DWORD PTR DS:[EAX+5C],0
  0040D95C    0F84 08030000   JE 0040DC6A
  0040D962    83A5 ACFDFFFF 0>AND DWORD PTR SS:[EBP-254],0
  
  三次:
  0040DF78    8B48 08         MOV ECX,DWORD PTR DS:[EAX+8]             ; Test.00404084
  
  四次:
  0040DF7B    8911            MOV DWORD PTR DS:[ECX],EDX
  
  五次:
  0040DF7D    8B30            MOV ESI,DWORD PTR DS:[EAX]               ; Test.00407000
  
  六次..
  0040DF7F    8B50 04         MOV EDX,DWORD PTR DS:[EAX+4]             ; Test.00407008
  
  七次.八次:
  0040DF8B    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
  
  九次:
  0040DF97    8B48 10         MOV ECX,DWORD PTR DS:[EAX+10]
  
  十次:
  0040DEEC    8B71 0C         MOV ESI,DWORD PTR DS:[ECX+C]             ; Test.00408010
  
  十一次:
  0040DEF3    8B06            MOV EAX,DWORD PTR DS:[ESI]
  
  十二次:
  00403414    55              PUSH EBP       <--OEP...
  00403415    8BEC            MOV EBP,ESP
  00403417    83C4 F0         ADD ESP,-10
  0040341A    B8 E4334000     MOV EAX,004033E4
  0040341F    E8 A4FEFFFF     CALL 004032C8
  00403424    6A 00           PUSH 0
  00403426    68 3C344000     PUSH 0040343C                            ; ASCII "Test"
  0040342B    68 44344000     PUSH 00403444                            ; ASCII "Unpacking tutorial"
  00403430    6A 00           PUSH 0
  00403432    E8 45FFFFFF     CALL 0040337C                            ; JMP to user32.MessageBoxA
  00403437    E8 C0F9FFFF     CALL 00402DFC
  0040343C    54              PUSH ESP
  
  然后掏出你的工具抓取修复吧...
  
  
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  这个壳子老版本了.不难.
  也不知道我分析这些函数分析的对不对..
  不对之处多多赐教.谁叫我是个壳盲呢?
  
--------------------------------------------------------------------------------
【版权声明】: 还不是踩在巨人的肩膀上说话?哪里来的版权.随便怎么样.哈哈~

                                                       2009年07月08日 2:41:55