找回密码
 注册
搜索
热搜: 回贴

脱壳技术

2010-1-12 20:27| 发布者: admin| 查看: 194| 评论: 0|原作者: 琴姬

破文作者: fly

下载页面: http://www3.skycn.com/soft/10657.html

软件大小: 1750 KB

软件语言: 英文

软件类别: 国外软件 / 共享版 / 图标工具

应用平台: Win9x/NT/2000/XP

加入时间: 2004-10-20 09:22:15

下载次数: 5317

推荐等级: ****

开 发 商: http://www.beeicons.com/

软件介绍: Bee Icons 是一个图标工具,可以替换系统图标和已注册文件类型的图标!

作者声明: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

调试环境: WinXP、OllyDbg、LordPE、WinHex

脱壳过程: 利用ASProtect的Pre-Dip来Patch注册其保护程序的方法在国外某些组织早已使用了。这个方法的意义在于能够直接Patch修改ASProtect加壳程序的内部代码,注册是指那些可以通过处理Pre-Dip来完成注册的加壳程序。本教程所介绍的方法只能Patch ASProtect V1.X壳保护程序,包括V1.23RC4、V1.3X等版本;但是不适用于ASProtect最新的V2.X壳保护程序,因为ASProtect V2.X壳特别针对这个方法加了校验。关于Pre-Dip可以查阅《看雪论坛精华6》中lipton以及ASProtect目录下的相关教程。
下面以ASProtect V1.23RC4加壳的Bee Icons V4.01为例来进行演示。

方法比较繁琐,分多次操作。需要耐心和ASProtect脱壳基础。多多练习就可以成功,国内已有不少兄弟掌握此方法了。

设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。下面的各步除了特殊说明的,皆为这个异常选项设置。

老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。

—————————————————————————————————

一、获得ASProtect注册名Pre-Dip处理的地址



00401000 68 01306100 push BeeIcons.00613001

//进入Ollydbg后暂停在这

00401005 E8 01000000 call BeeIcons.0040100B

0040100A C3 retn

Shift F9 运行N次,直至堆栈中第2次看见硬盘指纹:



0013FF3C 00FE4849 返回到 00FE4849

0013FF40 00FD3861

0013FF44 0013FFE0 指针到下一个 SEH 记录

0013FF48 00FE4C49 SE 句柄

0013FF4C 0013FF90

0013FF50 00FD0000

0013FF54 00FA0000

0013FF58 00FE4138

0013FF5C 010028C8 ASCII "wWDDDAAgLTg="

Alt M打开内存查看窗口,在00401000段“设置内存访问断点”,Shift F9通过异常,断下



0052FAB4 55 push ebp

//注意这个地址:0052FAB4 ★

0052FAB5 8BEC mov ebp,esp

0052FAB7 8B45 08 mov eax,dword ptr ss:[ebp 8]

//[ebp 8]=[0013FF40]=00FD3861 注册名保存地址 ★

0052FABA 85C0 test eax,eax

0052FABC 74 0C je short BeeIcons.0052FACA

0052FABE 8038 00 cmp byte ptr ds:[eax],0

0052FAC1 74 07 je short BeeIcons.0052FACA

0052FAC3 C605 681A5700 0>mov byte ptr ds:[571A68],1

0052FACA 8B15 5C1A5700 mov edx,dword ptr ds:[571A5C]

0052FAD0 8915 581A5700 mov dword ptr ds:[571A58],edx

0052FAD6 A3 5C1A5700 mov dword ptr ds:[571A5C],eax

0052FADB 5D pop ebp

0052FADC C2 0400 retn 4

看堆栈0013FF3C 返回到 00FE4849,Ctrl G:00FE4849向上看看



00FE483F A1 3866FE00 mov eax,dword ptr ds:[FE6638]

00FE4844 8B40 04 mov eax,dword ptr ds:[eax 4]

00FE4847 FFD0 call eax

//Call 0052FAB4

