- UID
- 2648
注册时间2005-8-5
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 开心 2022-11-22 20:08 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
aspr2.3 bulid 04.26脱壳方法初探
首先感谢8100303关于aspr2.3 bulid 04.26的教程。
在aspr2.3 bulid 04.26中增加了rtdsc,用以前版本脱壳方法不行了。
在学习教程的过程中,我这样的初学者很难找到切入点,不知道如何下手调试。现把我在开始脱壳的开始部分的笔记整
理出来,请各位高手能指点修改完善。
后面的过程我还不会,正在摸索中。
=========================================================================================================
一、用Anti-rdtsc工具法。
感谢shoooo给我们提供了一个Anti-rdtsc工具,使调试变的容易。
shoooo是这样解释这个工具:
“在0环中修改cr4寄存器中的1位,会使rtdsc指令变成特权指令,这样,当程序碰到rtdsc时就会产生异常
这时,我们可以写od插件,抓到这个异常,并给eax,edx可控制的值, 让程序继续跑。”。
运行Anti-rdtsc工具,按“SET RDTSC CPLO”。
忽略除“内存异常”和下面的“同时忽略以下指定的异常或者异常范围”,其他选项全选。
00401000 > 68 01E04000 push notpad42.0040E001 ; OD入口
00401005 E8 01000000 call notpad42.0040100B
0040100A C3 retn
0040100B C3 retn
Shirt+F9,三次异常。
009CC91A 0000 add byte ptr ds:[eax],al
009CC91C E8 33C05A59 call 59F78954
009CC921 59 pop ecx
009CC922 64:8910 mov dword ptr fs:[eax],edx
009CC925 EB 2B jmp short 009CC952
Alt+M,到内存窗口,在CODE段下F2中断。Shirt+F9,就来到这里了。
009CB2FB 8945 00 mov dword ptr ss:[ebp],eax
009CB2FE 6A 0A push 0A
009CB300 E8 B3A9FDFF call 009A5CB8
009CB305 8BC8 mov ecx,eax
009CB307 038B E4000000 add ecx,dword ptr ds:[ebx+E4]
009CB30D 8BD6 mov edx,esi
009CB30F 8BC3 mov eax,ebx
009CB311 E8 AAE6FFFF call 009C99C0
F8步进到来到这里。
009CB19B 33C0 xor eax,eax
009CB19D 8A47 09 mov al,byte ptr ds:[edi+9]
009CB1A0 8D0440 lea eax,dword ptr ds:[eax+eax*2]
009CB1A3 8B5483 68 mov edx,dword ptr ds:[ebx+eax*4+68]
009CB1A7 8BC6 mov eax,esi
009CB1A9 FFD2 call edx
009CB1AB 807B 20 00 cmp byte ptr ds:[ebx+20],0
009CB1AF 0F85 3D010000 jnz 009CB2F2
009CB1B5 3C 01 cmp al,1
009CB1B7 0F85 35010000 jnz 009CB2F2
009CB1BD EB 01 jmp short 009CB1C0
Ctrl+B,查找字符串:33C08A078D04408B6C83688BC6
009CB171 8D7B 40 lea edi,dword ptr ds:[ebx+40]
009CB174 833C24 00 cmp dword ptr ss:[esp],0
009CB178 0F86 AB010000 jbe 009CB329 ; F2,在这里下断,F9。
009CB17E 33C0 xor eax,eax ; 找到这里,向下看。
009CB180 8A07 mov al,byte ptr ds:[edi]
009CB182 8D0440 lea eax,dword ptr ds:[eax+eax*2]
009CB185 8B6C83 68 mov ebp,dword ptr ds:[ebx+eax*4+68]
009CB189 8BC6 mov eax,esi
009CB18B FFD5 call ebp
009CB18D 8BE8 mov ebp,eax
009CB18F 036B 24 add ebp,dword ptr ds:[ebx+24]
009CB192 03AB E0000000 add ebp,dword ptr ds:[ebx+E0]
009CB198 EB 01 jmp short 009CB19B
009CB19A E8 33C08A47 call 482771D2
009CB19F 098D 04408B54 or dword ptr ss:[ebp+548B4004],ecx
009CB1A5 8368 8B C6 sub dword ptr ds:[eax-75],-3A
009CB1A9 FFD2 call edx ; call edx-->jmp xxxxxxxx
009CB1AB 807B 20 00 cmp byte ptr ds:[ebx+20],0
009CB1AF 0F85 3D010000 jnz 009CB2F2
到009CB178中断后,F4直接到009CB1A9,ESP中是函数数量。
用HideOD申请内存。得到01430000。
修改009CB1A9,call edx-->jmp 01430000。
下面是8100303的PATCH代码,感谢他的教程。
F8步进到申请内存01430000,键入以下代码。
=================================================================
01430000 FFD2 call edx
01430002 60 pushad
01430003 8B1D 30004301 mov ebx,dword ptr ds:[1430030]
01430009 C1E0 1F shl eax,1F
0143000C 03C5 add eax,ebp
0143000E 8903 mov dword ptr ds:[ebx],eax
01430010 83C3 04 add ebx,4
01430013 891D 30004301 mov dword ptr ds:[1430030],ebx
01430019 61 popad
0143001A 807B 20 00 cmp byte ptr ds:[ebx+20],0
0143001E - E9 8CB159FF jmp 009CB1AF
01430023 0000 add byte ptr ds:[eax],al
01430025 0000 add byte ptr ds:[eax],al
01430027 0000 add byte ptr ds:[eax],al
01430029 0000 add byte ptr ds:[eax],al
0143002B 0000 add byte ptr ds:[eax],al
0143002D 0000 add byte ptr ds:[eax],al
0143002F 0040 00 add byte ptr ds:[eax],al
01430032 43 inc ebx
01430033 0100 add dword ptr ds:[eax],eax
01430035 0000 add byte ptr ds:[eax],al
===================================================================
二进制:
FFD2608B1D30004301C1E01F03C5890383C304891D3000430161807B2000E98CB159FF00000000000000000000000000
400043010000
F9运行。
得到数据:
0143003C 00000000
01430040 00401505 notpad42.00401505
01430044 0040151D notpad42.0040151D
01430048 00401E79 notpad42.00401E79
0143004C 00401EE5 notpad42.00401EE5
......省略中间部分
0143012C 00404FB6 notpad42.00404FB6
01430130 00404FC2 notpad42.00404FC2
01430134 00404FC8 notpad42.00404FC8
01430138 00404FCE notpad42.00404FCE
0143013C 00000000
这时候程序跑飞了。复制这些数据到文件保存。
=========================================================================================================
二、INT3断点法(无Anti-rdtsc工具)。
00401000 > 68 01E04000 push notpad42.0040E001 ; OD入口。
00401005 E8 01000000 call notpad42.0040100B
0040100A C3 retn
0040100B C3 retn
Alt+O,忽略除INT3外的全部选项,F9运行一次。
009CB9AF 90 nop ; 断在这里。
009CB9B0 EB 01 jmp short 009CB9B3
009CB9B2 6966 81 FE474674 imul esp,dword ptr ds:[esi-7F],744647F>
009CB9B9 05 31C040EB add eax,EB40C031
009CB9BE 0231 add dh,byte ptr ds:[ecx]
009CB9C0 C031 DB sal byte ptr ds:[ecx],0DB
009CB9C3 64:8F03 pop dword ptr fs:[ebx]
009CB9C6 83C4 04 add esp,4
009CB9C9 EB 01 jmp short 009CB9CC
009CB9CB E8 5F5E5BC3 call C3F8182F
搜索-->文本字符串-->在ASCII“170”双击,来到反汇编窗口,向下滚动,找到第一个jbe,下硬断点。
009CD7EF 8B45 F0 mov eax,dword ptr ss:[ebp-10]
009CD7F2 8B55 F4 mov edx,dword ptr ss:[ebp-C]
009CD7F5 3B55 FC cmp edx,dword ptr ss:[ebp-4]
009CD7F8 75 0B jnz short 009CD805
009CD7FA 3B45 F8 cmp eax,dword ptr ss:[ebp-8]
009CD7FD 0F86 BB000000 jbe 009CD8BE ; ★jbe 009CD8BE-->jmp 009CD8BE★
009CD803 EB 06 jmp short 009CD80B
009CD805 0F8E B3000000 jle 009CD8BE
009CD80B 833D E0F89C00 00 cmp dword ptr ds:[9CF8E0],0
009CD812 75 12 jnz short 009CD826
Ctrl+F2,重起OD,忽略全部异常,F9,中断在009CD7FD,修改jbe 009CD8BE-->jmp 009CD8BE。
Ctrl+B,查找字符串:33C08A078D04408B6C83688BC6
009CB171 8D7B 40 lea edi,dword ptr ds:[ebx+40]
009CB174 833C24 00 cmp dword ptr ss:[esp],0
009CB178 0F86 AB010000 jbe 009CB329 ; F2,在这里下断,F9。
009CB17E 33C0 xor eax,eax ; 找到这里,向下看。
009CB180 8A07 mov al,byte ptr ds:[edi]
009CB182 8D0440 lea eax,dword ptr ds:[eax+eax*2]
009CB185 8B6C83 68 mov ebp,dword ptr ds:[ebx+eax*4+68]
009CB189 8BC6 mov eax,esi
009CB18B FFD5 call ebp
009CB18D 8BE8 mov ebp,eax
009CB18F 036B 24 add ebp,dword ptr ds:[ebx+24]
009CB192 03AB E0000000 add ebp,dword ptr ds:[ebx+E0]
009CB198 EB 01 jmp short 009CB19B
009CB19A E8 33C08A47 call 482771D2
009CB19F 098D 04408B54 or dword ptr ss:[ebp+548B4004],ecx
009CB1A5 8368 8B C6 sub dword ptr ds:[eax-75],-3A
009CB1A9 FFD2 call edx ; call edx-->jmp xxxxxxxx
009CB1AB 807B 20 00 cmp byte ptr ds:[ebx+20],0
009CB1AF 0F85 3D010000 jnz 009CB2F2
到009CB178中断后,F4直接到009CB1A9。
用HideOD申请内存。得到01430000。
修改009CB1A9,call edx-->jmp 01430000。
F8步进到申请内存01430000,键入以下代码。
=================================================================
01430000 FFD2 call edx
01430002 60 pushad
01430003 8B1D 30004301 mov ebx,dword ptr ds:[1430030]
01430009 C1E0 1F shl eax,1F
0143000C 03C5 add eax,ebp
0143000E 8903 mov dword ptr ds:[ebx],eax
01430010 83C3 04 add ebx,4
01430013 891D 30004301 mov dword ptr ds:[1430030],ebx
01430019 61 popad
0143001A 807B 20 00 cmp byte ptr ds:[ebx+20],0
0143001E - E9 8CB159FF jmp 009CB1AF
01430023 0000 add byte ptr ds:[eax],al
01430025 0000 add byte ptr ds:[eax],al
01430027 0000 add byte ptr ds:[eax],al
01430029 0000 add byte ptr ds:[eax],al
0143002B 0000 add byte ptr ds:[eax],al
0143002D 0000 add byte ptr ds:[eax],al
0143002F 0040 00 add byte ptr ds:[eax],al
01430032 43 inc ebx
01430033 0100 add dword ptr ds:[eax],eax
01430035 0000 add byte ptr ds:[eax],al
===================================================================
二进制:
FFD2608B1D30004301C1E01F03C5890383C304891D3000430161807B2000E98CB159FF00000000000000000000000000
400043010000
F9运行。
得到数据:
0143003C 00000000
01430040 00401505 notpad42.00401505
01430044 0040151D notpad42.0040151D
01430048 00401E79 notpad42.00401E79
0143004C 00401EE5 notpad42.00401EE5
......省略中间部分
0143012C 00404FB6 notpad42.00404FB6
01430130 00404FC2 notpad42.00404FC2
01430134 00404FC8 notpad42.00404FC8
01430138 00404FCE notpad42.00404FCE
0143013C 00000000
这时候程序跑飞了。复制这些数据到文件保存。
=========================================================================================================
对照上面的二中方法,得到同一个结果。
后面的继续调试可以参照8100303大侠的方法进行,本人也在继续摸索中,希望更多的高手能提供相应的教程和PATCH代
码,造福菜鸟们。
[ 本帖最后由 machenglin 于 2006-5-9 12:14 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|