吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 19306|回复: 26
收起左侧

[原创] 吾爱破解脱壳练习-----CRYPToCRACk's PE Protector

 关闭 [复制链接]
小生我怕怕 发表于 2008-10-7 00:36
一转眼我们的脱壳练习已经第9期啦,在这其中我相信许多的朋友也学习到了东西
必能脱掉此壳
本期考核主题为:CRYPToCRACk's PE Protector
1.脱壳后的文件大家以千脑形式上传,目的是为了便于隐藏文件和节约论坛空间
2.脱壳后的文件,请大家以脱文附带脱壳后程序打包压缩传于千脑网盘
3.对于回帖过程中千万不要出现灌水,否则BAN了ID
4.对于有优秀脱文或优秀脱壳方法的朋友,给于适当威望奖励
5.鉴于此练习是针对论坛的所有人,请大家踊跃参加,如果不是脱了壳教作业的,请不要顶帖子,方便管理查阅,及时给出评分
6.以下为需要设置威望的格式
7.脱壳一以周期计算,(周期=等于二天)
8.脱壳周期一结束,就开始公布答案让大家能有更充分的学习环境,让不懂脱的朋友去寻找你失误的地方争取早日赶上论坛的积极份子
9.我们要的是脱文,并不是脱壳机去脱的,如果用脱机脱了别拿来,请一定附带上脱文
10.我们讲对每次脱壳练习选择一个最好的脱壳分析过程,方便大家学习,每次脱壳练习结束后会说出楼数,对于被选种的朋友,我们会酌情给予CB或者威望进行奖励

11.对本次参加加密壳脱壳练习的,给出脱文全部给予5CB奖励,能分析出IAT加密所在,不使用importRCE等修复工具的给10CB



练习一:(结果已经公布)
http://www.52pojie.cn/thread-10496-1-1.html
最佳分析:第10楼unpack

练习二:(结果已经公布)
http://www.52pojie.cn/thread-10607-1-1.html
最佳分析:第9楼lqiulu

练习三:(结果已经公布)
http://www.52pojie.cn/thread-10688-1-1.html
最佳分析:第11楼傻人有傻福

练习四:(结果已经公布)
http://www.52pojie.cn/thread-10850-1-1.html
最佳分析:第11楼维护世界和平

练习五:(结果已经公布)
http://www.52pojie.cn/thread-10990-1-1.html
最佳分析:第3楼维护世界和平

练习六:(结果已经公布)
http://www.52pojie.cn/thread-11112-1-1.html
最佳分析:第12楼ximo

练习七:(结果已经公布)
http://www.52pojie.cn/thread-11244-1-1.html
最佳分析:第14楼傻人有傻福

练习八:(结果已经公布)
http://www.52pojie.cn/thread-11306-1-1.html
最佳分析: 第15楼unpack

UnPackMe.rar

372 KB, 下载次数: 1030, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

fox2006 发表于 2008-10-7 02:09
吾爱专题脱壳练习9
--------------------------------------------------------------------------------
【编写程序】:Borland Delphi 6.0 - 7.0
【调试环境】:WinXP、OllyDbg、PEiD、LordPE、ImportREC
【程序查壳】:CRYPToCRACk's PE Protector V0.9.3 -> Lukas Fleischer * 【脱壳方法】:避开IAT加密+内存镜像法

---------------------------------------------------------------------------------

00468000 >5Bpop ebx; OD载入到这里,ALT+M,下内存断点,F9
0046800181E3 00FFFFFF and ebx,FFFFFF00
0046800766:813B 4D5Acmp word ptr ds:[ebx],5A4D
0046800C75 33 jnz short UnPackMe.00468041
0046800E8BF3mov esi,ebx
----------------------------------------------------------------------------
7C9322DD66:8B50 0Cmov dx,word ptr ds:[eax+C] ;到这里再次ALT+M,下内存断点,F9
7C9322E166:8955 B4mov word ptr ss:[ebp-4C],dx
7C9322E58D70 10 lea esi,dword ptr ds:[eax+10]
7C9322E88975 94 mov dword ptr ss:[ebp-6C],esi
7C9322EB8B55 0C mov edx,dword ptr ss:[ebp+C]
-----------------------------------------------------------------------------
0045159C55push ebp ; 到达OEP,dump+修复
0045159D8BECmov ebp,esp
0045159F83C4 F0 add esp,-10
004515A2B8 BC134500 mov eax,UnPackMe.004513BC
004515A7E8 8846FBFF call UnPackMe.00405C34
004515ACA1 E02F4500 mov eax,dword ptr ds:[452FE0]

--------------------------------------------------------------------------------
说明:
在修复时候发现所有的都是无效指针函数,等级1、3都无法修复,要找到真实的指针函数,记下其中一个无效指针函数RAV,我这里记下第一个

无效函数RAV, 0005512C,

地址=00400000+0005512C=0045512C.
-----------------------------------------------------------------------------------
在OD命令处运行dd 0045512C,在此地址下硬件写入断点;F12,(让数据窗口显示0045512C地址,观察这地址注释栏的变化)F9,注意数据窗口
和寄存器窗口的变化,当我们F9三次时候(再次F9程序就运行了):

分析如下(仔细看下):
-------------------------------------------------------------------------------
汇编窗口:
004683315Apop edx
0046833259pop ecx
004683335Bpop ebx
004683348B7C24 04 mov edi,dword ptr ss:[esp+4]
00468338893C8Amov dword ptr ds:[edx+ecx*4],edi;这里取EDI寄存器的值,根据下面寄存器窗口得知,应该取EAX的值
0046833B807F 05 55cmp byte ptr ds:[edi+5],55;F9三次到这里断下,出现了IAT加密,往上看

