吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17942|回复: 19
收起左侧

[原创] 吾爱破解脱壳练习----Armadillo 6.04

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

12.本期看点:本期学会合理惯通所学知识,用所学套路进行套用,掌握常见壳的基础知识


本次群内部大整顿,如果出现有误踢的朋友,我在这里说声对不起,请你论坛短消息我,我会把你加回去的

练习一:(结果已经公布)
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

练习九:(结果已经公布)
http://www.52pojie.cn/thread-11446-1-1.html
最佳分析: 第1楼小生我怕怕

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

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

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

练习十三:(结果已经公布)
http://www.52pojie.cn/thread-12011-1-1.html
最佳分析:第1楼小生我怕怕

UnPackMe.rar

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

免费评分

参与人数 1热心值 +1 收起 理由
min-gong + 1 谢谢@Thanks!

查看全部评分

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

 楼主| 小生我怕怕 发表于 2008-10-17 03:44
首先设置忽略所有的异常选项,隐藏好OD,下面开始我们漫长而痛苦的旅途
以下均需要在原版OD中完成
━━━━━━━━━━━━━━━━━━━━━━━━━━

00444000 > $ 60 PUSHAD//OD载入我们停在这里
00444001 . E8 00000000CALL UnPackMe.00444006//在命令行下段: bp OpenMutexA
00444006 $ 5D POP EBP //检查下好段后 shift+f9运行程序
00444007 . 50 PUSH EAX
00444008 . 51 PUSH ECX
00444009 . 0FCA BSWAP EDX
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C80EA1B > 8BFF MOV EDI,EDI //程序停在了这里
7C80EA1D 55 PUSH EBP//此时我们ctrl+b搜索 5D C2 10 00 90 90 90 90 90
7C80EA1E 8BEC MOV EBP,ESP
7C80EA20 51 PUSH ECX
7C80EA21 51 PUSH ECX
7C80EA22 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
7C80EA26 56 PUSH ESI
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801AE8 5D POP EBP
7C801AE9 C2 1000RETN 10 //我们F2在这个retn处下断
7C801AEC 90 NOP //我们ait+b取消我们下的bp OpenMutexA断点
7C801AED 90 NOP //紧跟着我们shift+f9
7C801AEE 90 NOP
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801AE9 C2 1000RETN 10 //此时我们的程序停在了这里,同时取消断点
7C801AEC 90 NOP //此时我们ctrl+b搜索 5E C9 C2 18 00
7C801AED 90 NOP
7C801AEE 90 NOP
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C8094B1 5E POP ESI
7C8094B2 C9 LEAVE //我们在此F2下断
7C8094B3 C2 1800RETN 18 //紧跟着shift+f9运行
7C8094B6 FF75 14PUSH DWORD PTR SS:[EBP+14]//程序停下后我们取消断点
7C8094B9 8D45 C0LEA EAX,DWORD PTR SS:[EBP-40] //我们ctrl+b搜索 5D C2 04 00 64 A1 18 00 00 00 8B 40 30
7C8094BC 50 PUSH EAX//切记不要钩选 整个段块
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C80B6BB E8 7D2D0000CALL kernel32.GetModuleHandleW//我们此此来到了这里
7C80B6C0 5D POP EBP
7C80B6C1 C2 0400RETN 4//在此F2下断
7C80B6C4 64:A1 18000000 MOV EAX,DWORD PTR FS:[18] //我们shift+f9运行4次
7C80B6CA 8B40 30MOV EAX,DWORD PTR DS:[EAX+30] //我们ait+f9返回到用户代码
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B6A991 8B55 F4MOV EDX,DWORD PTR SS:[EBP-C]//我们返回到了这里
00B6A994 8B0D 3C30BC00MOV ECX,DWORD PTR DS:[BC303C] //我们开始搜索magic jump
00B6A99A 890491 MOV DWORD PTR DS:[ECX+EDX*4],EAX
00B6A99D 8B55 F4MOV EDX,DWORD PTR SS:[EBP-C]
00B6A9A0 A1 3C30BC00MOV EAX,DWORD PTR DS:[BC303C]
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B6AA13 75 05JNZ SHORT 00B6AA1A//这里即是magic jump
00B6AA15^E9 EFFEFFFFJMP 00B6A909//如果上面的JNZ跳啦,就直接跳向IAT加密执行循环处理
00B6AA1A C785 BCFEFFFF 00>MOV DWORD PTR SS:[EBP-144],0//如果JNZ不跳那么就不会进行加密处理
00B6AA24 C785 C0FEFFFF 00>MOV DWORD PTR SS:[EBP-140],0//我们改好magic jump后一直向下拉
00B6AA2E 8B4D F8MOV ECX,DWORD PTR SS:[EBP-8]
00B6AA31 8B51 04MOV EDX,DWORD PTR DS:[ECX+4]
00B6AA34 8995 C4FEFFFFMOV DWORD PTR SS:[EBP-13C],EDX
00B6AA3A EB 0FJMP SHORT 00B6AA4B
00B6AA3C 8B85 C4FEFFFFMOV EAX,DWORD PTR SS:[EBP-13C] //我们走到这里时开始注意
00B6AA42 83C0 0CADD EAX,0C
00B6AA45 8985 C4FEFFFFMOV DWORD PTR SS:[EBP-13C],EAX
00B6AA4B 8B8D C4FEFFFFMOV ECX,DWORD PTR SS:[EBP-13C]
00B6AA51 8339 00CMP DWORD PTR DS:[ECX],0
00B6AA54 74 11JE SHORT 00B6AA67
00B6AA56 8B95 C0FEFFFFMOV EDX,DWORD PTR SS:[EBP-140]
00B6AA5C 83C2 01ADD EDX,1
00B6AA5F 8995 C0FEFFFFMOV DWORD PTR SS:[EBP-140],EDX //而此时EDX的值不段的累加,即处理我们的IAT指针
00B6AA65^EB D5JMP SHORT 00B6AA3C //这里不断的向上跳
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B6AC86 33348A XOR ESI,DWORD PTR DS:[EDX+ECX*4]
00B6AC89 8B45 F4MOV EAX,DWORD PTR SS:[EBP-C]
00B6AC8C 8B0D 3C30BC00MOV ECX,DWORD PTR DS:[BC303C]
00B6AC92 893481 MOV DWORD PTR DS:[ECX+EAX*4],ESI
00B6AC95^E9 6FFCFFFFJMP 00B6A909 //一直拉到这个位置,跳过了上面的IAT加密
00B6AC9A EB 03JMP SHORT 00B6AC9F //我们在这里F2下断,shitf+f9运行到这里
00B6AC9C D6 SALC //此时我们在向上去我们修改magic jump处把他还原
00B6AC9D D6 SALC //还原的目的是避免壳检测
00B6AC9E 8F ???//我们ait+m打开内存镜像
00B6AC9F 8B15 9CA1BC00MOV EDX,DWORD PTR DS:[BCA19C]
00B6ACA5 8995 B4FDFFFFMOV DWORD PTR SS:[EBP-24C],EDX
00B6ACAB 83BD B4FDFFFF 00 CMP DWORD PTR SS:[EBP-24C],0
━━━━━━━━━━━━━━━━━━━━━━━━━━
Memory map, item 23//我们在此F2下断,shift+f9运行
Address=00401000
Size=00001000 (4096.)
Owner=UnPackMe 00400000
Section=.text
Type=Imag 01001002
Access=R
Initial access=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B931AC8B11mov edx,dword ptr ds:[ecx] //程序停在这里
00B931AE8955 FC mov dword ptr ss:[ebp-4],edx //开始疯狂的F8单步走被
00B931B1B8 25000000 mov eax,25
00B931B6C1E0 02 shl eax,2
00B931B98B0D 2C0BBC00 mov ecx,dword ptr ds:[BC0B2C]; UnPackMe.00454380
00B931BF8B1401mov edx,dword ptr ds:[ecx+eax]
00B931C23355 FC xor edx,dword ptr ss:[ebp-4]
00B931C5B8 25000000 mov eax,25
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B931F95Epop esi //通过下面这个retn处返回
00B931FA8BE5mov esp,ebp
00B931FC5Dpop ebp
00B931FDC3retn//到此返回到另外一段代码
00B931FECCint3
00B931FFCCint3
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B985A183C4 04 add esp,4 //我们返回到此
00B985A4C745 FC FEFFFFF>mov dword ptr ss:[ebp-4],-2 //继续F8疯狂的走起
00B985ABEB 34 jmp short 00B985E1//这个JMP向下跳,一直走
00B985AD8B45 EC mov eax,dword ptr ss:[ebp-14]
00B985B08B08mov ecx,dword ptr ds:[eax]
00B985B28B11mov edx,dword ptr ds:[ecx]
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B985EB59pop ecx //JMP跳来了这里
00B985EC5Fpop edi
00B985ED5Epop esi
00B985EE5Bpop ebx
00B985EF8BE5mov esp,ebp
00B985F15Dpop ebp
00B985F2C3retn//通过这个RETN处返回
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B9302583C4 08 add esp,8 //继续F8单步向前冲
00B930288B15 440BBC00 mov edx,dword ptr ds:[BC0B44]; UnPackMe.00400000
00B9302E8955 E4 mov dword ptr ss:[ebp-1C],edx
00B93031B8 0A000000 mov eax,0A
00B93036C1E0 02 shl eax,2
━━━━━━━━━━━━━━━━━━━━━━━━━━
00B930D88B45 08 mov eax,dword ptr ss:[ebp+8]//到达这里时放慢脚步
00B930DB8B48 0C mov ecx,dword ptr ds:[eax+C]
00B930DE51push ecx
00B930DF8B55 F4 mov edx,dword ptr ss:[ebp-C]
00B930E22B55 DC sub edx,dword ptr ss:[ebp-24]
00B930E5FFD2call edx//这里F7跟进就是我们的OEP啦
00B930E78945 FC mov dword ptr ss:[ebp-4],eax//到上面CALL时注意寄存器或者信息窗口就可以啦
00B930EA8B45 FC mov eax,dword ptr ss:[ebp-4]
━━━━━━━━━━━━━━━━━━━━━━━━━━
00401700 55 PUSH EBP//到达OEP,运行lordPE脱壳
00401701 8BEC MOV EBP,ESP //在运行impoRCE修复
00401703 6A FFPUSH -1
00401705 68 00254000PUSH UnPackMe.00402500
0040170A 68 86184000PUSH UnPackMe.00401886 ; JMP to msvcrt._except_handler3
0040170F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00401715 50 PUSH EAX
00401716 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
0040171D 83EC 68SUB ESP,68
00401720 53 PUSH EBX

