=============================
AVI/MPEG/RM/WMV Joiner V4.61 汉化版 crack tutorial
=============================

=============================
程序说明

AVI/MPEG/RM Joiner 将琐碎影片按顺序作结合整理。
这个软件可以帮助你把零散的影片文件组合成为一个大的影片文件。
这个程序支持 AVI, MPEG, MPEG-4,DivX以及 RM 格式影片,它可以将不同格式的影片组合。
你可以任意组合或者排列这些片段。
=============================

=============================
破解说明

其实本软件的破解,crsky很早以前就做过了,并提供了注册码:
name = crsky
sn   = VFJ377-7LLHOE-14000
不过用别人的名字注册,总有种食人牙秽的感觉,^_^,(crsky别介意,玩笑)。
所以决定搞一个自己用户名的注册码出来。

程序加壳 - ASPack 2.12
保护方式 - 试用期+注册码
注册保存 - 注册表
保护算法 - MD5

破解目的:
熟悉MD5算法,尝试暴力破解

破解结果:
name = MrBeer[CCG]
sn   = VFJ431-AA8UKY-51241
=============================

=============================
破解分析

1. 第一步是对程序进行查壳/脱壳,这个对于任何破解应该都是不可免除的一步。
   用PEiD检测主程序EZMerge.exe,发现ASPack 2.12 -> Alexey Solodovnikov。
   直接使用PEiD Generic Unpacker插件进行脱壳。(PS:本人手动只脱过UPX,^_^)
   
2. 第二步是侦测软件的加密算法,这一步大大减小了手动跟踪算法的强度。
   这也是我经过SUNBIRD指点,第一次使用Kanal工具进行侦测的 ^_^。
   脱壳后的主程序为EZMerge.exe.unpacked_.exe,再用PEiD检测,用Kanal插件检测其中可能的加密算法。
   发现有MD5算法,初步认为写注册机是不大可能了。
   
3. 第三步是运行程序,进行注册,观察程序反应。
   在Register界面输入FADE用户名和注册码,分别为:
   Name = MrBeer[CCG]
   SN   = VFJ377-7LLHOE-14000。
   注册后,程序提示为重启认证。
   开来我输入的FADE用户名和注册码不是被写入了注册表,就是被写入了KeyFile。
   简单检查了一下程序所在文件夹,通过"时间日期",没有发现最近修改或生成的文件。
   估计写入注册表的可能性大一些。
   搜索注册表,发现了HKEY_LOCAL_MACHINE\SOFTWARE\BoilSoft\EZMerge\SN键下有:
   name=MrBeer[CCG]和sn=VFJ377-7LLHOE-14000两个值。果然!
   
4. 第四步是静态分析,这是我个人的习惯,有助于把握软件的整体构架,理清思路。
   我个人一直认为,破解的精髓是用运头脑来分析,而不仅仅是使用工具来分析、跟踪。
   动手之前多动脑,否则破解就变成了一项体力劳动了,呵呵。
   以前一直使用W32Dasm做静态分析,今天试用一下PLL621大侠的C32ASM。
   虽然界面有些不习惯,但功能可真不是盖的,起码对中文字符串的支持要比W32Dasm和OllyDbg都强。
   不过既然是重启认证类型,就没必要仔细查看字符串了。
   直接在输入表中查找RegQueryValueA/RegQueryValueExA函数,共有7处调用。
   其他有用信息就没有了,呵呵,吹嘘了半天静态分析的习惯,这里没用上,^_^。
   
5. 第五步就是最后的法宝,动态分析了。XP系统下,当然是OllyDbg了。
   我使用的是DYK汉化、修改过的ODbyDYK,功能更强大。
   通过对RegQueryValueA/RegQueryValueExA的API设断,很容易就跟踪到注册码验证部分。
   验证过程是(逻辑过程,有程序实际的实现过程有出入):
   a. name全部转换为小写字母;
   b. 验证sn结构,必须为:xxxxxx-xxxxxx-xxxxx。
   c. 对sn第1段进行MD5运算;
   d. 以sn第1段的MD5结果为常数,对name进行MD5运算;
   e. 对sn第2、3段进行运算;
   f. sn第1段的MD5结果与程序内置的256个MD5值进行比较,必须属于其中之一;
   g. 对name各字符的ASCII码进行累加,以累加结果的低位字节为Index,取出一个内置的MD5值;
   h. 比较该MD5值与sn第1段的MD5值,相同,则验证成功。
   因为本文目的主要时针对MD5,其余验证部分不在此讨论了。
   