-------------------------------------------------------------------------------
数据窗口出现了:

0045512C00468384UnPackMe.00468384 (看这注释,出现了指针函数不真实,要找到真实的)
004551300005574E
0045513400055766
----------------------------------------------------------------------------------
寄存器窗口出现了:

EAX 7C93135A ntdll.RtlDeleteCriticalSection (这个才是指针真正的函数值)EAX
ECX 00000000
EDX 0045512C UnPackMe.0045512C
EBX 00400000 ASCII "MZP"
ESP 0012FFB4
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00468384 UnPackMe.00468384 (这个不是指针实际的函数值) EDI
EIP 0046833B UnPackMe.0046833B

------------------------------------------------------------------------------

根据上面的分析,得知,需要更改edi为eax:
00468338893C8Amov dword ptr ds:[edx+ecx*4],edi
更改为
00468338893C8Amov dword ptr ds:[edx+ecx*4],eax
记下地址 00468338
---------------------------------------------------------------------------------
F12,重新开始,在OD命令处运行dd 0045512C,在此地址下硬件写入断点;F9两次(三次IAT就加密了),CTRL+G,(00468338),将

00468338893C8Amov dword ptr ds:[edx+ecx*4],edi

更改为(将edi该为eax)

00468338893C8Amov dword ptr ds:[edx+ecx*4],eax
-----------------------------------------------------------------------------------

改完后,删除所有断点,接着用内存镜像法到达OEP,这样IAT就避开加密了,可以修复啦。dump+修复吧。





吾爱专题脱壳练习9
 楼主| 小生我怕怕 发表于 2008-10-7 01:20