Unpack_.rar

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

yunfeng 发表于 2008-10-17 07:12
小生我怕怕现在加壳的难度开始加大了,这个较高版本的壳,我还没有脱过,决定试一下。
首先运行程序,打开任务管理器,发现只有一个进程,基本确定为单线程
OD载入,忽略所有异常,隐藏OD
00444000 >60pushad
00444001E8 00000000 call UnPackMe.00444006
004440065Dpop ebp
0044400750push eax
0044400851push ecx
004440090FCAbswap edx
0044400BF7D2not edx
0044400D9Cpushfd
0044400EF7D2not edx
004440100FCAbswap edx
00444012EB 0F jmp short UnPackMe.00444023
bp GetModuleHandleA+5
shift+F9 直到出现如下信息
00129134|00B6A991返回到 00B6A991 来自 kernel32.GetModuleHandleA
00129138|001292B0ASCII "kernel32.dll"
0012913C|00000000
00129140|00454380UnPackMe.00454380

取消断点 alf+F9 返回
00B6A9F5FF15 8830BB00 call dword ptr ds:[BB3088] ; kernel32.LoadLibraryA
00B6A9FB8B55 F4 mov edx,dword ptr ss:[ebp-C]
00B6A9FE8B0D 3C30BC00 mov ecx,dword ptr ds:[BC303C]
00B6AA04890491mov dword ptr ds:[ecx+edx*4],eax
00B6AA078B55 F4 mov edx,dword ptr ss:[ebp-C]
00B6AA0AA1 3C30BC00 mov eax,dword ptr ds:[BC303C]
00B6AA0F833C90 00 cmp dword ptr ds:[eax+edx*4],0
00B6AA1375 05 jnz short 00B6AA1A;大侠所讲的 magic jump nop掉
CTRL+B 搜索 EB 03 D6 D6
00B6AC95^\E9 6FFCFFFF jmp 00B6A909
00B6AC9AEB 03 jmp short 00B6AC9F
00B6AC9CD6salc
00B6AC9DD6salc

下硬件执行断点 Shift+F9删除断点
再将上面nop地方恢复

寻找OEP

BP CreateThread
Shift+F9 取消断点ALT+F9

00B7614C50push eax
00B7614DFF15 9032BB00 call dword ptr ds:[BB3290] ; kernel32.CloseHandle
00B761535Epop esi
00B761545Bpop ebx
00B761558BE5mov esp,ebp
00B761575Dpop ebp
00B76158C3retn
F8 一路向下
00B930D88B45 08 mov eax,dword ptr ss:[ebp+8]
00B930DB8B48 0C mov ecx,dword ptr ds:[eax+C]
00B930DE51push ecx
00B930DF8B55 F4 mov edx,dword ptr ss:[ebp-C]
00B930E22B55 DC sub edx,dword ptr ss:[ebp-24]
00B930E5FFD2call edx; UnPackMe.00401700这里就是我们要找的OEP
00B930E78945 FC mov dword ptr ss:[ebp-4],eax
00B930EA8B45 FC mov eax,dword ptr ss:[ebp-4]
F7进去看一看
0040170055push ebp
004017018BECmov ebp,esp
004017036A FF push -1
0040170568 00254000 push UnPackMe.00402500
0040170A68 86184000 push UnPackMe.00401886 ; jmp 到 msvcrt._except_handler3
0040170F64:A1 00000000mov eax,dword ptr fs:[0]
0040171550push eax
0040171664:8925 0000000>mov dword ptr fs:[0],esp
0040171D83EC 68 sub esp,68
0040172053push ebx
0040172156push esi
0040172257push edi
004017238965 E8 mov dword ptr ss:[ebp-18],esp
0040172633DBxor ebx,ebx
00401728895D FC mov dword ptr ss:[ebp-4],ebx
0040172B6A 02 push 2
0040172DFF15 90214000 call dword ptr ds:[402190]; msvcrt.__set_app_type
LordPE dump进程

ImportREC 输入OEP 1700 获取输入表