=============================

=============================
源码分析

通过对RegQueryValueA/RegQueryValueExA设断,很容易跟踪到这里:
00409FF0    .  E8 B>call EZMerge_.004110B0                ;  --->从注册表中获得sn
00409FF5    .  83C4>add esp,8
00409FF8    .  83CF>or edi,FFFFFFFF
00409FFB    .  85C0 test eax,eax
00409FFD    .  74 7>je short EZMerge_.0040A075
00409FFF    .  8D8C>lea ecx,dword ptr ss:[esp+2E8]
0040A006    .  68 0>push 200
0040A00B    .  51   push ecx
0040A00C    .  E8 1>call EZMerge_.00411130                ;  --->从注册表中获得name
0040A011    .  83C4>add esp,8
0040A014    .  85C0 test eax,eax
0040A016    .  74 5>je short EZMerge_.0040A075
0040A018    .  8D94>lea edx,dword ptr ss:[esp+2E8]
0040A01F    .  8D4C>lea ecx,dword ptr ss:[esp+8]
0040A023    .  52   push edx
0040A024    .  E8 8>call EZMerge_.004635AB
0040A029    .  8D4C>lea ecx,dword ptr ss:[esp+8]
0040A02D    .  C784>mov dword ptr ss:[esp+5648],0
0040A038    .  E8 0>call EZMerge_.00463A3F                ;  --->name字符转换为小写
0040A03D    .  8B54>mov edx,dword ptr ss:[esp+8]
0040A041    .  8D44>lea eax,dword ptr ss:[esp+C]
0040A045    .  8D8C>lea ecx,dword ptr ss:[esp+E8]
0040A04C    .  50   push eax
0040A04D    .  51   push ecx
0040A04E    .  52   push edx
0040A04F    .  E8 0>call EZMerge_.00410D60                ;  --->验证sn(关键CALL)
0040A054    .  83C4>add esp,0C
0040A057    .  85C0 test eax,eax
0040A059    .  74 0>je short EZMerge_.0040A065            ;  --->不跳,验证成功