00468000 >5Bpop ebx//OD载入
0046800181E3 00FFFFFF and ebx,FFFFFF00 //打开内存镜像ait+m
0046800766:813B 4D5Acmp word ptr ds:[ebx],5A4D
0046800C75 33 jnz short UnPackMe.00468041
0046800E8BF3mov esi,ebx
004680100373 3C add esi,dword ptr ds:[ebx+3C]
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 24 //在此下f2访问中断
地址=00460000//接着shift+f9运行
大小=00008000 (32768.)
物主=UnPackMe 00400000
区段=.rsrc
包含=resources
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C9322DD66:8B50 0Cmov dx,word ptr ds:[eax+C] //程序停在这里
7C9322E166:8955 B4mov word ptr ss:[ebp-4C],dx//在次ait+m打开内存镜像
7C9322E58D70 10 lea esi,dword ptr ds:[eax+10]
7C9322E88975 94 mov dword ptr ss:[ebp-6C],esi
7C9322EB8B55 0C mov edx,dword ptr ss:[ebp+C]
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 22//在此下f2访问中断
地址=00401000//接着shift+f9运行
大小=00051000 (331776.)
物主=UnPackMe 00400000
区段=CODE
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045159C55push ebp//程序停于我们的OEP此处
0045159D8BECmov ebp,esp //现在我们来打开我们的importRCE看看指针
0045159F83C4 F0 add esp,-10 //会发现我们的IAT指针没有一个有效
004515A2B8 BC134500 mov eax,UnPackMe.004513BC
004515A7E8 8846FBFF call UnPackMe.00405C34
004515ACA1 E02F4500 mov eax,dword ptr ds:[452FE0]
004515B18B00mov eax,dword ptr ds:[eax]
━━━━━━━━━━━━━━━━━━━━━━━━━━
这里我们可以选择打开原加壳程序选择等级3修复即可寻找回所有的指针,也可以修复到程序运行
但是这里我们来讲解下如何去处理这个程序的magic jump,下面我们来寻找一下我们的magic jump
ctrl+f2从新加载一下程序,下面大家跟着分析走吧
━━━━━━━━━━━━━━━━━━━━━━━━━━
00468000 >5Bpop ebx //在一次OD载入程序停在这里
0046800181E3 00FFFFFF and ebx,FFFFFF00//ait+m打开内存镜像
0046800766:813B 4D5Acmp word ptr ds:[ebx],5A4D
0046800C75 33 jnz short UnPackMe.00468041
0046800E8BF3mov esi,ebx
004680100373 3C add esi,dword ptr ds:[ebx+3C]
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 23 //在此设置f2访问中断
地址=0045A000//接着shift+f9运行程序
大小=00006000 (24576.)
物主=UnPackMe 00400000
区段=.reloc
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
00468232300431xor byte ptr ds:[ecx+esi],al//程序停于此处
00468235C1CA 08 ror edx,8 //开始f8单步走
0046823881EA 3B1FE120 sub edx,20E11F3B
0046823EF7D0not eax
0046824003C2add eax,edx
0046824203D0add edx,eax
00468244^ EB E9 jmp short UnPackMe.0046822F//这个jmp向上跳
00468246C3retn //我们在此f4运行到所选
0046824761popad
0046824883C7 28 add edi,28
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046824C^\75 97 jnz short UnPackMe.004681E5 //这个JNZ向上我们继续打断他
0046824E8BBE C0000000 mov edi,dword ptr ds:[esi+C0] //在此F4运行到所选
0046825485FFtest edi,edi
0046825674 13 je short UnPackMe.0046826B
004682588BC3mov eax,ebx
0046825A03C7add eax,edi
0046825C8378 08 00cmp dword ptr ds:[eax+8],0
0046826074 09 je short UnPackMe.0046826B
004682628B40 08 mov eax,dword ptr ds:[eax+8]
00468265C700 00000000 mov dword ptr ds:[eax],0
0046826BE8 01000000 call UnPackMe.00468271//这个是远CALL我们F7跟进
00468270E8 81042414 call 146A86F6
━━━━━━━━━━━━━━━━━━━━━━━━━━
00468271810424 14010000 add dword ptr ss:[esp],114 //来到这里,我们继续F8单步跟
00468278BE 00504500 mov esi,UnPackMe.00455000
0046827D53push ebx
0046827E56push esi
━━━━━━━━━━━━━━━━━━━━━━━━━━
004682BEA9 00000080 test eax,80000000
004682C375 61 jnz short UnPackMe.00468326
004682C5E8 01000000 call UnPackMe.004682CB //此为远CALL,我们F7跟进
004682CAB5 81 mov ch,81
004682CC04 24 add al,24
━━━━━━━━━━━━━━━━━━━━━━━━━━
004682CB810424 3C000000 add dword ptr ss:[esp],3C//程序来到这里
004682D28D7C03 02 lea edi,dword ptr ds:[ebx+eax+2] //单步F8继续跟
004682D6B8 F81EBA69 mov eax,69BA1EF8
004682DBBA E1FDE27C mov edx,7CE2FDE1
004682E02BC9sub ecx,ecx
━━━━━━━━━━━━━━━━━━━━━━━━━━
004682F803D0add edx,eax
004682FA41inc ecx
004682FB^ EB E5 jmp short UnPackMe.004682E2 //这个JMP向上我们在下一句打断
004682FDC3retn//在此F4运行到所选
004682FE83C4 0C add esp,0C
00468301- E9 9692FEFF jmp UnPackMe.0045159C
0046830657push edi
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046830657push edi //单步一下到这里
00468307FF3424push dword ptr ss:[esp]//继续开始F8单步跟
0046830A55push ebp //此时开始注意寄存器窗口的指针
0046830BFF5424 20 call dword ptr ss:[esp+20]
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX AB6A284D
ECX 00000015
EDX 869387B1
EBX 00400000 ASCII "MZP"
ESP 0012FFA8
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00455738 ASCII "DeleteCriticalSection"
EIP 00468306 UnPackMe.00468306 //此时我们寄存器里的指针都是完整的
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX 7C93135A ntdll.RtlDeleteCriticalSection//大家注意寄存器指针的变化
ECX 00000000
EDX 7C99B178 ntdll.7C99B178
EBX 00400000 ASCII "MZP"
ESP 0012FFA4 ASCII "8WE"
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00455738 ASCII "DeleteCriticalSection"
EIP 00468318 UnPackMe.00468318
━━━━━━━━━━━━━━━━━━━━━━━━━━
0046831F^\EB F3 jmp short UnPackMe.00468314 //此JMP向上,我们在下一句打断
0046832183C4 04 add esp,4 //F4运行到此
00468324EB 0B jmp short UnPackMe.00468331
004683262D 00000080 sub eax,80000000
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX 7C93135A ntdll.RtlDeleteCriticalSection //正确指针所在
ECX 00000000
EDX 0045512C UnPackMe.0045512C
EBX 00400000 ASCII "MZP"
ESP 0012FFB4
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00468384 UnPackMe.00468384
EIP 00468338 UnPackMe.00468338
━━━━━━━━━━━━━━━━━━━━━━━━━━
00468338893C8Amov dword ptr ds:[edx+ecx*4],edi//大家注意这里此时我们的指针是在EAX
0046833B807F 05 55cmp byte ptr ds:[edi+5],55//这里开始给 EDI 赋值
0046833F73 0C jnb short UnPackMe.0046834D //赋值成功则跳转实现
004683412B47 01 sub eax,dword ptr ds:[edi+1]
00468344C747 05 8104240>mov dword ptr ds:[edi+5],240481
0046834BEB 1E jmp short UnPackMe.0046836B
0046834D807F 05 AAcmp byte ptr ds:[edi+5],0AA//此处也同样在给EDI赋值
0046835173 0E jnb short UnPackMe.00468361//赋值成功则跳转不实现,即开始加密
00468353F7D8neg eax//这里即加密语句,把加密指针补回给EAX
004683550347 01 add eax,dword ptr ds:[edi+1] //即把积存器里EAX指针加密
00468358C747 05 812C240>mov dword ptr ds:[edi+5],242C81//到下面的就开始没有指针啦
━━━━━━━━━━━━━━━━━━━━━━━━━━
EAX EEFDD4BF //此时EAX是被加密了的
ECX 00000000
EDX 0045512C UnPackMe.0045512C
EBX 00400000 ASCII "MZP"
ESP 0012FFB4
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00468384 UnPackMe.00468384
EIP 0046835F UnPackMe.0046835F
━━━━━━━━━━━━━━━━━━━━━━━━━━
那么我们就因上面的判断即可得出结论,这里应该是给EAX赋值而不是给EDI
00468338893C8Amov dword ptr ds:[edx+ecx*4],edi//即把此处的mov dword ptr ds:[edx+ecx*4],edi后面的EDI改为EAX
0046833B807F 05 55cmp byte ptr ds:[edi+5],55//修改后,我们在次打开内存镜象ait+m
0046833F73 0C jnb short UnPackMe.0046834D
004683412B47 01 sub eax,dword ptr ds:[edi+1]
00468344C747 05 8104240>mov dword ptr ds:[edi+5],240481
0046834BEB 1E jmp short UnPackMe.0046836B
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 24//在此f2设置访问中断
地址=00460000 //shift+f9运行
大小=00008000 (32768.)
物主=UnPackMe 00400000
区段=.rsrc
包含=resources
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C9322DD66:8B50 0Cmov dx,word ptr ds:[eax+C] //程序停在此处
7C9322E166:8955 B4mov word ptr ss:[ebp-4C],dx//在此ait+m打开内存镜像
7C9322E58D70 10 lea esi,dword ptr ds:[eax+10]
7C9322E88975 94 mov dword ptr ss:[ebp-6C],esi
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 18 //在此f2设置访问中断
地址=00401000//shift+f9运行程序
大小=00051000 (331776.)
物主=UnPackMe 00400000
区段=CODE
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045159C55push ebp//这里就是我们的OEP,直接运行OD插件把程序DUMP
0045159D8BECmov ebp,esp //此时会发现程序是可以运行的
0045159F83C4 F0 add esp,-10 //在运行我们的importRCE看下我们的指针
004515A2B8 BC134500 mov eax,UnPackMe.004513BC //发现有一个无效,剪掉即可,但是我们的程序现在是不用importRCE修复的
004515A7E8 8846FBFF call UnPackMe.00405C34//到此脱壳结束
004515ACA1 E02F4500 mov eax,dword ptr ds:[452FE0]
004515B18B00mov eax,dword ptr ds:[eax]
004515B3E8 F8E5FFFF call UnPackMe.0044FBB0
004515B8A1 E02F4500 mov eax,dword ptr ds:[452FE0]
━━━━━━━━━━━━━━━━━━━━━━━━━━
为了方便二进制复制下程序的magic jump如下特征码
5A 59 5B 8B 7C 24 04 89 3C 8A
简化脱壳流程,即ctrl+b搜索5A 59 5B 8B 7C 24 04 89 3C 8A
接着打开内存在rsrc段下段,shift+f9运行,程序停下后在次打开内存进行
在code段下段shift+f9运行,即可用OD插件脱壳