剪切无效函数就可以运行了
脱壳运行正常,知道这是ARM的最小保护
lqiulu 发表于 2008-10-17 08:28
Armadillo Find Protected V1.8查壳,如下:
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Standard protection or Minimum protection
!- <Backup Key Options>
No Registry Keys at All
!- <Compression Options>
Better/Slower Compression
!- <Other Options>
487FDD00 Version 6.04 18-07-2008
!- Elapsed Time 00h 00m 00s 328ms

单进程标准壳。

两种方法脱壳

第一种方法:使用断点
bp VirtualProtect
bp CreateThread

首先bp 下断VirtualProtect ,处理iat加密。shift+f9运行,注意寄存器eax。
运行七次。当一个大的缓冲,且ecx值为00401000时,取消断点返回

00B8CC8C 8B8D C8D5FFFF MOV ECX,DWORD PTR SS:[EBP-2A38]
00B8CC92 51PUSH ECX
00B8CC93 8B95 C4D5FFFF MOV EDX,DWORD PTR SS:[EBP-2A3C]
00B8CC99 52PUSH EDX
00B8CC9A 8B85 74D8FFFF MOV EAX,DWORD PTR SS:[EBP-278C]
00B8CCA0 0385 C0D5FFFF ADD EAX,DWORD PTR SS:[EBP-2A40]

ctrl + f查找。“push 100




查到这里:
00B42EC0 55 PUSH EBP //这里改为retn
00B42EC1 8BEC MOV EBP,ESP
00B42EC3 83EC 2CSUB ESP,2C
00B42EC6 833D 20F6BB00 00 CMP DWORD PTR DS:[BBF620],0
00B42ECD 75 59JNZ SHORT 00B42F28
00B42ECF C745 EC 13004BBA MOV DWORD PTR SS:[EBP-14],BA4B00>
00B42ED6 68 00010000PUSH 100 //找到这里。将段首改为retn。

接着再下第二个断点:bp CreateThread shift+f9运行。

7C8106C7 > 8BFF MOV EDI,EDI //断在这里,alt+f9返回
7C8106C9 55 PUSH EBP
7C8106CA 8BEC MOV EBP,ESP
7C8106CC FF75 1CPUSH DWORD PTR SS:[EBP+1C]
--------------------------------------------------------------------------------------
00B7614C 50PUSH EAX //返回到这里,单步走
00B7614D FF15 9032BB00 CALL DWORD PTR DS:[BB3290] ; kernel32.CloseHandle
00B76153 5EPOP ESI
00B76154 5BPOP EBX
00B76155 8BE5MOV ESP,EBP
---------------------------------------------------------------------------------------
00B93057 8975 F4 MOV DWORD PTR SS:[EBP-C],ESI
00B9305A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00B9305D 8338 00 CMP DWORD PTR DS:[EAX],0
00B93060 75 40 JNZ SHORT 00B930A2
00B93062 8B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B93068 8B15 2C0BBC00 MOV EDX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B9306E 8B41 6C MOV EAX,DWORD PTR DS:[ECX+6C]
00B93071 3342 3C XOR EAX,DWORD PTR DS:[EDX+3C]
00B93074 8B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B9307A 3341 78 XOR EAX,DWORD PTR DS:[ECX+78]
00B9307D 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX
00B93080 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00B93083 8B42 18 MOV EAX,DWORD PTR DS:[EDX+18]
00B93086 50PUSH EAX
00B93087 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00B9308A 8B51 14 MOV EDX,DWORD PTR DS:[ECX+14]
00B9308D 52PUSH EDX
00B9308E 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00B93091 8B48 10 MOV ECX,DWORD PTR DS:[EAX+10]
00B93094 51PUSH ECX
00B93095 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B93098 2B55 E0 SUB EDX,DWORD PTR SS:[EBP-20]
00B9309B FFD2CALL EDX
00B9309D 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00B930A0 EB 48 JMP SHORT 00B930EA
00B930A2 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00B930A5 8338 01 CMP DWORD PTR DS:[EAX],1
00B930A8 75 40 JNZ SHORT 00B930EA
00B930AA 8B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B930B0 8B15 2C0BBC00 MOV EDX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B930B6 8B41 6C MOV EAX,DWORD PTR DS:[ECX+6C]
00B930B9 3342 3C XOR EAX,DWORD PTR DS:[EDX+3C]
00B930BC 8B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B930C2 3341 78 XOR EAX,DWORD PTR DS:[ECX+78]
00B930C5 8945 DC MOV DWORD PTR SS:[EBP-24],EAX
00B930C8 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00B930CB 8B42 04 MOV EAX,DWORD PTR DS:[EDX+4]
00B930CE 50 PUSH EAX
00B930CF 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00B930D2 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
00B930D5 52PUSH EDX
00B930D6 6A 00 PUSH 0
00B930D8 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00B930DB 8B48 0C MOV ECX,DWORD PTR DS:[EAX+C]
00B930DE 51PUSH ECX
00B930DF 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B930E2 2B55 DC SUB EDX,DWORD PTR SS:[EBP-24]
00B930E5 FFD2CALL EDX //F7进入,这里就跳到OEP了。
00B930E7 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00B930EA 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00B930ED 5EPOP ESI
00B930EE 8BE5MOV ESP,EBP
00B930F0 5DPOP EBP
00B930F1 C3RETN
----------------------------------------------------------------------------------------
00401700 55 PUSH EBP //这里就是程序的OEP。dump吧。
00401701 8BEC MOV EBP,ESP
00401703 6A FFPUSH -1
00401705 68 00254000PUSH UnPackMe.00402500
0040170A 68 86184000PUSH UnPackMe.00401886 ; JMP to msvcrt._except_handler3
0040170F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00401715 50 PUSH EAX
00401716 64:89250000000 MOV DWORD PTR FS:[0],ESP


第二种方法:使用常规断点:
bp GetModuleHandleA+9
bp CreateThread

首先bp GetModuleHandleA+9 下断,处理iat加密。shift+f9运行,注意堆栈。
运行N次。找返回时机。当堆栈中出现如下,马上就到返回时机了。

001293E4 /0012EB40
001293E8 |00B88683 RETURN to 00B88683 from kernel32.GetModuleHandleA
001293EC |00BB514C ASCII "kernel32.dll"
001293F0 |00BB6D64 ASCII "VirtualFree"
001293F4 |0EF6D207
001293F8 |00454380 UnPackMe.00454380

再运行一次:寄存器为如下:这就是返回时机,ALT+F9返回。

EAX 001292B0 ASCII "kernel32.dll"
ECX 001292B0 ASCII "kernel32.dll"
EDX 00000000
EBX 00000001
ESP 00129130
EBP 00129130
ESI 00454380 UnPackMe.00454380
EDI 00000000
EIP 7C80B73A kernel32.7C80B73A

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