进入关键CALL:
00410D60   /$  83EC>sub esp,0C                           ;  --->入口
00410D63   |.  8B44>mov eax,dword ptr ss:[esp+10]
........................................................
省略代码若干行
........................................................
00410DD7   |.  B9 0>mov ecx,0E
00410DDC   |.  33C0 xor eax,eax
00410DDE   |.  8BFD mov edi,ebp
00410DE0   |.  6A 2>push 2D                              ;  --->很明显,是查找"-"
00410DE2   |.  F3:A>rep stos dword ptr es:[edi]
00410DE4   |.  53   push ebx
00410DE5   |.  33FF xor edi,edi
00410DE7   |.  8BF3 mov esi,ebx
00410DE9   |.  E8 A>call EZMerge_.0044DC90
00410DEE   |.  83C4>add esp,8
00410DF1   |.  85C0 test eax,eax
00410DF3   |.  74 3>je short EZMerge_.00410E2C
00410DF5   |.  8B5C>mov ebx,dword ptr ss:[esp+20]
00410DF9   |>  47   /inc edi
00410DFA   |.  C600>|mov byte ptr ds:[eax],0
00410DFD   |.  8BCF |mov ecx,edi
00410DFF   |.  40   |inc eax
00410E00   |.  49   |dec ecx                              ;  Switch (cases 1..2)
00410E01   |.  74 0>|je short EZMerge_.00410E10
00410E03   |.  49   |dec ecx
00410E04   |.  75 0>|jnz short EZMerge_.00410E12
00410E06   |.  8974>|mov dword ptr ss:[esp+10],esi        ;  Case 2 of switch 00410E00
00410E0A   |.  8944>|mov dword ptr ss:[esp+28],eax
00410E0E   |.  EB 0>|jmp short EZMerge_.00410E12
00410E10   |>  8BDE |mov ebx,esi                          ;  Case 1 of switch 00410E00
00410E12   |>  6A 2>|push 2D                              ;  Default case of switch 00410E00
00410E14   |.  50   |push eax
00410E15   |.  8BF0 |mov esi,eax
00410E17   |.  E8 7>|call EZMerge_.0044DC90
00410E1C   |.  83C4>|add esp,8
00410E1F   |.  85C0 |test eax,eax
00410E21   |.^ 75 D>\jnz short EZMerge_.00410DF9
00410E23   |.  83FF>cmp edi,2                             ;  --->校验sn格式(必须为xxxxxx-xxxxxx-xxxxx)
00410E26   |.  74 1>je short EZMerge_.00410E3F            ;  --->跳
00410E28   |.  8B5C>mov ebx,dword ptr ss:[esp+24]
00410E2C   |>  53   push ebx
00410E2D   |.  E8 0>call EZMerge_.00463B36
00410E32   |.  83C4>add esp,4
00410E35   |.  33C0 xor eax,eax
00410E37   |.  5F   pop edi
00410E38   |.  5E   pop esi
00410E39   |.  5D   pop ebp
00410E3A   |.  5B   pop ebx
00410E3B   |.  83C4>add esp,0C
00410E3E   |.  C3   retn
00410E3F   |>  803B>cmp byte ptr ds:[ebx],0               ;  --->来到这里
00410E42   |.  0F84>je EZMerge_.00410F8F
00410E48   |.  8B44>mov eax,dword ptr ss:[esp+28]
00410E4C   |.  8038>cmp byte ptr ds:[eax],0
00410E4F   |.  0F84>je EZMerge_.00410F8F
00410E55   |.  8B4C>mov ecx,dword ptr ss:[esp+10]
00410E59   |.  8039>cmp byte ptr ds:[ecx],0
00410E5C   |.  0F84>je EZMerge_.00410F8F
00410E62   |.  8BFB mov edi,ebx
00410E64   |.  83C9>or ecx,FFFFFFFF
00410E67   |.  33C0 xor eax,eax
00410E69   |.  6A 0>push 0
00410E6B   |.  F2:A>repne scas byte ptr es:[edi]
00410E6D   |.  F7D1 not ecx
00410E6F   |.  49   dec ecx
00410E70   |.  51   push ecx
00410E71   |.  53   push ebx
00410E72   |.  E8 1>call EZMerge_.00444090                ;  --->得到sn第一段的MD5
00410E77   |.  50   push eax
00410E78   |.  E8 3>call EZMerge_.00410FB0                ;  转换MD5值为字符串格式
00410E7D   |.  83C4>add esp,10
00410E80   |.  8944>mov dword ptr ss:[esp+14],eax
00410E84   |.  BF 9>mov edi,EZMerge_.0048D990             ;  --->内置MD5所在空间
00410E89   |>  8B37 /mov esi,dword ptr ds:[edi]
00410E8B   |.  8B4C>|mov ecx,dword ptr ss:[esp+14]
00410E8F   |>  8A01 |/mov al,byte ptr ds:[ecx]
00410E91   |.  8AD0 ||mov dl,al
00410E93   |.  3A06 ||cmp al,byte ptr ds:[esi]
00410E95   |.  75 1>||jnz short EZMerge_.00410EB3
00410E97   |.  84D2 ||test dl,dl
00410E99   |.  74 1>||je short EZMerge_.00410EAF
00410E9B   |.  8A41>||mov al,byte ptr ds:[ecx+1]
00410E9E   |.  8AD0 ||mov dl,al
00410EA0   |.  3A46>||cmp al,byte ptr ds:[esi+1]          ;  --->比较sn第1段的MD5值是否属于程序内置的个MD5值之一
00410EA3   |.  75 0>||jnz short EZMerge_.00410EB3
00410EA5   |.  83C1>||add ecx,2
00410EA8   |.  83C6>||add esi,2
00410EAB   |.  84D2 ||test dl,dl
00410EAD   |.^ 75 E>|\jnz short EZMerge_.00410E8F
00410EAF   |>  33C9 |xor ecx,ecx
00410EB1   |.  EB 0>|jmp short EZMerge_.00410EB8
00410EB3   |>  1BC9 |sbb ecx,ecx
00410EB5   |.  83D9>|sbb ecx,-1
00410EB8   |>  85C9 |test ecx,ecx
00410EBA   |.  74 2>|je short EZMerge_.00410EE2           ;  --->跳!!!
00410EBC   |.  83C7>|add edi,4
00410EBF   |.  81FF>|cmp edi,EZMerge_.0048DD90
00410EC5   |.^ 7C C>\jl short EZMerge_.00410E89
00410EC7   |.  8B44>mov eax,dword ptr ss:[esp+24]
00410ECB   |.  8B74>mov esi,dword ptr ss:[esp+18]
00410ECF   |.  50   push eax
00410ED0   |.  E8 6>call EZMerge_.00463B36
00410ED5   |.  83C4>add esp,4
00410ED8   |.  8BC6 mov eax,esi
00410EDA   |.  5F   pop edi
00410EDB   |.  5E   pop esi
00410EDC   |.  5D   pop ebp
00410EDD   |.  5B   pop ebx
00410EDE   |.  83C4>add esp,0C
00410EE1   |.  C3   retn
00410EE2   |>  8BFB mov edi,ebx                           ;  --->来到这里
........................................................
省略代码若干行,并非不重要,而是因为与MD5无关
........................................................
00410F5B   |.  56   push esi
00410F5C   |.  8945>mov dword ptr ss:[ebp+28],eax
00410F5F   |.  8955>mov dword ptr ss:[ebp+2C],edx
00410F62   |.  E8 B>call EZMerge_.00410D20                ;  --->name各字符ASCII码相加,取地位字节
00410F67   |.  55   push ebp
00410F68   |.  8945>mov dword ptr ss:[ebp+30],eax
00410F6B   |.  8955>mov dword ptr ss:[ebp+34],edx
00410F6E   |.  E8 A>call EZMerge_.00411020                ;  --->比较sn第1段MD5与和name对应的MD5
00410F73   |.  83C4>add esp,28
00410F76   |.  8BF0 mov esi,eax                           ;  --->eax=1
00410F78   |.  8B44>mov eax,dword ptr ss:[esp+24]
00410F7C   |.  50   push eax
00410F7D   |.  E8 B>call EZMerge_.00463B36
00410F82   |.  83C4>add esp,4
00410F85   |.  8BC6 mov eax,esi                           ;  --->eax=1
00410F87   |.  5F   pop edi
00410F88   |.  5E   pop esi
00410F89   |.  5D   pop ebp
00410F8A   |.  5B   pop ebx
00410F8B   |.  83C4>add esp,0C
00410F8E   |.  C3   retn
00410F8F   |>  8B4C>mov ecx,dword ptr ss:[esp+24]
00410F93   |.  51   push ecx
00410F94   |.  E8 9>call EZMerge_.00463B36
00410F99   |.  83C4>add esp,4
00410F9C   |>  5F   pop edi
00410F9D   |.  5E   pop esi
00410F9E   |.  5D   pop ebp
00410F9F   |.  33C0 xor eax,eax
00410FA1   |.  5B   pop ebx
00410FA2   |.  83C4>add esp,0C
00410FA5   \.  C3   retn

=============================

=============================
KeyGen

因为程序内置的255个MD5值已知,MD5的明文格式已知,我决定使用暴力破解(注意,不是爆破),生成注册机。
破解工具使用的是A!Die开发的MD5Crack V3.1。
速度飞快,破解255个MD5明文共用时1770秒。
当然,这和明文长度有关。本软件所用明文仅6个字符。如果碰上超常的明文,这种暴力破解方式是不可取的。
根据破解出的255个明文即可写出注册机。

感觉AVI/MPEG/RM/WMV Joiner V4.61还是很不错的软件,这里就不提供它的注册机/源码了。
如果希望FREE使用,呵呵,请使用crsky或者我的注册信息吧。
=============================

=============================
Greets

感谢PEiD/C32ASM/OllyDbg及其插件的开发、修改者,没有他们的杰出工作也就没有本文。
感谢SUNBIRD对PDiD Kanal插件使用的指导。
感谢crsky提供的注册信息。
=============================

=============================
MrBeer[CCG]
03/Jul/2005
=============================