unpack.rar

169 KB, 下载次数: 13, 下载积分: 吾爱币 -1 CB

pcfans 发表于 2008-10-7 02:27
脱壳过程:

OD载入,用内存境象法

00468000 >5BPOP EBX //OD载入停在这里
0046800181E3 00FFFFFF AND EBX,FFFFFF00
0046800766:813B 4D5ACMP WORD PTR DS:[EBX],5A4D
0046800C75 33 JNZ SHORT UnPackMe.00468041
0046800E8BF3MOV ESI,EBX
004680100373 3C ADD ESI,DWORD PTR DS:[EBX+3C]
00468013813E 50450000 CMP DWORD PTR DS:[ESI],4550
--------------------------------

alt+m在00460000的.rsrc段下f2断点,shift+f9运行

7C93280D66:8B50 0CMOV DX,WORD PTR DS:[EAX+C] //停在这里
7C93281166:8955 B0MOV WORD PTR SS:[EBP-50],DX
7C9328158D70 10 LEA ESI,DWORD PTR DS:[EAX+10]
7C9328188975 90 MOV DWORD PTR SS:[EBP-70],ESI
7C93281B8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
7C93281E66:F742 02 FFFF TEST WORD PTR DS:[EDX+2],0FFFF
7C93282475 11 JNZ SHORT ntdll.7C932837

--------------------------------

再一次alt+m在00401000的code段下f2断点,shift+f9运行,直接到达OEP

0045159C55PUSH EBP //到达OEP了
0045159D8BECMOV EBP,ESP
0045159F83C4 F0 ADD ESP,-10
004515A2B8 BC134500 MOV EAX,UnPackMe.004513BC
004515A7E8 8846FBFF CALL UnPackMe.00405C34
004515ACA1 E02F4500 MOV EAX,DWORD PTR DS:[452FE0]
004515B18B00MOV EAX,DWORD PTR DS:[EAX]
004515B3E8 F8E5FFFF CALL UnPackMe.0044FBB0

--------------------------------

修复过程:

用LoadPE脱壳后,ImportREC修复,出现300多个无效指针,等级1可以修复几个,看来要找iat加密了

重新载入

dd 0045512c 下硬件访问断点,四次f9后程序运行,这样按三次后单步跟

004682B285C0TEST EAX,EAX //三次后断在这里
004682B40F84 C2000000 JE UnPackMe.0046837C
004682BA57PUSH EDI
004682BB53PUSH EBX
004682BC51PUSH ECX
004682BD52PUSH EDX
004682BEA9 00000080 TEST EAX,80000000
004682C375 61 JNZ SHORT UnPackMe.00468326
004682C5E8 01000000 CALL UnPackMe.004682CB //这个call里对IAT进行加密,f7跟进
004682CAB5 81 MOV CH,81
004682CC04 24 ADD AL,24
004682CE3C 00 CMP AL,0
---------------------------------------------

F7跟进后停在这里