00FE4849 8B15 1865FE00 mov edx,dword ptr ds:[FE6518]

在转存中Ctrl G:[0FE6638] 4



00FE7AB8 B4 FA 52 00 ★

记住:0052FAB4和00FE7AB8



—————————————————————————————————

二、第一次回溯:00FE7AB8



重新载入程序。忽略除了“内存访问异常”之外的所有其它异常选项,Shift F9 运行1次



00FE41A4 3100 xor dword ptr ds:[eax],eax

//第1次内存异常

在转存中Ctrl G:00FE7AB8,或者下命令:DB 00FE7AB8

选中00FE7AB8处4个字节,下“内存写入”断点。忽略所有异常,Shift F9



00FD27A8 F3:AB rep stos dword ptr es:[edi]

//第一次中断

00FD262B F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]

//第二次中断

ds:[esi]=[00FF1613]=0012FAB4 ★

es:[edi]=[00FE7AB8]=00000000

0012FAB4=0052FAB4-基址0040000

如果在00FE7AB8处设置“内存访问”断点,就会跟踪到这里:



00FE444D 010C82 add dword ptr ds:[edx eax*4],ecx; BeeIcons.00400000

//[00FE7AB8]=0012FAB4 00400000

记住:00FF1613



—————————————————————————————————

三、得到壳重定位后的基址 第二次回溯:00FF1613



重新载入程序。忽略所有异常,BP VirtualAlloc

然后把断点挪到VirtualAlloc的段尾,Shift F9运行,观察壳所申请到的内存地址

————————————————————————

1、得到壳重定位后的基址



7C809A81 8BFF mov edi,edi

//VirtualAlloc

7C809A83 55 push ebp

7C809A9A C2 1000 retn 10

//这里下断

当我们在VirtualAlloc中断第2次,会发现申请的EAX返回值是00FD0000



0013FF90 0061352D /CALL 到 VirtualAlloc 来自 BeeIcons.00613527

0013FF94 00000000 |Address = NULL

0013FF98 0001E000 |Size = 1E000 (122880.)

0013FF9C 00001000 |AllocationType = MEM_COMMIT

0013FFA0 00000004 \Protect = PAGE_READWRITE

00FD0000就是这个程序的壳重定位后的基址,F7,需要跟踪一下



00613527 FF95 DF030000 call dword ptr ss:[ebp 3DF]

0061352D 8985 BF010000 mov dword ptr ss:[ebp 1BF],eax

//[00613607]=00FD0000 ★

00613533 8B55 5B mov edx,dword ptr ss:[ebp 5B]

00613536 8B85 BF010000 mov eax,dword ptr ss:[ebp 1BF]

0061353C 8902 mov dword ptr ds:[edx],eax

//[00613048]=00FD0000

记住:[00613607],保存壳重定位后的基址,或者[00613048]



————————————————————————

2、第二次回溯:00FF1613

OK,我们继续Shift F9运行,

观察壳所申请到的内存地址,这个需要不少次才看到EAX=00FF0000,某些时候需要中断2次EAX=00FF0000,取消7C809A9A处断点。

在转存选中Ctrl G:00FF1613选中00FF1613处4个字节,下“内存写入”断点。Shift F9

00FD2645 F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]

//中断在这里

ds:[esi]=[00635587]=E0515542

es:[edi]=[00FF1614]=00000000

ds:[esi]=[00635583]=DB9F2C32

es:[edi]=[00FF1610]=00000000



00635586==>00FF1613 DB 42 55 51 ★

你可以用LordPE的FLC功能查看BeeIcons.exe的00635586(偏移000C5B86)处数据:DB 42 55 51 ,

Good! ASProtect壳下面会对这些数据进行简单的运算,变换成0012FAB4



—————————————————————————————————

四、得到运算数据 求逆



选择00FF1613处的4个字节,设置“内存访问”断点。Shift F9,中断在00FD94BA处,开始运算。



00FD946A 41 inc ecx