00B6A991 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] //返回到这里。
00B6A994 8B0D 3C30BC00 MOV ECX,DWORD PTR DS:[BC303C]
00B6A99A 890491MOV DWORD PTR DS:[ECX+EDX*4],EAX
00B6A99D 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B6A9A0 A1 3C30BC00 MOV EAX,DWORD PTR DS:[BC303C]
00B6A9A5 833C90 00 CMP DWORD PTR DS:[EAX+EDX*4],0
00B6A9A9 75 5C JNZ SHORT 00B6AA07
00B6A9AB 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00B6A9AE 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
00B6A9B1 83E2 02 AND EDX,2
00B6A9B4 74 38 JE SHORT 00B6A9EE
00B6A9B6 B8 1C000000 MOV EAX,1C
00B6A9BB C1E0 02 SHL EAX,2
00B6A9BE 8B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B6A9C4 8B15 2C0BBC00 MOV EDX,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B6A9CA 8B35 2C0BBC00 MOV ESI,DWORD PTR DS:[BC0B2C] ; UnPackMe.00454380
00B6A9D0 8B5E 48 MOV EBX,DWORD PTR DS:[ESI+48]
00B6A9D3 335A 3C XOR EBX,DWORD PTR DS:[EDX+3C]
00B6A9D6 331C01XOR EBX,DWORD PTR DS:[ECX+EAX]
00B6A9D9 83E3 10 AND EBX,10
00B6A9DC F7DBNEG EBX
00B6A9DE 1BDBSBB EBX,EBX
00B6A9E0 F7DBNEG EBX
00B6A9E2 0FB6C3MOVZX EAX,BL
00B6A9E5 85C0TEST EAX,EAX
00B6A9E7 75 05 JNZ SHORT 00B6A9EE
00B6A9E9 ^ E9 1BFFFFFF JMP 00B6A909
00B6A9EE 8D8D C8FEFFFF LEA ECX,DWORD PTR SS:[EBP-138]
00B6A9F4 51PUSH ECX
00B6A9F5 FF15 8830BB00 CALL DWORD PTR DS:[BB3088] ; kernel32.LoadLibraryA
00B6A9FB 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B6A9FE 8B0D 3C30BC00 MOV ECX,DWORD PTR DS:[BC303C]
00B6AA04 890491MOV DWORD PTR DS:[ECX+EDX*4],EAX
00B6AA07 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B6AA0A A1 3C30BC00 MOV EAX,DWORD PTR DS:[BC303C]
00B6AA0F 833C90 00 CMP DWORD PTR DS:[EAX+EDX*4],0
00B6AA13 75 05 JNZ SHORT 00B6AA1A //magic jmp NOP掉
00B6AA15 ^ E9 EFFEFFFF JMP 00B6A909
00B6AA1A C785 BCFEFFFF>MOV DWORD PTR SS:[EBP-144],0
00B6AA24 C785 C0FEFFFF>MOV DWORD PTR SS:[EBP-140],0
00B6AA2E 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00B6AA31 8B51 04 MOV EDX,DWORD PTR DS:[ECX+4]
00B6AA34 8995 C4FEFFFF MOV DWORD PTR SS:[EBP-13C],EDX
00B6AA3A EB 0F JMP SHORT 00B6AA4B
00B6AA3C 8B85 C4FEFFFF MOV EAX,DWORD PTR SS:[EBP-13C]
00B6AA42 83C0 0C ADD EAX,0C
00B6AA45 8985 C4FEFFFF MOV DWORD PTR SS:[EBP-13C],EAX
00B6AA4B 8B8D C4FEFFFF MOV ECX,DWORD PTR SS:[EBP-13C]
00B6AA51 8339 00 CMP DWORD PTR DS:[ECX],0
00B6AA54 74 11 JE SHORT 00B6AA67
00B6AA56 8B95 C0FEFFFF MOV EDX,DWORD PTR SS:[EBP-140]
00B6AA5C 83C2 01 ADD EDX,1
00B6AA5F 8995 C0FEFFFF MOV DWORD PTR SS:[EBP-140],EDX
00B6AA65 ^ EB D5 JMP SHORT 00B6AA3C
00B6AA67 33C9XOR ECX,ECX

向下拉,到这里

00B6AC9A /EB 03 JMP SHORT 00B6AC9F //下断,运行到这里时返回修复修改的magic jmp 代码。
00B6AC9C |D6 SALC
00B6AC9D |D6 SALC
00B6AC9E |8F ??? ; Unknown command
00B6AC9F \8B15 9CA1BC00 MOV EDX,DWORD PTR DS:[BCA19C]

下面再下断点bp CreateThread
剩下的与方法一一样。



unp2_.rar
wesley 发表于 2008-10-17 10:07
因为是最低保护

OD载入 直接下he GetModuleHandleA+5(该壳对断点较敏感)
shift+F9
直到在堆栈窗口
001293E4/0012EB40
001293E8|00C98683返回到 00C98683 来自 kernel32.GetModuleHandleA
001293EC|00CC514CASCII "kernel32.dll"
001293F0|00CC6D64ASCII "VirtualFree"
001293F4|0EF6D207
001293F8|00454380UnPack.00454380

再按一次shift+F9
堆栈中出现
00129130/001293E8
00129134|00C7A991返回到 00C7A991 来自 kernel32.GetModuleHandleA
00129138|001292B0ASCII "kernel32.dll"
0012913C|00000000
00129140|00454380UnPack.00454380

ALT+F9返回并取消硬件断点

00C7A9E7 /75 05 jnz short 00C7A9EE
00C7A9E9^|E9 1BFFFFFF jmp 00C7A909
00C7A9EE \8D8D C8FEFFFF lea ecx,dword ptr ss:[ebp-138]
00C7A9F451push ecx
00C7A9F5FF15 8830CC00 call dword ptr ds:[CC3088]kernel32.LoadLibraryA
00C7A9FB8B55 F4 mov edx,dword ptr ss:[ebp-C]
00C7A9FE8B0D 3C30CD00 mov ecx,dword ptr ds:[CD303C]
00C7AA04890491mov dword ptr ds:[ecx+edx*4],eax
00C7AA078B55 F4 mov edx,dword ptr ss:[ebp-C]
00C7AA0AA1 3C30CD00 mov eax,dword ptr ds:[CD303C]
00C7AA0F833C90 00 cmp dword ptr ds:[eax+edx*4],0
00C7AA1375 05 jnz short 00C7AA1A 此处即为magic jump直接NOP掉
00C7AA15^ E9 EFFEFFFF jmp 00C7A909
00C7AA1AC785 BCFEFFFF 0>mov dword ptr ss:[ebp-144],0
00C7AA24C785 C0FEFFFF 0>mov dword ptr ss:[ebp-140],0
00C7AA2E8B4D F8 mov ecx,dword ptr ss:[ebp-8]

往下看代码
00C7AC8633348Axor esi,dword ptr ds:[edx+ecx*4]
00C7AC898B45 F4 mov eax,dword ptr ss:[ebp-C]
00C7AC8C8B0D 3C30CD00 mov ecx,dword ptr ds:[CD303C]
00C7AC92893481mov dword ptr ds:[ecx+eax*4],esi
00C7AC95^ E9 6FFCFFFF jmp 00C7A909
00C7AC9AEB 03 jmp short 00C7AC9F 在此下F2并运行然后取消断点并把上面magic jump修改的代码还原(以防壳检测)
00C7AC9CD6salc
00C7AC9DD6salc
00C7AC9E8F??? ; 未知命令
00C7AC9F8B15 9CA1CD00 mov edx,dword ptr ds:[CDA19C]

OK
打开内存窗口在00401000下F2
然后shift+f9运行
接着一直F8单步
00CA30DF8B55 F4 mov edx,dword ptr ss:[ebp-C]
00CA30E22B55 DC sub edx,dword ptr ss:[ebp-24]
00CA30E5FFD2call edx 飞向光明 F7跟入 OEP到啦
00CA30E78945 FC mov dword ptr ss:[ebp-4],eax
00CA30EA8B45 FC mov eax,dword ptr ss:[ebp-4]