004682CB810424 3C000000 ADD DWORD PTR SS:[ESP],3C//单步f8跟踪
004682D28D7C03 02 LEA EDI,DWORD PTR DS:[EBX+EAX+2]
004682D6B8 F81EBA69 MOV EAX,69BA1EF8
004682DBBA E1FDE27C MOV EDX,7CE2FDE1
004682E02BC9SUB ECX,ECX
004682E2300439XOR BYTE PTR DS:[ECX+EDI],AL
004682E5803C39 00 CMP BYTE PTR DS:[ECX+EDI],0
004682E974 12 JE SHORT UnPackMe.004682FD
004682EB81EA 9585656B SUB EDX,6B658595
004682F1C1C2 02 ROL EDX,2
004682F4F7D8NEG EAX
004682F603C2ADD EAX,EDX
004682F803D0ADD EDX,EAX
004682FA41INC ECX
004682FB^ EB E5 JMP SHORT UnPackMe.004682E2
004682FDC3RETN
004682FE83C4 0C ADD ESP,0C
00468301- E9 9692FEFF JMP UnPackMe.0045159C
0046830657PUSH EDI
00468307FF3424PUSH DWORD PTR SS:[ESP]
0046830A55PUSH EBP
0046830BFF5424 20 CALL DWORD PTR SS:[ESP+20]
0046830F8B3C24MOV EDI,DWORD PTR SS:[ESP]
0046831233C9XOR ECX,ECX
00468314803C39 00 CMP BYTE PTR DS:[ECX+EDI],0
0046831874 07 JE SHORT UnPackMe.00468321
0046831AC60439 00 MOV BYTE PTR DS:[ECX+EDI],0
0046831E41INC ECX
0046831F^ EB F3 JMP SHORT UnPackMe.00468314
0046832183C4 04 ADD ESP,4
00468324EB 0B JMP SHORT UnPackMe.00468331
004683262D 00000080 SUB EAX,80000000
0046832B50PUSH EAX
0046832C55PUSH EBP
0046832DFF5424 1C CALL DWORD PTR SS:[ESP+1C]
004683315APOP EDX
0046833259POP ECX
004683335BPOP EBX
004683348B7C24 04 MOV EDI,DWORD PTR SS:[ESP+4] //这里将加密指针放入EDI寄存器

00468338893C8AMOV DWORD PTR DS:[EDX+ECX*4],EDI//这里观察寄存器窗口,EAX的值是

还没加密的函数,这时把EDI寄存器改成EAX,就可以达到解密效果

0046833B807F 05 55CMP BYTE PTR DS:[EDI+5],55 //这里观察数据窗口,0045512c的指针已

经解密出来了
0046833F73 0C JNB SHORT UnPackMe.0046834D
004683412B47 01 SUB EAX,DWORD PTR DS:[EDI+1]
00468344C747 05 8104240>MOV DWORD PTR DS:[EDI+5],240481
0046834BEB 1E JMP SHORT UnPackMe.0046836B
0046834D807F 05 AACMP BYTE PTR DS:[EDI+5],0AA
0046835173 0E JNB SHORT UnPackMe.00468361
00468353F7D8NEG EAX
004683550347 01 ADD EAX,DWORD PTR DS:[EDI+1]
00468358C747 05 812C240>MOV DWORD PTR DS:[EDI+5],242C81
0046835FEB 0A JMP SHORT UnPackMe.0046836B
004683613347 01 XOR EAX,DWORD PTR DS:[EDI+1]
00468364C747 05 8134240>MOV DWORD PTR DS:[EDI+5],243481
0046836B8947 08 MOV DWORD PTR DS:[EDI+8],EAX
0046836E83C7 0D ADD EDI,0D
00468371877C24 04 XCHG DWORD PTR SS:[ESP+4],EDI
004683755FPOP EDI
0046837641INC ECX
00468377^ E9 33FFFFFF JMP UnPackMe.004682AF
0046837C83C6 14 ADD ESI,14
0046837F^ E9 F9FEFFFF JMP UnPackMe.0046827D

----------------------------------------------------------------

0046833889048AMOV DWORD PTR DS:[EDX+ECX*4],EAX//EDI改成EAX后这样的

此处改好后,f9运行程序,所有函数解密完成
0045512C7C93188Antdll.RtlDeleteCriticalSection
004551307C9210EDntdll.RtlLeaveCriticalSection
004551347C921005ntdll.RtlEnterCriticalSection
004551387C809FA1kernel32.InitializeCriticalSection
0045513C7C809B14kernel32.VirtualFree
004551407C809A81kernel32.VirtualAlloc

………………省略


所有的函数都正常显示了这时就用ImportREC加载程序,获取输入表后,所有指针都有效,抓取刚才脱壳

的程序。抓取修复后程序运行正常,peid查壳peid查壳Borland Delphi 6.0 - 7.0

