Patch注册ASProtect V1.X壳保护程序的方法
            
           
             
下载页面:  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
7C809A84    8BEC            mov ebp,esp
7C809A86    FF75 14         push dword ptr ss:[ebp+14]
7C809A89    FF75 10         push dword ptr ss:[ebp+10]
7C809A8C    FF75 0C         push dword ptr ss:[ebp+C]
7C809A8F    FF75 08         push dword ptr ss:[ebp+8]
7C809A92    6A FF           push -1
7C809A94    E8 09000000     call kernel32.VirtualAllocEx
7C809A99    5D              pop 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
00FD9470    8AD9            mov bl,cl
00FD9472    021418          add dl,byte ptr ds:[eax+ebx]
00FD9475    80E2 FF         and dl,0FF
00FD9478    33DB            xor ebx,ebx
00FD947A    8AD9            mov bl,cl
00FD947C    8A1C18          mov bl,byte ptr ds:[eax+ebx]
00FD947F    885D F7         mov byte ptr ss:[ebp-9],bl
00FD9482    8BF2            mov esi,edx
00FD9484    81E6 FF000000   and esi,0FF
00FD948A    33DB            xor ebx,ebx
00FD948C    8AD9            mov bl,cl
00FD948E    8D3C18          lea edi,dword ptr ds:[eax+ebx]
00FD9491    8A1C30          mov bl,byte ptr ds:[eax+esi]
00FD9494    881F            mov byte ptr ds:[edi],bl
00FD9496    8A5D F7         mov bl,byte ptr ss:[ebp-9]
00FD9499    881C30          mov byte ptr ds:[eax+esi],bl
00FD949C    33DB            xor ebx,ebx
00FD949E    8AD9            mov bl,cl
00FD94A0    8A1C18          mov bl,byte ptr ds:[eax+ebx]
00FD94A3    8BF2            mov esi,edx
00FD94A5    81E6 FF000000   and esi,0FF
00FD94AB    021C30          add bl,byte ptr ds:[eax+esi]
00FD94AE    80E3 FF         and bl,0FF
00FD94B1    885D F7         mov byte ptr ss:[ebp-9],bl
00FD94B4    8B5D FC         mov ebx,dword ptr ss:[ebp-4]
00FD94B7    8B75 F0         mov esi,dword ptr ss:[ebp-10]
00FD94BA    8A1C33          mov bl,byte ptr ds:[ebx+esi]
//中断在这里!依次取DB 42 55 51
00FD94BD    0FB675 F7       movzx esi,byte ptr ss:[ebp-9]
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
地址       反汇编           注释
00FD962D   call 00FD50F8    jmp to advapi32.RegOpenKeyExA
00FD970A   call 00FD50F8    jmp to advapi32.RegOpenKeyExA
00FD9776   call 00FD50F8    jmp to advapi32.RegOpenKeyExA
00FD9829   call 00FD50F8    jmp to advapi32.RegOpenKeyExA
00FD9911   call 00FD50F8    jmp to advapi32.RegOpenKeyExA

一般修改后面3个CALL后的跳转就行了:
00FD9776    E8 7DB9FFFF     call 00FD50F8 ; jmp to advapi32.RegOpenKeyExA
00FD977B    85C0            test eax,eax
00FD977D    75 66           jnz short 00FD97E5
//修改①、  jmp short 00FD97E5

00FD9829    E8 CAB8FFFF     call 00FD50F8 ; jmp to advapi32.RegOpenKeyExA
00FD982E    85C0            test eax,eax
00FD9830    0F85 93000000   jnz 00FD98C9
//修改②、  jmp 00FD98C9

00FD9911    E8 E2B7FFFF     call 00FD50F8 ; jmp to advapi32.RegOpenKeyExA
00FD9916    85C0            test eax,eax
00FD9918    75 30           jnz short 00FD994A
//修改③、  jmp 00FD994A

记住这三个需要修改的地方:00FD977D、00FD9830、00FD9918


—————————————————————————————————
六、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制作了通用的文件补丁。
Game !



—————————————————————————————————    
                                
         ,     _/ 
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名 
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
 `~ _( ,_..--\ (     ,;'' /    ~--   /._`\ 
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""

              UnPacked By :  fly
               2005-03-16 20:00