由于是最低保护 所以穿山甲的各个版本效果都差不多 原理也几乎一样
没有偷代码 直接操起ImportREC修复 剪切无效的几个指针
修复后程序成功运行。。。。啦啦啦
wesley 发表于 2008-10-17 10:10
///////////////////////////////////////////////////////////////Arrives oep place, only tests in this exerciseJust for fun!//Elects to neglect all exceptionally, carries out the script then////2008-10-18 11:04 by Wesley//Other :If you have any questions //Q me please,Thank you!QQ:263010823///////////////////////////////////////////////////////////var GetModuleHandleAvar VirtualAllocvar CreateThreadvar magicjumpvar OEPgpa "GetModuleHandleA", "kernel32.dll" mov GetModuleHandleA,$RESULTgpa "VirtualAlloc", "kernel32.dll" mov VirtualAlloc,$RESULTgpa "CreateThread", "kernel32.dll" mov CreateThread,$RESULTadd GetModuleHandleA,5bphws GetModuleHandleA,"x"//pausex:estocmp eax,VirtualAllocjne xestobphwc GetModuleHandleArtufind eip,#833C????7505#cmp $RESULT,0je erroradd $RESULT,4mov magicjump,$RESULTrepl magicjump, #7505#, #9090#, 2find eip,#EB03D6D68F#bp $RESULTestobc $RESULTrepl magicjump, #9090#, #7505#, 2bp CreateThreadestobc CreateThreadrturtrstofind eip,#51??????2B????FF??8?????8?#cmp $RESULT,0je erroradd $RESULT,7mov OEP,$RESULTbp OEPrunbc OEPsticmt eip,"<- OEP Arrived"msg "please dump it with lordpe and rebuild the IAT with ImportREC^_^ By Wesley"reterror:MSG "somthing must be Wrong! unrecognised version"
nv21 发表于 2008-10-17 16:10
OD载入
00444000 >60PUSHAD
00444001E8 00000000 CALL UnPackMe.00444006
004440065DPOP EBP
0044400750PUSH EAX
0044400851PUSH ECX
004440090FCABSWAP EDX
0044400BF7D2NOT EDX
0044400D9CPUSHFD
0044400EF7D2NOT EDX
004440100FCABSWAP EDX
00444012EB 0F JMP SHORT UnPackMe.00444023

下断点he GetModuleHandleA+5 SHIFT +F9运行一次程序出现异常 打开OD的选项
填加最近一次异常~!重载程序 下断点he GetModuleHandleA+5 SHIFT+F9一次到达
7C80B736837D 08 00CMP DWORD PTR SS:[EBP+8],0
7C80B73A74 18 JE SHORT kernel32.7C80B754
7C80B73CFF75 08 PUSH DWORD PTR SS:[EBP+8]
7C80B73FE8 C0290000 CALL kernel32.7C80E104
7C80B74485C0TEST EAX,EAX
7C80B74674 08 JE SHORT kernel32.7C80B750
7C80B748FF70 04 PUSH DWORD PTR DS:[EAX+4]
7C80B74BE8 7D2D0000 CALL kernel32.GetModuleHandleW
7C80B7505DPOP EBP

注意堆栈窗口SHIFT+F9一次
001293E4/0012EB40
001293E8|00B88665返回到 00B88665 来自 kernel32.GetModuleHandleA
001293EC|00BB514CASCII "kernel32.dll"
001293F0|00BB6D70ASCII "VirtualAlloc"
第二次
001293E4/0012EB40
001293E8|00B88683返回到 00B88683 来自 kernel32.GetModuleHandleA
001293EC|00BB514CASCII "kernel32.dll"
001293F0|00BB6D64ASCII "VirtualFree"

第三次
00129130/001293E8
00129134|00B6A991返回到 00B6A991 来自 kernel32.GetModuleHandleA
00129138|001292B0ASCII "kernel32.dll"

OK这里就是最佳的返回时机删除断点ALT+F9返回

00B6A9918B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B6A9948B0D 3C30BC00 MOV ECX,DWORD PTR DS:[BC303C]
00B6A99A890491MOV DWORD PTR DS:[ECX+EDX*4],EAX
00B6A99D8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B6A9A0A1 3C30BC00 MOV EAX,DWORD PTR DS:[BC303C]
00B6A9A5833C90 00 CMP DWORD PTR DS:[EAX+EDX*4],0
00B6A9A975 5C JNZ SHORT 00B6AA07
00B6A9AB8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00B6A9AE8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
00B6A9B183E2 02 AND EDX,2
00B6A9B474 38 JE SHORT 00B6A9EE
00B6A9B6B8 1C000000 MOV EAX,1C
00B6A9BBC1E0 02 SHL EAX,2
00B6A9BE8B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C]; UnPackMe.00454380
00B6A9C48B15 2C0BBC00 MOV EDX,DWORD PTR DS:[BC0B2C]; UnPackMe.00454380
00B6A9CA8B35 2C0BBC00 MOV ESI,DWORD PTR DS:[BC0B2C]; UnPackMe.00454380
00B6A9D08B5E 48 MOV EBX,DWORD PTR DS:[ESI+48]
00B6A9D3335A 3C XOR EBX,DWORD PTR DS:[EDX+3C]
00B6A9D6331C01XOR EBX,DWORD PTR DS:[ECX+EAX]
00B6A9D983E3 10 AND EBX,10
00B6A9DCF7DBNEG EBX
00B6A9DE1BDBSBB EBX,EBX
00B6A9E0F7DBNEG EBX
00B6A9E20FB6C3MOVZX EAX,BL
00B6A9E585C0TEST EAX,EAX
00B6A9E775 05 JNZ SHORT 00B6A9EE 00B6A9E9^ E9 1BFFFFFF JMP 00B6A909
00B6A9EE8D8D C8FEFFFF LEA ECX,DWORD PTR SS:[EBP-138]
00B6A9F451PUSH ECX
00B6A9F5FF15 8830BB00 CALL DWORD PTR DS:[BB3088] ; kernel32.LoadLibraryA
00B6A9FB8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B6A9FE8B0D 3C30BC00 MOV ECX,DWORD PTR DS:[BC303C]
00B6AA04890491MOV DWORD PTR DS:[ECX+EDX*4],EAX
00B6AA078B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B6AA0AA1 3C30BC00 MOV EAX,DWORD PTR DS:[BC303C]
00B6AA0F833C90 00 CMP DWORD PTR DS:[EAX+EDX*4],0
00B6AA1375 05 JNZ SHORT 00B6AA1A----------这个就是传说中的MAGEC JUMP
把它NOP掉 原因就是这个跳转在kernel32.LoadLibraryA的下面它是控制它下面的跳转是否能够实现的~!所以 可以认为下面的JMP为MAGEC JUMP