脱壳完成!哈哈
小黑冰 发表于 2008-10-7 02:51
00468000 >pop ebx; kernel32.7C816FD7
00468001and ebx,FFFFFF00
00468007cmp word ptr ds:[ebx],5A4D
0046800Cjnz short UnPackMe.00468041
0046800Emov esi,ebx
00468010add esi,dword ptr ds:[ebx+3C]
00468013cmp dword ptr ds:[esi],4550
00468019jnz short UnPackMe.00468041
0046801Bmovzx eax,word ptr ds:[esi+18]
0046801Fmov ecx,eax
00468021imul eax,eax,0BAD
00468027mul eax
00468029sub eax,4B415DAB
0046802Eimul ecx,ecx,0C0DE
00468034add eax,ecx
00468036jnz short UnPackMe.00468041
00468038sub esp,4
0046803Bjnz UnPackMe.0046811E; F4跳过死循环
--------------------------------------------------------------------------------------------------------------------------------------------
0046812F0FB648 0>movzx ecx,byte ptr ds:[eax+2]
00468133E3 03jecxz short UnPackMe.00468138
0046813558 pop eax
00468136FFE0 jmp eax
0046813868 EF65A>push EFA865EF
0046813D68 CB282>push 0B2128CB
0046814253 push ebx
00468143E8 19000>call UnPackMe.00468161
0046814850 push eax
00468149E8 01000>call UnPackMe.0046814F ; F7
-----------------------------------------------------------------------------------------------------------------------------
004681B68B0497 mov eax,dword ptr ds:[edi+edx*4]
004681B903C3 add eax,ebx
004681BB59 pop ecx
004681BC5F pop edi
004681BD5E pop esi
004681BE5B pop ebx
004681BFC9 leave
004681C0C2 0C00retn 0C
004681C383C6 04add esi,4
004681C683C7 02add edi,2
004681C949 dec ecx
004681CA^ 75 C3jnz short UnPackMe.0046818F
004681CCCD 14int 14
004681CE50 push eax F4
---------------------------------------------------------------------------------------------------------------------------------
004681D48BF3 mov esi,ebx
004681D60373 3Cadd esi,dword ptr ds:[ebx+3C]
004681D90FB74E 0>movzx ecx,word ptr ds:[esi+6]
004681DD8BFE mov edi,esi
004681DF81C7 F80>add edi,0F8
004681E560 pushad
004681E6E8 01000>call UnPackMe.004681EC ; F7
------------------------------------------------------------------------------------------------------------------
00468256 /74 13je short UnPackMe.0046826B
00468258 |8BC3 mov eax,ebx
0046825A |03C7 add eax,edi
0046825C |8378 08 >cmp dword ptr ds:[eax+8],0
00468260 |74 09je short UnPackMe.0046826B
00468262 |8B40 08mov eax,dword ptr ds:[eax+8]
00468265 |C700 000>mov dword ptr ds:[eax],0
0046826B \E8 01000>call UnPackMe.00468271 -------------------------------F7
00468270E8 81042>call 146A86F6
---------------------------------------------------------------------------------------------------------------------------
004682E5803C39 0>cmp byte ptr ds:[ecx+edi],0
004682E974 12je short UnPackMe.004682FD
004682EB81EA 958>sub edx,6B658595
004682F1C1C2 02rol edx,2
004682F4F7D8 neg eax
004682F603C2 add eax,edx
004682F803D0 add edx,eax
004682FA41 inc ecx
004682FB^ EB E5jmp short UnPackMe.004682E2
004682FDC3 retn
004682FE83C4 0Cadd esp,0C
00468301- E9 9692F>jmp UnPackMe.0045159C; 下段点 然后SHIFTI+F9 然后取消段点
-------------------------------------------------------------------------------------------------------------
0045159C 1> $55 push ebp
0045159D.8BEC mov ebp,esp
0045159F.83C4 F>add esp,-10
004515A2.B8 BC1>mov eax,1.004513BC
004515A7.E8 884>call 1.00405C34
004515AC.A1 E02>mov eax,dword ptr ds:[452FE0]
004515B1.8B00 mov eax,dword ptr ds:[eax]
004515B3.E8 F8E>call 1.0044FBB0
004515B8.A1 E02>mov eax,dword ptr ds:[452FE0]
004515BD.8B00 mov eax,dword ptr ds:[eax]
004515BF.BA FC1>mov edx,1.004515FC ;ASCII ".52pojie.cn"
004515C4.E8 F7E>call 1.0044F7C0
004515C9.8B0D C>mov ecx,dword ptr ds:[4530C0];1.00454BD0


OEP简单到达 应该重在修复用等级三修复即可``````
未命名.jpg

4_.rar

169 KB, 下载次数: 1, 下载积分: 吾爱币 -1 CB

jcyhlh 发表于 2008-10-7 09:25
od载入,忽略所有异常。
1、避开IAT加密
Ctrl + B 搜索5A 59 5B 8B 7C 24 04 89 3C 8A代码,

004683315APOP EDX
0046833259POP ECX
004683335BPOP EBX
004683348B7C24 04 MOV EDI,DWORD PTR SS:[ESP+4]
00468338893C8AMOV DWORD PTR DS:[EDX+ECX*4],EDI-----将edi改为eax,因为edi存储的是加密Call的地址 而eax存储的是正确

的IAT地址
0046833B807F 05 55CMP BYTE PTR DS:[EDI+5],55
0046833F73 0C JNB SHORT UnPackMe.0046834D
004683412B47 01 SUB EAX,DWORD PTR DS:[EDI+1]
00468344C747 05 8104240>MOV DWORD PTR DS:[EDI+5],240481
2、找OEP:内存镜像法
Alt + M
在资源段.rsrc处F2下断, F9运行。再在代码段code处 F2下断,F9运行,直达OEP。
0045159C55PUSH EBP ; shell32.#599
0045159D8BECMOV EBP,ESP
0045159F83C4 F0 ADD ESP,-10
004515A2B8 BC134500 MOV EAX,UnPackMe.004513BC
004515A7E8 8846FBFF CALL UnPackMe.00405C34
004515ACA1 E02F4500 MOV EAX,DWORD PTR DS:[452FE0]
004515B18B00MOV EAX,DWORD PTR DS:[EAX]
004515B3E8 F8E5FFFF CALL UnPackMe.0044FBB0
3、用Lordpe,dump,然后再修复,全部有效。Borland Delphi 6.0 - 7.0程序。
hw233 发表于 2008-10-7 09:45
载程序来到这儿
00468000 >pop ebx; kernel32.7C817067
00468001and ebx, FFFFFF00
00468007cmp word ptr [ebx], 5A4D
0046800Cjnz short 00468041
0046800Emov esi, ebx
00468010add esi, dword ptr [ebx+3C]
00468013cmp dword ptr [esi], 4550
00468019jnz short 00468041
0046801Bmovzx eax, word ptr [esi+18]
0046801Fmov ecx, eax
00468021imuleax, eax, 0BAD
00468027mul eax
00468029sub eax, 4B415DAB
0046802Eimulecx, ecx, 0C0DE
00468034add eax, ecx
00468036jnz short 00468041

