【文章标题】: 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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!