开始改过这里但是到OEP之后要把这里改回来前几次失败就是因为到了OEP之后没改所以失败 浪费了好多时间~!!!!!!!
00B6AA15^ E9 EFFEFFFF JMP 00B6A909
00B6AA1AC785 BCFEFFFF 0>MOV DWORD PTR SS:[EBP-144],0
00B6AA24C785 C0FEFFFF 0>MOV DWORD PTR SS:[EBP-140],0
00B6AA2E8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00B6AA318B51 04 MOV EDX,DWORD PTR DS:[ECX+4]
00B6AA348995 C4FEFFFF MOV DWORD PTR SS:[EBP-13C],EDX
00B6AA3AEB 0F JMP SHORT 00B6AA4B
00B6AA3C8B85 C4FEFFFF MOV EAX,DWORD PTR SS:[EBP-13C]
00B6AA4283C0 0C ADD EAX,0C
00B6AA458985 C4FEFFFF MOV DWORD PTR SS:[EBP-13C],EAX
00B6AA4B8B8D C4FEFFFF MOV ECX,DWORD PTR SS:[EBP-13C]
00B6AA518339 00 CMP DWORD PTR DS:[ECX],0
00B6AA5474 11 JE SHORT 00B6AA67

打开内存境像~!在00401000下断SHIFT+F9运行
Memory map, 项目 22
地址=00401000
大小=00001000 (4096.)
属主=UnPackMe 00400000
区段=.text
类型=映像 01001002
访问=R
初始访问=RWE
到达下面的地址~!
00B931AC8B11MOV EDX,DWORD PTR DS:[ECX]
00B931AE8955 FC MOV DWORD PTR SS:[EBP-4],EDX
00B931B1B8 25000000 MOV EAX,25
00B931B6C1E0 02 SHL EAX,2
00B931B98B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C]; UnPackMe.00454380
00B931BF8B1401MOV EDX,DWORD PTR DS:[ECX+EAX]
00B931C23355 FC XOR EDX,DWORD PTR SS:[EBP-4]
00B931C5B8 25000000 MOV EAX,25
00B931CAC1E0 02 SHL EAX,2
00B931CD8B0D 2C0BBC00 MOV ECX,DWORD PTR DS:[BC0B2C]; UnPackMe.00454380
00B931D3891408MOV DWORD PTR DS:[EAX+ECX],EDX

单步F8到达00B930CB8B42 04 MOV EAX,DWORD PTR DS:[EDX+4]
00B930CE50PUSH EAX
00B930CF8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00B930D28B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
00B930D552PUSH EDX
00B930D66A 00 PUSH 0
00B930D88B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00B930DB8B48 0C MOV ECX,DWORD PTR DS:[EAX+C]
00B930DE51PUSH ECX
00B930DF8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B930E22B55 DC SUB EDX,DWORD PTR SS:[EBP-24]
00B930E5FFD2CALL EDX -----------F7进入
00B930E78945 FC MOV DWORD PTR SS:[EBP-4],EAX
00B930EA8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]

在00B930E5FFD2CALL EDX -----------F7进入到达OEP
CTRL+G00B6AA13撤消 修改


0040170055PUSH EBP
004017018BECMOV EBP,ESP
004017036A FF PUSH -1
0040170568 00254000 PUSH UnPackMe.00402500
0040170A68 86184000 PUSH UnPackMe.00401886 ; JMP 到 msvcrt._except_handler3
0040170F64:A1 00000000MOV EAX,DWORD PTR FS:[0]
0040171550PUSH EAX
0040171664:8925 0000000>MOV DWORD PTR FS:[0],ESP
0040171D83EC 68 SUB ESP,68
0040172053PUSH EBX
0040172156PUSH ESI
0040172257PUSH EDI
004017238965 E8 MOV DWORD PTR SS:[EBP-18],ESP
0040172633DBXOR EBX,EBX
00401728895D FC MOV DWORD PTR SS:[EBP-4],EBX

最后要做的就是用LORDPE 脱壳 然后就REC修复修复的时候无效指针直接剪切掉就OK了~!
fox2006 发表于 2008-10-17 17:21
吾爱专题脱壳练习14
--------------------------------------------------------------------------------
【编写程序】:Microsoft Visual C++ 6.0
【调试环境】:WinXP、OllyDbg、PEiD、LORDPE、ImportREC
【程序查壳】:Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
【脱壳方法】:
---------------------------------------------------------------------------------
00444000 > 60 pushad ;OD载入到这里,下断点bp GetModuleHandleA+5,SHIFT+F9
00444001 E8 00000000 call UnPackMe.00444006
00444006 5D pop ebp
00444007 50 push eax
00444008 51 push ecx
00444009 0FCA bswap edx
---------------------------------------------------------------------------------
当堆栈出现下面信息时候,去断点,ALT+9返回:
0012FEEC 0012FF98
0012FEF0 0043853B 返回到 UnPackMe.0043853B 来自 kernel32.GetModuleHandleA
0012FEF4 00455D00 ASCII "KERNEL32.DLL"
--------------------------------------------------------------------------------
0043853B 8BF0 mov esi,eax ; 返回到这里,ALT+M,在00401000下内存断点,shift+f9一次,
0043853D 85F6 test esi,esi
0043853F 74 23 je short UnPackMe.00438564
00438541 E8 4AFFFFFF call UnPackMe.00438490
00438546 85C0 test eax,eax
----------------------------------------------------------------------------
00BB31AC 8B11 mov edx,dword ptr ds:[ecx] ;断到这里,F8单步一直往下走
00BB31AE 8955 FC mov dword ptr ss:[ebp-4],edx
00BB31B1 B8 25000000 mov eax,25
00BB31B6 C1E0 02 shl eax,2
00BB31B9 8B0D 2C0BBE00 mov ecx,dword ptr ds:[BE0B2C] ; UnPackMe.00454380
--------------------------------------------------------------------------------------
00BB30DB 8B48 0C mov ecx,dword ptr ds:[eax+C]
00BB30DE 51 push ecx
00BB30DF 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00BB30E2 2B55 DC sub edx,dword ptr ss:[ebp-24]
00BB30E5 FFD2 call edx ;从上面一直F8走到这里,很显然这里是跳往OEP的CALL,要F7跟进啦
00BB30E7 8945 FC mov dword ptr ss:[ebp-4],eax
00BB30EA 8B45 FC mov eax,dword ptr ss:[ebp-4]
00BB30ED 5E pop esi
00BB30EE 8BE5 mov esp,ebp
00BB30F0 5D pop ebp
00BB30F1 C3 retn
--------------------------------------------------------------------------------------
00401700 55 push ebp ;到达OEP,DUMP+IAT修复,IAT修复是关键,下面有说明
00401701 8BEC mov ebp,esp
00401703 6A FF push -1
00401705 68 00254000 push UnPackMe.00402500
0040170A 68 86184000 push UnPackMe.00401886 ; jmp 到 msvcrt._except_handler3
0040170F 64:A1 00000000 mov eax,dword ptr fs:[0]
00401715 50 push eax
00401716 64:8925 0000000>mov dword ptr fs:[0],esp
--------------------------------------------------------------------------------------
用ImportREC修复时,剪切无效指针修复文件会不能运行的,需要找到这些无效指针函数。
找到第一个无效指针的RVA=2000,其地址=00402000,这个地址等会要用到