1.ctrl+B: 5A 59 5B 8B 7C 24 04 89 3C 8A
2.将下面最后一行修改成 mov dword ptr ds:[edx+ecx*4],eax
引用:
00468331>pop edx
00468332>pop ecx
00468333>pop ebx
00468334>mov edi, dword ptr [esp+4]
00468338>mov dword ptr [edx+ecx*4], edi
0046833B>cmp byte ptr [edi+5], 55

; edi存储的是加密Call的地址 而eax存储的是正确的IAT地址

3.找OEP的方法:内存镜像法 当然还有其它的 比如SFX法==...
Alt + M
然后在资源段 F2 -> Shift + F9
再到 代码段 F2 -> Shift + F9到OEP
==LoadPE & ImportREC
4.脱壳修复即可


dumped_1223343774415.exe
lqiulu 发表于 2008-10-7 10:03
①内存镜像法脱壳:
00468000 >POP EBX; //程序入口点。
00468001AND EBX,FFFFFF00
00468007CMP WORD PTR DS:[EBX],5A4D
0046800CJNZ SHORT UnPackMe.00468041
0046800EMOV ESI,EBX
00468010ADD ESI,DWORD PTR DS:[EBX+3C]

第一次:
alt+m
F2在 Section=.rsrc段下断,shif+f9运行,停在下面:
7C9322DDMOV DX,WORD PTR DS:[EAX+C]//停在这里。
7C9322E1MOV WORD PTR SS:[EBP-4C],DX
7C9322E5LEA ESI,DWORD PTR DS:[EAX+10]
第二次:
alt+m
F2在 Section=.code段下断,shif+f9运行,停在程序OEP:
0045159C55PUSH EBP ; 程序OEP
0045159D8BECMOV EBP,ESP
0045159F83C4 F0 ADD ESP,-10
004515A2B8 BC134500 MOV EAX,UnPackMe.004513BC
004515A7E8 8846FBFF CALL UnPackMe.00405C34
004515ACA1 E02F4500 MOV EAX,DWORD PTR DS:[452FE0]
004515B18B00MOV EAX,DWORD PTR DS:[EAX]
004515B3E8 F8E5FFFF CALL UnPackMe.0044FBB0
004515B8A1 E02F4500 MOV EAX,DWORD PTR DS:[452FE0]
004515BD8B00MOV EAX,DWORD PTR DS:[EAX]
004515BFBA FC154500 MOV EDX,UnPackMe.004515FC; ASCII "
www.52pojie.cn"
004515C4E8 F7E1FFFF CALL UnPackMe.0044F7C0
004515C98B0D C0304500 MOV ECX,DWORD PTR DS:[4530C0]; UnPackMe.00454BD0
DUMP程序,
利用importREC进行修复处理IAT加密:
在OD载入的时候不能进行修复。重新打开一个新的加壳程序,填入OEP,5159C,自动查找,指针全部无效,用等级三修复,完全修复,正常运行。
②手动处理IAT加密。
在第一处无效指针处记下地址:RAV:5512c,即为地址45512C,下内存写入断点。重新运行程序。
第一次停在这里。没有指针相关的东西,再次F9运行,
00468232300431XOR BYTE PTR DS:[ECX+ESI],AL
00468235C1CA 08 ROR EDX,8
0046823881EA 3B1FE120 SUB EDX,20E11F3B
跳过上面断点后,断在下面:
00468338893C8AMOV DWORD PTR DS:[EDX+ECX*4],EDI ; UnPackMe.00468384
edi给第一个无效指针赋值。EDI不是系统函数,而EAX是。
此时观查寄存器:
EAX 7C93135A ntdll.RtlDeleteCriticalSection
ECX 00000000
EDX 0045512C UnPackMe.0045512C
EBX 00400000 ASCII "MZP"
ESP 0012FFB4
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00468384 UnPackMe.00468384

再用上面的方法在第二个无效指针地址:455130,下内存写入断点。重新运行程序。
第一次又停在这里。没有指针相关的东西,再次F9运行
00468232300431XOR BYTE PTR DS:[ECX+ESI],AL
00468235C1CA 08 ROR EDX,8
0046823881EA 3B1FE120 SUB EDX,20E11F3B
0046823EF7D0NOT EAX
跳过上面断点后,断在下面:
00468338893C8AMOV DWORD PTR DS:[EDX+ECX*4],EDI; UnPackMe.00468391
edi给第一个无效指针赋值。EDI不是系统函数,而EAX是。
此时观查寄存器:
EAX 7C9210E0 ntdll.RtlLeaveCriticalSection
ECX 00000001
EDX 0045512C UnPackMe.0045512C
EBX 00400000 ASCII "MZP"
ESP 0012FFB4
EBP 7C800000 kernel32.7C800000
ESI 00455000 UnPackMe.00455000
EDI 00468391 UnPackMe.00468391
EIP 00468338 UnPackMe.00468338
跟上面的情形一样。所以可以确定,MOV DWORD PTR DS:[EDX+ECX*4],EDI是给IAT加密的。将不是系统指针的EDI改为EAX,试试。
修改后直接用OD插件DUMP后可以正常运行。


