小生我怕怕 发表于 2008-10-9 00:29

脱壳练习九之CRYPToCRACk's PE Protector

00468000 >5Bpop ebx//OD载入
0046800181E3 00FFFFFF and ebx,FFFFFF00 //打开内存镜像ait+m
0046800766:813B 4D5Acmp word ptr ds:,5A4D
0046800C75 33 jnz short UnPackMe.00468041
0046800E8BF3mov esi,ebx
004680100373 3C add esi,dword ptr ds:
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 24 //在此下f2访问中断
地址=00460000//接着shift+f9运行
大小=00008000 (32768.)
物主=UnPackMe 00400000
区段=.rsrc
包含=resources
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C9322DD66:8B50 0Cmov dx,word ptr ds: //程序停在这里
7C9322E166:8955 B4mov word ptr ss:,dx//在次ait+m打开内存镜像
7C9322E58D70 10 lea esi,dword ptr ds:
7C9322E88975 94 mov dword ptr ss:,esi
7C9322EB8B55 0C mov edx,dword ptr ss:
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 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:
004515B18B00mov eax,dword ptr ds:
━━━━━━━━━━━━━━━━━━━━━━━━━━
这里我们可以选择打开原加壳程序选择等级3修复即可寻找回所有的指针,也可以修复到程序运行
但是这里我们来讲解下如何去处理这个程序的magic jump,下面我们来寻找一下我们的magic jump
ctrl+f2从新加载一下程序,下面大家跟着分析走吧
━━━━━━━━━━━━━━━━━━━━━━━━━━
00468000 >5Bpop ebx //在一次OD载入程序停在这里
0046800181E3 00FFFFFF and ebx,FFFFFF00//ait+m打开内存镜像
0046800766:813B 4D5Acmp word ptr ds:,5A4D
0046800C75 33 jnz short UnPackMe.00468041
0046800E8BF3mov esi,ebx
004680100373 3C add esi,dword ptr ds:
━━━━━━━━━━━━━━━━━━━━━━━━━━
内存映射,项目 23 //在此设置f2访问中断
地址=0045A000//接着shift+f9运行程序
大小=00006000 (24576.)
物主=UnPackMe 00400000
区段=.reloc
类型=Imag 01001002
访问=R
初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
00468232300431xor byte ptr ds:,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: //在此F4运行到所选
0046825485FFtest edi,edi
0046825674 13 je short UnPackMe.0046826B
004682588BC3mov eax,ebx
0046825A03C7add eax,edi
0046825C8378 08 00cmp dword ptr ds:,0
0046826074 09 je short UnPackMe.0046826B
004682628B40 08 mov eax,dword ptr ds:
00468265C700 00000000 mov dword ptr ds:,0
0046826BE8 01000000 call UnPackMe.00468271//这个是远CALL我们F7跟进
00468270E8 81042414 call 146A86F6
━━━━━━━━━━━━━━━━━━━━━━━━━━
00468271810424 14010000 add dword ptr ss:,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:,3C//程序来到这里
004682D28D7C03 02 lea edi,dword ptr ds: //单步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://继续开始F8单步跟
0046830A55push ebp //此时开始注意寄存器窗口的指针
0046830BFF5424 20 call dword ptr ss:
━━━━━━━━━━━━━━━━━━━━━━━━━━
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:,edi//大家注意这里此时我们的指针是在EAX
0046833B807F 05 55cmp byte ptr ds:,55//这里开始给 EDI 赋值
0046833F73 0C jnb short UnPackMe.0046834D //赋值成功则跳转实现
004683412B47 01 sub eax,dword ptr ds:
00468344C747 05 8104240>mov dword ptr ds:,240481
0046834BEB 1E jmp short UnPackMe.0046836B
0046834D807F 05 AAcmp byte ptr ds:,0AA//此处也同样在给EDI赋值
0046835173 0E jnb short UnPackMe.00468361//赋值成功则跳转不实现,即开始加密
00468353F7D8neg eax//这里即加密语句,把加密指针补回给EAX
004683550347 01 add eax,dword ptr ds: //即把积存器里EAX指针加密
00468358C747 05 812C240>mov dword ptr ds:,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:,edi//即把此处的mov dword ptr ds:,edi后面的EDI改为EAX
0046833B807F 05 55cmp byte ptr ds:,55//修改后,我们在次打开内存镜象ait+m
0046833F73 0C jnb short UnPackMe.0046834D
004683412B47 01 sub eax,dword ptr ds:
00468344C747 05 8104240>mov dword ptr ds:,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: //程序停在此处
7C9322E166:8955 B4mov word ptr ss:,dx//在此ait+m打开内存镜像
7C9322E58D70 10 lea esi,dword ptr ds:
7C9322E88975 94 mov dword ptr ss:,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:
004515B18B00mov eax,dword ptr ds:
004515B3E8 F8E5FFFF call UnPackMe.0044FBB0
004515B8A1 E02F4500 mov eax,dword ptr ds:
━━━━━━━━━━━━━━━━━━━━━━━━━━
为了方便二进制复制下程序的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插件脱壳**** Hidden Message *****

fenty7895 发表于 2008-10-9 00:55

很详细的脱文.学习了.
还有隐藏的内容?

tianzhihuan 发表于 2008-10-9 01:11

隐藏的什么?~~~板凳先占了```

qq513701092 发表于 2008-10-9 11:00

小生的脱文好详细
学习到很多了!!!

unpack 发表于 2008-10-9 12:40

o(∩_∩)o...什么动画 挖了看看

zeger 发表于 2008-10-9 13:05

庞大,学习!!!
凑够文字。。。

夜冷风 发表于 2008-10-9 13:12

学习下!!

小糊涂虫 发表于 2008-10-9 13:28

学习来了..............

ndrcz 发表于 2008-10-9 13:37

谢谢分享很详细的脱文

傻人有傻福 发表于 2008-10-9 13:38

看看动画了
页: [1] 2 3 4 5 6
查看完整版本: 脱壳练习九之CRYPToCRACk's PE Protector