OD重新加载程序,dd 00402000 下硬件访问断点,下断点bp GetModuleHandleA+5, SHIFT+F9
---------------------------------------------------------------------------------
当堆栈出现下面信息时候,去断点,ALT+9返回:
0012FEEC 0012FF98
0012FEF0 0043853B 返回到 UnPackMe.0043853B 来自 kernel32.GetModuleHandleA
0012FEF4 00455D00 ASCII "KERNEL32.DLL"
--------------------------------------------------------------------------------
0043853B 8BF0 mov esi,eax ; 返回到这里,shift+f9二次
0043853D 85F6 test esi,esi
0043853F 74 23 je short UnPackMe.00438564
00438541 E8 4AFFFFFF call UnPackMe.00438490
00438546 85C0 test eax,eax
--------------------------------------------------------------------------------
00BADFC7 8B95 4CD8FFFF mov edx,dword ptr ss:[ebp-27B4] ; 断在这里(是刚才00402000下的断点)
00BADFCD 83C2 04 add edx,4
00BADFD0 8995 4CD8FFFF mov dword ptr ss:[ebp-27B4],edx
00BADFD6 ^ E9 2FFCFFFF jmp 00BADC0A
00BADFDB FF15 4833BD00 call dword ptr ds:[BD3348] ; kernel32.GetTickCount
---------------------------------------------------------------------------------
堆栈出现下面信息:
001293EC 0012AD88 ASCII "GetModuleHandleA" ;这就是无效指针的函数值了。修复的时候要加添加进去
001293F0 0012AC78 ASCII "GetModuleHandleA"
001293F4 0EF6D207
001293F8 00454380 UnPackMe.00454380
001293FC 00000000
00129400 00000000
00129404 0012AD88 ASCII "GetModuleHandleA"
---------------------------------------------------------------------------------
ImportREC修复,OEP=1700,自动获取IAT,获取输入表,双击第一个无效指针,添加GetModuleHandleA,
这是后就可以剪掉其他无效指针,转存OK。
脱壳后用PEID查壳:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks;
用FI查壳:VC++
脱壳成功。


UnPackMe第14期.rar
jcyhlh 发表于 2008-10-17 17:27
一、隐藏od,下断点he GetModuleHandleA,(注:下此断点的目的是找到Magic Jump,避开的IAT的加密。)
shift+f9,有一个不知如何绕过的异常,按确定,shift+f9,堆栈窗口
001293E8 00BB8665/CALL 到 GetModuleHandleA 来自 00BB865F
001293EC 00BE514C\pModule = "kernel32.dll"
001293F0 00BE6D70ASCII "VirtualAlloc"-----分配内存函数
001293F4 0EF6D207
001293F8 00454380UnPackMe.00454380

再shift+f9一次,堆栈窗口
001293E8 00BB8683/CALL 到 GetModuleHandleA 来自 00BB867D
001293EC 00BE514C\pModule = "kernel32.dll"
001293F0 00BE6D64ASCII "VirtualFree"-----------释放内存函数,返回前的标志性函数,再按一次shift+f9就是返回时机
001293F4 0EF6D207

再shift+f9一次,堆栈窗口
00129134 00B9A991/CALL 到 GetModuleHandleA 来自 00B9A98B
00129138 001292B0\pModule = "kernel32.dll"----返回时机
0012913C 00000000
00129140 00454380UnPackMe.00454380
返回时机,alt+f9执行到返回
00B9A9EE8D8D C8FEFFFF LEA ECX,DWORD PTR SS:[EBP-138]
00B9A9F451PUSH ECX
00B9A9F5FF15 8830BE00 CALL DWORD PTR DS:[BE3088] ; kernel32.LoadLibraryA------------------------Magic

Jump就是这个下面的第一个跳转
00B9A9FB8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B9A9FE8B0D 3C30BF00 MOV ECX,DWORD PTR DS:[BF303C]
00B9AA04890491MOV DWORD PTR DS:[ECX+EDX*4],EAX
00B9AA078B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00B9AA0AA1 3C30BF00 MOV EAX,DWORD PTR DS:[BF303C]
00B9AA0F833C90 00 CMP DWORD PTR DS:[EAX+EDX*4],0
00B9AA1375 05 JNZ SHORT 00B9AA1A---小跳转nop掉(注:如果是长跳转,就改为jmp)
00B9AA15^ E9 EFFEFFFF JMP 00B9A909
二、找OEP
下断点bp CreateThread,shift+f9一次,中断后代码如下:
7C810637 >8BFFMOV EDI,EDI
7C81063955PUSH EBP
7C81063A8BECMOV EBP,ESP
7C81063CFF75 1C PUSH DWORD PTR SS:[EBP+1C]
7C81063FFF75 18 PUSH DWORD PTR SS:[EBP+18]
7C810642FF75 14 PUSH DWORD PTR SS:[EBP+14]
7C810645FF75 10 PUSH DWORD PTR SS:[EBP+10]
7C810648FF75 0C PUSH DWORD PTR SS:[EBP+C]
7C81064BFF75 08 PUSH DWORD PTR SS:[EBP+8]
7C81064E6A FF PUSH -1
取消断点,Alt+F9返回,
00BA614C50PUSH EAX
00BA614DFF15 9032BE00 CALL DWORD PTR DS:[BE3290] ; kernel32.CloseHandle
00BA61535EPOP ESI
00BA61545BPOP EBX
00BA61558BE5MOV ESP,EBP
00BA61575DPOP EBP
00BA6158C3RETN

F8单步执行,
00BC30DE51PUSH ECX
00BC30DF8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00BC30E22B55 DC SUB EDX,DWORD PTR SS:[EBP-24]
00BC30E5FFD2CALL EDX---f7进入 ; UnPackMe.00401700
00BC30E78945 FC MOV DWORD PTR SS:[EBP-4],EAX
00BC30EA8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
F7进入到oep
0040170055PUSH EBP
004017018BECMOV EBP,ESP
004017036A FF PUSH -1
0040170568 00254000 PUSH UnPackMe.00402500
0040170A68 86184000 PUSH UnPackMe.00401886 ; JMP 到 msvcrt._except_handler3
三、
这时先不要脱壳,因为iat是乱序的,先随便找一个函数,在数据窗口中跟随,然后向上找到iat的起始位置,是402000,这需要用到一个工具

ArmInline,在进程中选择本程序名,在import Elimination下面的选项中,将base of existing iat:填上402000,下面长度一栏填上1000即可

,下面的选项不用动。点重建按纽。这时再dump。
四、用修复工具进行修复。全部有效。成功。
unpack 发表于 2008-10-17 22:41
不太会脱,所以模仿高手啦!

首先,要忽略一个异常,我们先异常都不勾上,然后shift+f9运行几次后,就能看到异常
C000001E (INVALID LOCK SEQUENCE)就是这个了
然后,忽略所有异常,我们停在
00444000 >60 pushad00444001E8 00000000call UnPackMe.00444006004440065D pop ebp0044400750 push eax0044400851 push ecx
然后我们下bp GetModuleHandleA+5这个断点(前人留下的经验,尚未完全参透,所以也就不说了),然后shift+f9运行,找返回时机,看堆栈,出现下面的信息的时候