傻人有傻福 发表于 2008-10-7 12:19
00468000 >5Bpop ebx; OD载入到这里
0046800181E3 00FFFFFF and ebx,FFFFFF00
0046800766:813B 4D5Acmp word ptr ds:[ebx],5A4D
0046800C75 33 jnz short UnPackMe.00468041
0046800E8BF3mov esi,ebx
004680100373 3C add esi,dword ptr ds:[ebx+3C]

在DATAE段下内存访问SHIFT+F9 断在这里
00468232300431xor byte ptr ds:[ecx+esi],al ; 断在这里
00468235C1CA 08 ror edx,8
0046823881EA 3B1FE120 sub edx,20E11F3B
0046823EF7D0not eax
0046824003C2add eax,edx
0046824203D0add edx,eax
00468244^ EB E9 jmp short UnPackMe.0046822F
00468246C3retn

CTRL+B 搜索89 3C 8A

00468338893C8Amov dword ptr ds:[edx+ecx*4],edi ; 搜索到这里,这里就是IAT加密的地方,EAX中是正确的指针,我们把EDI改成EAX
0046833B807F 05 55cmp byte ptr ds:[edi+5],55
0046833F73 0C jnb short UnPackMe.0046834D
004683412B47 01 sub eax,dword ptr ds:[edi+1]
00468344C747 05 8104240>mov dword ptr ds:[edi+5],240481
0046834BEB 1E jmp short UnPackMe.0046836B

接着在CODE段下内存访问断点 SHIFT+F9就到OEP了

0045159C55push ebp ; OEP
0045159D8BECmov ebp,esp
0045159F83C4 F0 add esp,-10
004515A2B8 BC134500 mov eax,UnPackMe.004513BC
004515A7E8 8846FBFF call UnPackMe.00405C34
004515ACA1 E02F4500 mov eax,dword ptr ds:[452FE0]

DUMP出来后用IMPORTREC修复 指针全部有效 转储修复一下 可以运行

关于IAT加密的找法:如果不解决IAT加密的问题,IMPORTREC修复时指针全部无效(在我这里是这样的)
我们可以记下一个无效指针的地址,在数据窗口下硬件访问(其他的断点也可能可以,灵活运用就行)
然后SHIFT+F9 跑起来,当观察到这个地址的数据变成加密的数据的时候(比如说像变成一个地址之类的,多看几次就明白了),这时我们在变化之前先停下来,单步跟踪一下,注意看下代码,寄存器,多练习几次就能知道哪里是IAT加密的地方了(这种方法可能不通用,还有很多壳我没脱过,这只是一点思路)
小糊涂虫 发表于 2008-10-7 13:04
内存映射,项目 23
地址=00460000
大小=00008000 (32768.)
宿主=UnPackMe 00400000
区段=.rsrc
包含=resources
类型=Imag 01001002
访问=R
初始访问=RWE
下断.....SHIFT+f9

然后在内存映射,项目 16
地址=00401000
大小=00051000 (331776.)
宿主=UnPackMe 00400000
区段=CODE
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
下断...SHIFT+f9来到OEP....
(当然用这种方法...我用到看雪里的OD就断不下来还不知道怎么回事..)
0045159C55 push ebp; shell32.#599
0045159D8BEC mov ebp,esp
0045159F83C4 F0add esp,-10
004515A2B8 BC134500mov eax,UnPackMe.004513BC
004515A7E8 8846FBFFcall UnPackMe.00405C34
004515ACA1 E02F4500mov eax,dword ptr ds:[452FE0]
004515B18B00 mov eax,dword ptr ds:[eax]
004515B3E8 F8E5FFFFcall UnPackMe.0044FBB0


直接脱壳后不能运行的(早就想到了),不看不知道,一看吓一跳..指针全部无效的.......
[s:17] ,我就随便找了一个指针......0005512C..然后下断,,在OEP也下个断..
重载程序.....shift+f9几次(我这儿3次吧,中间省略一些步骤,,,,,,,,,,)...
然后来到这里后改为
004683348B7C24 04mov edi,dword ptr ss:[esp+4]
00468338893C8A mov dword ptr ds:[edx+ecx*4],edi???????????改为EAX
0046833B807F 05 55 cmp byte ptr ds:[edi+5],55
0046833F73 0Cjnb short UnPackMe.0046834D

看下面的
0045512C00000000
004551307C9210EDntdll.RtlLeaveCriticalSection
004551347C921005ntdll.RtlEnterCriticalSection
004551387C809EF1kernel32.InitializeCriticalSection
0045513C7C809AE4kernel32.VirtualFree
004551407C809A51kernel32.VirtualAlloc
004551447C80992Fkernel32.LocalFree
004551487C80998Dkernel32.LocalAlloc
0045514C7C8111DAkernel32.GetVersion
004551507C809728kernel32.GetCurrentThreadId
004551547C80977Akernel32.InterlockedDecrement.........................


OK了.....应该不用修复吧.........(不过到我这儿还有个小问题....虽然可以运行程序,但是关闭的时候会弹出个什么框,说是什么遇到问题要关闭什么的................,我就只能到这儿了,这期结束后,等待其它人指点......)
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 01:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表