大家好今天给大家讲的是《四种方法手脱PCSHRINK》,给大家一种思路而已。例子是PCSHRINK加壳的98记事本
首先查壳,PC Shrinker 0.29 - 0.71 -> Virogen
OD载入,隐藏插件。。。。
方法一:单步法(忽略所有异常),比较基础的方法~大家得掌握!
0040AC3B PCS> 9C pushfd //停在这里了,继续F8单步
0040AC3C 60 pushad
0040AC3D BD FF720000 mov ebp,72FF
0040AC42 01AD 4C3A4000 add dword ptr ss:[ebp+403>
0040AC48 FFB5 483A4000 push dword ptr ss:[ebp+40>
0040AC4E 6A 40 push 40
0040AC50 FF95 803A4000 call dword ptr ss:[ebp+40> //这里也是F8,不要用F7啦
0040AC56 50 push eax
0040AC57 50 push eax
0040AC58 2D 75394000 sub eax,PCSHRINK.00403975
0040AC5D 8985 76394000 mov dword ptr ss:[ebp+403>
0040AC63 5F pop edi
0040AC64 8DB5 75394000 lea esi,dword ptr ss:[ebp>
0040AC6A B9 FC000000 mov ecx,0FC
0040AC6F F3:A5 rep movs dword ptr es:[ed>
0040AC71 5F pop edi
0040AC72 FFE7 jmp edi //跳转
。。。。。。。。。。
00142990 BD 1BF0D3FF mov ebp,FFD3F01B //来到这,继续单步~
00142995 8BF7 mov esi,edi
00142997 81C6 60010000 add esi,160
0014299D 81C7 EC030000 add edi,3EC
001429A3 57 push edi
001429A4 56 push esi
001429A5 57 push edi
。。。。。。。。。。这种方法是蛮简单的。。。。。。。。。。详细见动画。。。。。。。
方法二:ESP定律脱壳(忽略所有异常)
0040AC3B PCS> 9C pushfd //停在这里啦~单步F8,
0040AC3C 60 pushad //ESP突现,0012FFC0
0040AC3D BD FF720000 mov ebp,72FF
0040AC42 01AD 4C3A4000 add dword ptr ss:[ebp+403>
0040AC48 FFB5 483A4000 push dword ptr ss:[ebp+40>
下命令行,hr 0012FFC0,回车,F9运行
77F69ECD FF40 10 inc dword ptr ds:[eax+10] //停在这了,提示有异常,记得取消硬件断点
77F69ED0 8B45 FC mov eax,dword ptr ss:[ebp>
77F69ED3 83E0 01 and eax,1
我们Shift+F9过
00142BB0 BA CC104000 mov edx,4010CC //来到这里了,继续单步
00142BB5 FFE2 jmp edx //跳到了OEP
00142BB7 8BB5 593C4000 mov esi,dword ptr ss:[ebp>
。。。。。。。。。。。。。。。
004010CC 55 push ebp //在这里dump就可以了
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
方法三:模拟跟踪法(不忽略内存访问异常,因为在这样的配制下,一开始按下F9程序就运行的)
ALT+M,打开内存镜像
内存镜像,项目 15
地址=00407000
大小=0000B000 (45056.)
Owner=PCSHRINK 00400000
区段=pcs2
包含=SFX,imports,resources //要的就是这个区段。。。。
类型=Imag 01001002
访问=R
初始访问=RWE
命令行下tc eip<00407000,回车。
00142990 BD 1BF0D3FF mov ebp,FFD3F01B //停在这里了,单步继续。
00142995 8BF7 mov esi,edi
00142997 81C6 60010000 add esi,160
0014299D 81C7 EC030000 add edi,3EC
001429A3 57 push edi
001429A4 56 push esi
。。。。。。。。。。
篇幅问题省略一些代码,使用单步或者如果遇到往回跳的时候F4,就可以了
。。。。。。。。。。
注意这里了
00142B6C F3:AA rep stos byte ptr es:[edi>
00142B6E 5F pop edi
00142B6F ^ EB D2 jmp short 00142B43 //要往回跳
00142B71 E8 41000000 call 00142BB7 //F4在这里,F8单步,进入系统领空
00142B76 73 36 jnb short 00142BAE
00142B78 8D9D 3E3C4000 lea ebx,dword ptr ss:[ebp>
。。。。。。。。。。。。。。。。。
77F75DB0 8B1C24 mov ebx,dword ptr ss:[esp> //来到这里,提示有异常。
77F75DB3 51 push ecx
77F75DB4 53 push ebx
77F75DB5 E8 BC1A0200 call ntdll.77F97876
shift+F9过
00142B76 /73 36 jnb short 00142BAE //到这里了,跳
00142B78 |8D9D 3E3C4000 lea ebx,dword ptr ss:[ebp>
。。。。。。。。。。。。。。。。。。
00142BAE 61 popad //跳到了这里,F8单步继续
00142BAF 9D popfd
00142BB0 BA CC104000 mov edx,4010CC
00142BB5 FFE2 jmp edx //跳到了OEP
00142BB7 8BB5 593C4000 mov esi,dword ptr ss:[ebp>
其实后面就和上种方法差不多了~~。。。。。。。
方法四:内存镜像法(忽略所有异常)
ALT+M打开内存镜像,找到第一个.rsrc
内存镜像,项目 19
地址=77EBA000
大小=0008E000 (581632.)
Owner=kernel32 77E40000
区段=.rsrc
包含=resources
类型=Imag 01001002
访问=R
初始访问=RWE
F2下断,F9运行
继续,ALT+M打开内存镜像,找到code段
内存镜像,项目 20
地址=00401000
大小=00006000 (24576.)
Owner=PCSHRINK 00400000
区段=pcs1
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
F2下断,Shift+F9运行
00142C0C 8B19 mov ebx,dword ptr ds:[ecx> //来到这。继续单步
00142C0E 0BDB or ebx,ebx
00142C10 74 2D je short 00142C3F
00142C12 F7C3 00000080 test ebx,80000000
00142C18 75 04 jnz short 00142C1E
00142C1A 03DA add ebx,edx
。。。。。。。。。。。。。
篇幅问题省略一些代码,使用单步或者如果遇到往回跳的时候F4,就可以了
。。。。。。。。。。。。。
00142B6E 5F pop edi
00142B6F ^ EB D2 jmp short 00142B43 //要回跳了
00142B71 E8 41000000 call 00142BB7 //F4
00142B76 73 36 jnb short 00142BAE
00142B78 8D9D 3E3C4000 lea ebx,dword ptr ss:[ebp>
00142B7E 53 push ebx
00142B7F FF95 783A4000 call dword ptr ss:[ebp+40>
00142B85 0BC0 or eax,eax
00142B87 74 1D je short 00142BA6
00142B89 8D9D 493C4000 lea ebx,dword ptr ss:[ebp>
00142B8F 53 push ebx
00142B90 50 push eax
00142B91 FF95 7C3A4000 call dword ptr ss:[ebp+40>
00142B97 8D9D 283C4000 lea ebx,dword ptr ss:[ebp>
00142B9D 6A 30 push 30
00142B9F 6A 00 push 0
00142BA1 53 push ebx
00142BA2 6A 00 push 0
00142BA4 FFD0 call eax
00142BA6 6A 00 push 0
00142BA8 FF95 843A4000 call dword ptr ss:[ebp+40>
00142BAE 61 popad
00142BAF 9D popfd
00142BB0 BA CC104000 mov edx,4010CC
00142BB5 FFE2 jmp edx //跳到OEP了~
--------------------------------------------------------------------------------------
由于本人使用的是XP SP1系统,所以在一些代码问题上显示的不一样,但是,方法是通用的。。大家可以试下
最后大家可以尝试下最后一次异常法~看能够不能够脱。。。。算是课后作业啦~~应该是没问题了~由于我
的时间有限~大家自己研究下
886
在这里下载,因为本人没地方放动画,所以只有放这里了。
http://www.chinadev.net/bbs/viewthread.php?tid=325&fpage=1
解压之后55M
-------------------------------------------------------------------------------------------
By wynney
Email:mcoffe@sina.com
我的小站
http://bbs.chinadev.net
欢迎大家来玩。。。天空发布区有每日动画更新
[课程]Linux pwn 探索篇!