(1)
001293E4/0012EB40001293E8|00B88665返回到 00B88665 来自 kernel32.GetModuleHandleA001293EC|00BB514CASCII "kernel32.dll"001293F0|00BB6D70ASCII "VirtualAlloc"001293F4|0EF6D207001293F8|00454380UnPackMe.00454380
(2)
001293E4/0012EB40001293E8|00B88683返回到 00B88683 来自 kernel32.GetModuleHandleA001293EC|00BB514CASCII "kernel32.dll"001293F0|00BB6D64ASCII "VirtualFree"001293F4|0EF6D207001293F8|00454380UnPackMe.00454380
(3)
00129130/001293E800129134|00B6A991返回到 00B6A991 来自 kernel32.GetModuleHandleA00129138|001292B0ASCII "kernel32.dll"0012913C|0000000000129140|00454380UnPackMe.00454380
看到这三个的时候,到第三处的信息后,我们就停下了,我一共用了120次,这个时候我们取消断点,alt+f9返回,来到
00B6A9918B55 F4mov edx,dword ptr ss:[ebp-C]00B6A9948B0D 3C30BC00mov ecx,dword ptr ds:[BC303C]00B6A99A890491 mov dword ptr ds:[ecx+edx*4],eax00B6A99D8B55 F4mov edx,dword ptr ss:[ebp-C]00B6A9A0A1 3C30BC00mov eax,dword ptr ds:[BC303C]00B6A9A5833C90 00cmp dword ptr ds:[eax+edx*4],000B6A9A975 5Cjnz short 00B6AA0700B6A9AB8B4D F8mov ecx,dword ptr ss:[ebp-8]00B6A9AE8B51 08mov edx,dword ptr ds:[ecx+8]00B6A9B183E2 02and edx,200B6A9B474 38je short 00B6A9EE
我们往下找,找到
00B6A9F5FF15 8830BB00call dword ptr ds:[BB3088]; kernel32.LoadLibraryA00B6A9FB8B55 F4mov edx,dword ptr ss:[ebp-C]00B6A9FE8B0D 3C30BC00mov ecx,dword ptr ds:[BC303C]00B6AA04890491 mov dword ptr ds:[ecx+edx*4],eax00B6AA078B55 F4mov edx,dword ptr ss:[ebp-C]00B6AA0AA1 3C30BC00mov eax,dword ptr ds:[BC303C]00B6AA0F833C90 00cmp dword ptr ds:[eax+edx*4],000B6AA1375 05jnz short 00B6AA1A00B6AA15^ E9 EFFEFFFFjmp 00B6A90900B6AA1AC785 BCFEFFFF 000000>mov dword ptr ss:[ebp-144],0

这个函数下的跳转,据说是MAGIC跳转,解释是如果是个大跳就改成JMP,如果是小跳,我们就NOP掉,所以我们将
00B6AA1375 05jnz short 00B6AA1A
这句NOP掉

然后搜索二进制(ctrl+b):EB 03 D6 D6 8F(拿来了前人的经验啊)
00B6AC95^\E9 6FFCFFFFjmp 00B6A90900B6AC9AEB 03jmp short 00B6AC9F; //搜索到的就是这里了00B6AC9CD6 salc00B6AC9DD6 salc00B6AC9E8F ??? ; 未知命令
然后我们在00B6AC9AEB 03jmp short 00B6AC9F 这句上F2下断,F9运行来到这儿

取消断点,然后把00B6AA13这个地方刚刚NOP掉的右键---撤销选择,高手说是此时IAT处理完毕

然后下断 BP CreateThread,shift+f9运行
7C810657 >8BFF mov edi,edi7C81065955 push ebp7C81065A8BEC mov ebp,esp7C81065CFF75 1Cpush dword ptr ss:[ebp+1C]7C81065FFF75 18push dword ptr ss:[ebp+18]7C810662FF75 14push dword ptr ss:[ebp+14]7C810665FF75 10push dword ptr ss:[ebp+10]
然后取消断点,alt+f9返回
00B7614C50 push eax00B7614DFF15 9032BB00call dword ptr ds:[BB3290]; kernel32.CloseHandle00B761535E pop esi00B761545B pop ebx00B761558BE5 mov esp,ebp00B761575D pop ebp00B76158C3 retn
然后我们一直F8单步来到
00B930CF8B4D 08mov ecx,dword ptr ss:[ebp+8]00B930D28B51 08mov edx,dword ptr ds:[ecx+8]00B930D552 push edx00B930D66A 00push 000B930D88B45 08mov eax,dword ptr ss:[ebp+8]00B930DB8B48 0Cmov ecx,dword ptr ds:[eax+C]00B930DE51 push ecx00B930DF8B55 F4mov edx,dword ptr ss:[ebp-C]00B930E22B55 DCsub edx,dword ptr ss:[ebp-24]00B930E5FFD2 call edx; UnPackMe.0040170000B930E78945 FCmov dword ptr ss:[ebp-4],eax00B930EA8B45 FCmov eax,dword ptr ss:[ebp-4]00B930ED5E pop esi00B930EE8BE5 mov esp,ebp00B930F05D pop ebp00B930F1C3 retn
到了这个call的时候,我们看到是call一个远地址,此时我们F7进入,就到了我们的OEP了
0040170055 push ebp004017018BEC mov ebp,esp004017036A FFpush -10040170568 00254000push UnPackMe.004025000040170A68 86184000push UnPackMe.00401886; jmp to msvcrt._except_handler30040170F64:A1 00000000 mov eax,dword ptr fs:[0]0040171550 push eax0040171664:8925 00000000 mov dword ptr fs:[0],esp0040171D83EC 68sub esp,680040172053 push ebx0040172156 push esi0040172257 push edi004017238965 E8mov dword ptr ss:[ebp-18],esp0040172633DB xor ebx,ebx00401728895D FCmov dword ptr ss:[ebp-4],ebx0040172B6A 02push 20040172DFF15 90214000call dword ptr ds:[402190]; msvcrt.__set_app_type0040173359 pop ecx00401734830D 2C314000 FF or dword ptr ds:[40312C],FFFFFFFF0040173B830D 30314000 FF or dword ptr ds:[403130],FFFFFFFF00401742FF15 8C214000call dword ptr ds:[40218C]; msvcrt.__p__fmode
是vc++的程序,我们用LordPE将它dump下来,然后用ImpREC进行修复,发现有
当前输入表:0 (十进制:0) 个有效模块7A (十进制:122) 个输入函数. (已添加: +7A (十进制:+122))(6 (十进制:6) 个未解决的指针) (已添加: +6 (十进制:+6))
6个无效,我们直接剪切掉,就OK了
修复后,发现能够运行起来,然后用PEID查得是:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks

在网上看到说是这个壳与vc++相似,所以我用FI查了下
显示是:MS Visual C++ v5.? (?PE)

然后用DIE_0.64查得:Microsoft Visual C++|C/C++
用Ixeinfo PE查得:Microsoft Visual C++ ver 5.0/6.0
这样应该说是没有壳的,脱壳也就完成了!!!!
sshot-1.gif sshot-2.gif sshot-.gif
虽然脱壳完了,但是我们发现加密保护壳加壳程序后,程序变大了,但是脱壳后程序应该变少了才是,但是程序大小修复后有800k,所以我们呢要进行减肥它

我们打开LordPE,然后点击PE编辑器----选中修复后的程序----点区段-----然后我们找到.pdata、.data1、.adata、.text1这四个区段,依次右键----wipe section header(擦除区段头)
这样,四个区段去除后,我们点确定,然后点重建PE---选中修复的程序,发现显示压缩到 2%,然后看看重建PE后的程序显示18K
这样就完成了给程序减肥了,减肥后的程序能够运行起来(这时我第一次给程序减肥,可能减掉多了或少见掉了,还望之处!)

dumped_.rar

dumped_减肥.rar
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

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

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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