Patch注册Ultra Tag Editor V2.0.8(ASProtect V1.X壳)的方法
下载页面: http://yncnc.onlinedown.net/soft/25235.htm
软件大小: 1264KB
软件语言: 英文
软件类别: 共享版/MP3 制作
应用平台: Win9x/NT/2000/XP
加入时间: 2005-3-19 19:54:57
下载次数: 1153
推荐等级: ****
软件介绍: 标签编辑器
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、OllyDbg、LordPE、UltraEdit
【脱壳过程】:
看了fly老大的"Patch注册ASProtect V1.X壳保护程序的方法"一文,受益非潜,看懂原理后就可以"举一反三"啦,这里只是fly老大的翻版,响应fly教给我的任务,大家就凑活着看吧,再次感谢fly的无私奉献,真是我的偶像,顺便拍两下。
设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。下面的各步除了特殊说明的,皆为这个异常选项设置。
老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。
一、获得ASProtect注册名Pre-Dip处理的地址
00401000 T> 68 01606400 push TagEdito.00646001
//进入Ollydbg后暂停在这
00401005 E8 01000000 call TagEdito.0040100B
0040100A C3 retn
Shift+F9 运行N次(我这里是23次),直至堆栈中第2次看见硬盘指纹:
0012FF38 0012FF40 指针到下一个 SEH 记录
0012FF3C 00FF4902 SE 句柄
0012FF40 0012FFE0 指针到下一个 SEH 记录
0012FF44 00FF4EF4 SE 句柄
0012FF48 0012FF90
0012FF4C 00FE0000
0012FF50 00FC0000
0012FF54 00FF4400
0012FF58 00000000
0012FF5C 0100AF20 ASCII "dXlooADwifU="
Alt+M打开内存查看窗口,在00401000段“设置内存访问断点”,Shift+F9通过异常,断下
0047398C 55 push ebp
0047398D 8BEC mov ebp,esp
0047398F 8B45 08 mov eax,dword ptr ss:[ebp+8]
//Stack ss:[ebp+8]]=00FE3951 注册名保存地址 ★
//这个地址知道就可以拉,patch把注册名地址指向了自己的大名。
00473992 85C0 test eax,eax
//地址"00473992"要记下的,patch后要从这里继续的,即jmp 00473992
00473994 74 0C je short TagEdito.004739A2
00473996 8038 00 cmp byte ptr ds:[eax],0
00473999 74 07 je short TagEdito.004739A2
0047399B C605 40005900 01 mov byte ptr ds:[590040],1
004739A2 8B15 34005900 mov edx,dword ptr ds:[590034]
004739A8 8915 30005900 mov dword ptr ds:[590030],edx
004739AE A3 34005900 mov dword ptr ds:[590034],eax
004739B3 5D pop ebp
004739B4 C2 0400 retn 4
00FF4AE5 A1 2066FF00 mov eax,dword ptr ds:[FF6620]
00FF4AEA 8B40 04 mov eax,dword ptr ds:[eax+4]
00FF4AED FFD0 call eax
00FF4AEF 8B15 0865FF00 mov edx,dword ptr ds:[FF6508]
//执行返回到这里,上面的call eax就是读取注册名
eax=[00FF6620]+4=00FF7984==>8C 39 47 00,所以call eax等价为
call 0047398C 记住:0047398C和00FF7984
―――――――――――――――――――――――――――――――――
二、第一次回溯:00FF7984
重新载入程序。忽略除了“内存访问异常”之外的所有其它异常选项,Shift+F9 运行1次
00FF446C 3100 xor dword ptr ds:[eax],eax
//第1次内存异常
在转存中Ctrl+G:00FF7984,或者下命令:DB 00FF7984
选中00FF7984处4个字节,下“内存写入”断点。忽略所有异常,Shift+F9
00FE27B8 F3:AB rep stos dword ptr es:[edi]
//第一次中断
00FE2663 F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
//第二次中断
ds:[esi]=[0100128E]=0007398C ★
es:[edi]=[00FF7984]=00000000
0047398C=0007398C-基址0040000
记住:0100128E
―――――――――――――――――――――――――――――――――
三、得到壳重定位后的基址 + 第二次回溯:0100128E
重新载入程序。忽略所有异常,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
//这里下断
//因为Stack ss:[ebp+8]]=00FE3951 注册名保存地址 ★,可知壳重定位地址为00FE0000
当我们在VirtualAlloc中断第2次,会发现申请的EAX返回值是00FE0000
00FE0000就是这个程序的壳重定位后的基址,F7,需要跟踪一下
00646588 FF95 DF030000 call dword ptr ss:[ebp+3DF]
0064658E 8985 BF010000 mov dword ptr ss:[ebp+1BF],eax
//[00646668]=00FE0000 ★
00646594 8B55 5B mov edx,dword ptr ss:[ebp+5B]
00646597 8B85 BF010000 mov eax,dword ptr ss:[ebp+1BF]
0064659D 8902 mov dword ptr ds:[edx],eax
记住:[00646668],保存壳重定位后的基址。
――――――――――――――――――――――――
2、第二次回溯:0100128E
OK,我们继续Shift+F9运行,观察壳所申请到的内存地址
这个需要不少次才看到EAX=01000000,某些时候需要中断2次EAX=01000000
取消7C809A9A处断点。在转存中Ctrl+G:0100128E
选中0100128E处4个字节,下“内存写入”断点。Shift+F9
00FE267D F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
//中断在这里
ds:[esi]=[006572E4]=1AEF4F1F
es:[edi]=[0100128F]=00000000
006572E3==>0100128E 91 1F 4F EF ★
你可以用LordPE的FLC功能查看TagEditor.exe的006572E3(偏移000BBCE3)处数据:91 1F 4F EF
Good! ASProtect壳下面会对这些数据进行简单的运算,变换成0007398C
―――――――――――――――――――――――――――――――――
四、得到运算数据 + 求逆
选择0100128E处的4个字节,设置“内存访问”断点。
Shift+F9,中断在00FD9936处,开始运算
00FE98E6 41 inc ecx
00FE98E7 80E1 FF and cl,0FF
00FE98EA 33DB xor ebx,ebx
00FE98EC 8AD9 mov bl,cl
00FE98EE 021418 add dl,byte ptr ds:[eax+ebx]
00FE98F1 80E2 FF and dl,0FF
00FE98F4 33DB xor ebx,ebx
00FE98F6 8AD9 mov bl,cl
00FE98F8 8A1C18 mov bl,byte ptr ds:[eax+ebx]
00FE98FB 885D F7 mov byte ptr ss:[ebp-9],bl
00FE98FE 8BF2 mov esi,edx
00FE9900 81E6 FF000000 and esi,0FF
00FE9906 33DB xor ebx,ebx
00FE9908 8AD9 mov bl,cl
00FE990A 8D3C18 lea edi,dword ptr ds:[eax+ebx]
00FE990D 8A1C30 mov bl,byte ptr ds:[eax+esi]
00FE9910 881F mov byte ptr ds:[edi],bl
00FE9912 8A5D F7 mov bl,byte ptr ss:[ebp-9]
00FE9915 881C30 mov byte ptr ds:[eax+esi],bl
00FE9918 33DB xor ebx,ebx
00FE991A 8AD9 mov bl,cl
00FE991C 8A1C18 mov bl,byte ptr ds:[eax+ebx]
00FE991F 8BF2 mov esi,edx
00FE9921 81E6 FF000000 and esi,0FF
00FE9927 021C30 add bl,byte ptr ds:[eax+esi]
00FE992A 80E3 FF and bl,0FF
00FE992D 885D F7 mov byte ptr ss:[ebp-9],bl
00FE9930 8B5D FC mov ebx,dword ptr ss:[ebp-4]
00FE9933 8B75 F0 mov esi,dword ptr ss:[ebp-10]
00FE9936 8A1C33 mov bl,byte ptr ds:[ebx+esi]
//中断在这里
00FE9939 0FB675 F7 movzx esi,byte ptr ss:[ebp-9]
00FE993D 321C30 xor bl,byte ptr ds:[eax+esi]
//异或 注意:记住运算的数据!可是异或的结果都为0,直到0100129E才恢复我们想要的
数据8C 39 07 00,LordPE的FLC功能查看TagEditor.exe的006572E3+10(偏移000BBCE3+10)处数据
为:7B 2B D9 AA,与预想的偏差10。
//①、BL=7B XOR F7=8C
//②、BL=2B XOR 12=39
//③、BL=D9 XOR DE=07
//④、BL=AA XOR AA=00
运算结束得到: ★
0100129E 8C 39 07 00
TagEditor.exe的000BBCF3偏移地址处是7B2BD9AA,这个值正是上面进行运算的数据。
我们要把这里的0047398C(0007398C+0040000)改为运算后跳向可以写Patch代码的地址!
一般在PE文件偏移80-100间有段空白地址可以给我们利用
所以要修改这个运算后的Patch地址为00400080
求逆00000080(00400080-00400000)如下:
①、BL=80 XOR F7=77
②、BL=00 XOR 12=12
③、BL=00 XOR DE=DE
④、BL=00 XOR AA=AA
使用UltraEdit修改TagEditor.exe偏移000BBCF3处改为:7712DEAA
另存为daxia2002.eXe,第六步时需要在里面进行最终的修改
―――――――――――――――――――――――――――――――――
五、RegOpenKeyExA
得到上面的地址运算数据后,我们还要得到壳通过读取注册表中的信息判断是否过期的地方。
Ctrl+F在“整个段块”搜索命令:push 20019
00FD961D 68 19000200 push 20019
//找到这里
00FE9A99 68 19000200 push 20019
00FE9A9E 6A 00 push 0
00FE9AA0 8BC7 mov eax,edi
00FE9AA2 E8 A59EFFFF call 00FE394C
00FE9AA7 50 push eax
00FE9AA8 56 push esi
00FE9AA9 E8 3EB9FFFF call 00FE53EC ; jmp to advapi32.RegOpenKeyExA
//Call RegOpenKeyExA
00FE9AAE 85C0 test eax,eax
00FE9AB0 0F85 84000000 jnz 00FE9B3A
call 00FE53EC就是call RegOpenKeyExA
点右键,搜索全部命令:call 00FE53EC
地址 反汇编 注释
查找命令
jmp to advapi32.RegOpenKeyExA
jmp to advapi32.RegOpenKeyExA
jmp to advapi32.RegOpenKeyExA
jmp to advapi32.RegOpenKeyExA
一般修改后面3个CALL后的跳转就行了:
00FE9BF2 E8 F5B7FFFF call 00FE53EC ; jmp to advapi32.RegOpenKeyExA
00FE9BF7 85C0 test eax,eax
00FE9BF9 75 66 jnz short 00FE9C61
//修改①、 jmp short 00FE9C61
00FE9CA5 E8 42B7FFFF call 00FE53EC ; jmp to advapi32.RegOpenKeyExA
00FE9CAA 85C0 test eax,eax
00FE9CAC 0F85 93000000 jnz 00FE9D45
//修改②、 jmp 00FE9D45
00FE9D8D E8 5AB6FFFF call 00FE53EC ; jmp to advapi32.RegOpenKeyExA
00FE9D92 85C0 test eax,eax
00FE9D94 75 30 jnz short 00FE9DC6
//修改③、 jmp 00FE9DC6
记住这三个需要修改的地方:00FE9BF9、00FE9CAC、00FE9D94
―――――――――――――――――――――――――――――――――
六、Patch最终处理
用Ollydbg载入第四步保存的fly.eXe,忽略所有异常
直接下断:BP 400080,Shift+F9后中断下来
00400080 0000 add byte ptr ds:[eax],al
//中断
OK,ASProtect成功到达我们指定的地点!现在写入Patch代码:
00400080 A1 68666400 mov eax,dword ptr ds:[646668]
//[00646668]中是第三步得到的壳重定位后的基址
00400085 C680 F99B0000 EB mov byte ptr ds:[eax+9BF9],0EB
//这三句是修改壳通过读取注册表中的信息判断是否过期的地方
//修改①、 jmp short 00FE9C61
0040008C C780 AC9C0000 E9>mov dword ptr ds:[eax+9CAC],94E9
//修改②、 jmp 00FE9D45
00400096 C680 949D0000 EB mov byte ptr ds:[eax+9D94],0EB
//修改③、 jmp 00FE9DC6
0040009D 55 push ebp
0040009E 8BEC mov ebp,esp
//上面2句是把0047398C和0047398D代码挪到这里执行
004000A0 B8 C0004000 mov eax,TagEdito.004000C0 ; ASCII "daxia2002[DFCG]"
//直接在004000C0处写入注册名:daxia2002[DFCG]
004000A5 - E9 E8380700 jmp TagEdito.00473992
//跳回去继续流程
从Ollydbg中“二进制复制”如下:
A1 68 66 64 00 C6 80 F9 9B 00 00 EB C7 80 AC 9C 00 00 E9 94 00 00 C6 80 94 9D 00 00 EB 55 8B EC
B8 C0 00 40 00 E9 E8 38 07 00
前面所有的工作只为了这里写入的几行代码,而这几行代码则使得这个使用ASProtect保护的程序变成了注册版!
至于制作Patch,可以随意选择补丁工具,看你的喜好了。我选择keymaker制作了通用的文件补丁。
照猫划虎总算完成了fly老大教给的任务,再一次感谢偶的偶像fly,谢谢他的无私奉献。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)