wuhanqi 发表于 2009-7-8 02:44

eXPressor.PacK V1.5.0.X.简单手脱笔记

【文章标题】: 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:,0
0040DED8    56            PUSH ESI
0040DED9    74 2E         JE SHORT 0040DF09
0040DEDB    A1 24D04000   MOV EAX,DWORD PTR DS:
0040DEE0    8B48 1C         MOV ECX,DWORD PTR DS:

打开内存镜像.在00401000处下内存写入断点.shift+f9.来到这里:
0040D374    8A08            MOV CL,BYTE PTR DS:
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:,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:,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:
0040D3BC    68 00100000   PUSH 1000
0040D3C1    D3E0            SHL EAX,CL
0040D3C3    8DBC00 6C0E0000 LEA EDI,DWORD PTR DS:
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:,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:
0040D3E2    51            PUSH ECX
0040D3E3    8B4D 0C         MOV ECX,DWORD PTR SS:
0040D3E6    6A FF         PUSH -1
0040D3E8    83C1 FB         ADD ECX,-5
0040D3EB    FF75 10         PUSH DWORD PTR SS:
0040D3EE    51            PUSH ECX
0040D3EF    8B4D 08         MOV ECX,DWORD PTR SS:
0040D3F2    83C1 05         ADD ECX,5
0040D3F5    51            PUSH ECX
0040D3F6    FF75 FC         PUSH DWORD PTR SS:
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:
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:
0040D415    FF15 D4D04000   CALL DWORD PTR DS:[<&KERNEL32.VirtualFre>; kernel32.VirtualFree
0040D41B    8D45 F0         LEA EAX,DWORD PTR SS:
0040D41E    895D EC         MOV DWORD PTR SS:,EBX
0040D421    50            PUSH EAX
0040D422    8D45 EC         LEA EAX,DWORD PTR SS:
0040D425    50            PUSH EAX
0040D426    53            PUSH EBX
0040D427    56            PUSH ESI
0040D428    C745 F0 FBFFFFF>MOV DWORD PTR SS:,-5
0040D42F    FF75 10         PUSH DWORD PTR SS:
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:
0040E5D5    FF45 14         INC DWORD PTR SS:
0040E5D8    881C01          MOV BYTE PTR DS:,BL       <---停在这里.壳子开始解码了.
0040E5DB    E9 63010000   JMP 0040E743
0040E5E0    8D845E B0010000 LEA EAX,DWORD PTR DS:
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:
0040E5F6    EB 2B         JMP SHORT 0040E623
0040E5F8    8D45 CC         LEA EAX,DWORD PTR SS:

我们取消内存断点.在段尾0040E75D 下断.shift+f9.然后取消断点F8步出.
0040D402    83C4 28         ADD ESP,28
0040D405    8B75 F8         MOV ESI,DWORD PTR SS:
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:
0040D415    FF15 D4D04000   CALL DWORD PTR DS:[<&KERNEL32.VirtualFre>; kernel32.VirtualFree
0040D41B    8D45 F0         LEA EAX,DWORD PTR SS:
0040D41E    895D EC         MOV DWORD PTR SS:,EBX
0040D421    50            PUSH EAX
0040D422    8D45 EC         LEA EAX,DWORD PTR SS:

又看到上面那个熟悉的函数了吧?
再次段尾下断步出!
0040D91B    E8 48FAFFFF   CALL 0040D368
0040D920    83C4 0C         ADD ESP,0C
0040D923^ E9 18FFFFFF   JMP 0040D840       <--- 一个大循环.在解码咯~
0040D928    A1 24D04000   MOV EAX,DWORD PTR DS:
0040D92D    8B0D 28D04000   MOV ECX,DWORD PTR DS:            ; Test.00400000
0040D933    0348 5C         ADD ECX,DWORD PTR DS:
0040D936    898D B8FDFFFF   MOV DWORD PTR SS:,ECX
0040D93C    83A5 E0FDFFFF 0>AND DWORD PTR SS:,0
在0040D928 处下断.shift+f9.
此时可以向下看一看代码.有VirtualProtect.GetModuleHandleA.LoadLibraryExA.这三个函数.
0040D972    6A 14         PUSH 14
0040D974    FFB5 B8FDFFFF   PUSH DWORD PTR SS:
0040D97A    FF15 ECD04000   CALL DWORD PTR DS:[<&KERNEL32.VirtualPro>; kernel32.VirtualProtect
0040D980    8B85 B8FDFFFF   MOV EAX,DWORD PTR SS:
0040D986    8B0D 28D04000   MOV ECX,DWORD PTR DS:            ; Test.00400000
0040D98C    0348 0C         ADD ECX,DWORD PTR DS:
0040D98F    898D F4FEFFFF   MOV DWORD PTR SS:,ECX
0040D995    FFB5 F4FEFFFF   PUSH DWORD PTR SS:
0040D99B    FF15 E8D04000   CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; kernel32.GetModuleHandleA
0040D9A1    8985 C0FDFFFF   MOV DWORD PTR SS:,EAX
0040D9A7    83BD C0FDFFFF 0>CMP DWORD PTR SS:,0
0040D9AE    75 29         JNZ SHORT 0040D9D9
0040D9B0    6A 08         PUSH 8
0040D9B2    6A 00         PUSH 0
0040D9B4    FFB5 F4FEFFFF   PUSH DWORD PTR SS:
0040D9BA    FF15 E4D04000   CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; kernel32.LoadLibraryExA
0040D9C0    8985 C0FDFFFF   MOV DWORD PTR SS:,EAX

解码好后开始载入DLL了哦~离OEP越来越近了.
我们在00401000处下内存访问断点.shift+f9
一次..
0040D92D    8B0D 28D04000   MOV ECX,DWORD PTR DS:            ; Test.00400000
0040D933    0348 5C         ADD ECX,DWORD PTR DS:
0040D936    898D B8FDFFFF   MOV DWORD PTR SS:,ECX
0040D93C    83A5 E0FDFFFF 0>AND DWORD PTR SS:,0

两次..
0040D949    8378 0C 00      CMP DWORD PTR DS:,0
0040D94D    0F84 17030000   JE 0040DC6A
0040D953    A1 24D04000   MOV EAX,DWORD PTR DS:
0040D958    8378 5C 00      CMP DWORD PTR DS:,0
0040D95C    0F84 08030000   JE 0040DC6A
0040D962    83A5 ACFDFFFF 0>AND DWORD PTR SS:,0

三次:
0040DF78    8B48 08         MOV ECX,DWORD PTR DS:             ; Test.00404084

四次:
0040DF7B    8911            MOV DWORD PTR DS:,EDX

五次:
0040DF7D    8B30            MOV ESI,DWORD PTR DS:               ; Test.00407000

六次..
0040DF7F    8B50 04         MOV EDX,DWORD PTR DS:             ; Test.00407008

七次.八次:
0040DF8B    F3:A5         REP MOVS DWORD PTR ES:,DWORD PTR DS>

九次:
0040DF97    8B48 10         MOV ECX,DWORD PTR DS:

十次:
0040DEEC    8B71 0C         MOV ESI,DWORD PTR DS:             ; Test.00408010

十一次:
0040DEF3    8B06            MOV EAX,DWORD PTR DS:

十二次:
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

lbmx8 发表于 2009-7-9 00:41

好的教程,学习一下。
页: [1]
查看完整版本: eXPressor.PacK V1.5.0.X.简单手脱笔记