00FD946B 80E1 FF and cl,0FF

00FD946E 33DB xor ebx,ebx

00FD94C1 321C30 xor bl,byte ptr ds:[eax esi]

//异或 注意:记住运算的数据!

//①、BL=DB XOR 6F=B4

//②、BL=42 XOR B8=FA

//③、BL=55 XOR 47=12

//④、BL=51 XOR 51=00

运算结束得到: ★

00FF1613 B4 FA 12 00

BeeIcons.exe的000C5B86偏移地址处是DB425551,这个值正是上面进行运算的数据。

我们要把这里的0052FAB4(0012FAB4 0040000)改为运算后跳向可以写Patch代码的地址!

一般在PE文件偏移80-100间有段空白地址可以给我们利用,所以要修改这个运算后的Patch地址为00400080。

求逆00000080(00400080-00400000)如下:



①、BL=80 XOR 6F=EF

②、BL=00 XOR B8=B8

③、BL=00 XOR 47=47

④、BL=00 XOR 51=51

使用WinHex修改BeeIcons.exe偏移000C5B86处的DB425551为:EFB84751,另存为fly.eXe,第六步时需要在里面进行最终的修改。



—————————————————————————————————

五、RegOpenKeyExA



得到上面的地址运算数据后,我们还要得到壳通过读取注册表中的信息判断是否过期的地方。

Ctrl F在“整个段块”搜索命令:push 20019



00FD961D 68 19000200 push 20019

//找到这里

00FD9622 6A 00 push 0

00FD9624 8BC7 mov eax,edi

00FD9626 E8 31A2FFFF call 00FD385C

00FD962B 50 push eax

00FD962C 56 push esi

00FD962D E8 C6BAFFFF call 00FD50F8; jmp to advapi32.RegOpenKeyExA

//Call RegOpenKeyExA

00FD9632 85C0 test eax,eax

00FD9634 0F85 84000000 jnz 00FD96BE

call 00FD50F8就是call RegOpenKeyExA

点右键,搜索全部命令:call 00FD50F8

—————————————————————————————————

六、Patch最终处理



用Ollydbg载入第四步保存的fly.eXe,忽略所有异常,直接下断:BP 400080,Shift F9后中断下来。



00400080 0000 add byte ptr ds:[eax],al

//中断

OK,ASProtect成功到达我们指定的地点!现在写入Patch代码:



00400080 A1 07366100 mov eax,dword ptr ds:[613607]

//[613607]中是第三步得到的壳重定位后的基址

00400085 C680 7D970000 E>mov byte ptr ds:[eax 977D],0EB

//这三句是修改壳通过读取注册表中的信息判断是否过期的地方

//修改①、 jmp 00FD97E5

0040008C C780 30980000 E>mov dword ptr ds:[eax 9830],94E9

//修改②、 jmp 00FD98C9

00400096 C680 18990000 E>mov byte ptr ds:[eax 9918],0E9

//修改③、 jmp 00FD994A

0040009D 55 push ebp

0040009E 8BEC mov ebp,esp

//上面2句是把0052FAB4和0052FAB5代码挪到这里执行

004000A0 B8 C0004000 mov eax,004000C0; ASCII "fly"

//直接在004000C0处写入注册名:fly

004000A5 E9 10FA1200 jmp 0052FABA

//跳回去继续流程

从Ollydbg中“二进制复制”如下:



A1 07 36 61 00 C6 80 7D 97 00 00 EB C7 80 30 98 00 00 E9 94 00 00 C6 80 18 99 00 00 E9 55 8B EC

B8 C0 00 40 00 E9 10 FA 12 00

前面所有的工作只为了这里写入的几行代码,而这几行代码则使得这个使用ASProtect保护的程序变成了注册版!



至于制作Patch,可以随意选择补丁工具,看你的喜好了。我选择t.p.e制作了通用的文件补丁。





最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 11:42 , Processed in 0.288561 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部