【文章标题】: #1 Video Converter破解过程
【文章作者】: xPLK[0GiNr]
【作者主页】:
http://hi.baidu.com/zoo%5F
【软件名称】: #1 Video Converter
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
随便找个转换器来捏捏,找到了这个,NO1 Video Converter
练习读汇编代码,无其他目的,最近发现自己的汇编阅读能力正在下降,所以多练一些。
程序比较简单,注册方法是注册码+算法的形式的,实时验证,天知道那老外想干嘛,在这里使用Sleep停了1s,似乎要制造算法很庞大的样子,其实很简单,而且很搞笑。<br>
算法如下:
0041CE4A |> /8B5424 38 /mov edx, dword ptr [esp+38]
0041CE4E |. |8D4C24 34 |lea ecx, dword ptr [esp+34]
0041CE52 |. |8A82 50864300 |mov al, byte ptr [edx+438650] ; 一个表:Glb,逐一入栈,有很大用处
0041CE58 |. |884424 18 |mov byte ptr [esp+18], al
0041CE5C |. |E8 8FA70000 |call <jmp.&MFC42.#540>
0041CE61 |. |8BFB |mov edi, ebx
0041CE63 |. |83C9 FF |or ecx, FFFFFFFF
0041CE66 |. |33C0 |xor eax, eax
0041CE68 |. |33ED |xor ebp, ebp
0041CE6A |. |F2:AE |repne scas byte ptr es:[edi]
0041CE6C |. |F7D1 |not ecx ; 求注册名长度
0041CE6E |. |49 |dec ecx
0041CE6F |. |C64424 2C 02 |mov byte ptr [esp+2C], 2
0041CE74 |. |74 4B |je short 0041CEC1
0041CE76 |> |8A042B |/mov al, byte ptr [ebx+ebp]
0041CE79 |. |33F6 ||xor esi, esi
0041CE7B |> |3A0475 E88543>||/cmp al, byte ptr [esi*2+4385E8] ; 一个表,偶数位包含了a~z,A~Z等字符,这个循环查询注册名中符合表中位置的字符,并记录下表,保存于esi中
0041CE82 |. |74 08 |||je short 0041CE8C ; 找到就跳
0041CE84 |. |46 |||inc esi
0041CE85 |. |83FE 34 |||cmp esi, 34
0041CE88 |.^|7C F1 ||\jl short 0041CE7B
0041CE8A |. |EB 11 ||jmp short 0041CE9D
0041CE8C |> |8A0C75 E98543>||mov cl, byte ptr [esi*2+4385E9] ; 还是刚才那个表,但是是奇数位,保存着注册码,通过注册码计算得到
0041CE93 |. |51 ||push ecx
0041CE94 |. |8D4C24 38 ||lea ecx, dword ptr [esp+38]
0041CE98 |. |E8 EDA90000 ||call <jmp.&MFC42.#940>
0041CE9D |> |83FE 34 ||cmp esi, 34 ; 如果注册名没有a~z、A~Z就来到这里,使用表中'Glb'中的任意一个
0041CEA0 |. |75 0E ||jnz short 0041CEB0
0041CEA2 |. |8B5424 18 ||mov edx, dword ptr [esp+18]
0041CEA6 |. |8D4C24 34 ||lea ecx, dword ptr [esp+34]
0041CEAA |. |52 ||push edx
0041CEAB |. |E8 DAA90000 ||call <jmp.&MFC42.#940>
0041CEB0 |> |8BFB ||mov edi, ebx
0041CEB2 |. |83C9 FF ||or ecx, FFFFFFFF
0041CEB5 |. |33C0 ||xor eax, eax
0041CEB7 |. |45 ||inc ebp
0041CEB8 |. |F2:AE ||repne scas byte ptr es:[edi]
0041CEBA |. |F7D1 ||not ecx
0041CEBC |. |49 ||dec ecx ; 求长度
0041CEBD |. |3BE9 ||cmp ebp, ecx
0041CEBF |.^|72 B5 |\jb short 0041CE76
0041CEC1 |> |8B4424 34 |mov eax, dword ptr [esp+34]
0041CEC5 |. |8B48 F8 |mov ecx, dword ptr [eax-8]
算法描述,程序使用了一个密码表之类的东西:aEbGcmdleSfmgkhEicjxksltmYnbokpDqtrasftwulvjwDxIyPzZAXBPCoDKEgFyGmHtIaJrKqLNMQNUOuPGQJRLSnTbUCVFWHXoYwZE,算法对注册名与表中的各项逐项对比,若找到相同的,就以该元素的下一元素作为注册码,保存。若不在,就从‘Glb’这三个元素任意取一个来塞。还有,注册码未满16位的,计算得到的注册码需要合并,另一部分是固定字符串‘gEScvDHyOALMBWPs’,但要从尾部减去注册码长度,然后进行合并,计算出来的注册码作为头部,处理过的固定字符串作为尾部。
例如,注册名0GiNr,‘0’不在该表中,所以随便填写一个‘G’,然后慢慢找。‘GiNr’分别对应着‘bmcUa’,然后固定字符串减去5,得到gEScvDHyOAL,所以注册名为‘0GiNr’的时候,注册码为‘bmcUagEScvDHyOAL’或者‘GmcUagEScvDHyOAL’或者‘bmcUagEScvDHyOAL’。
好了,可以开始钻空子了!从算法得知,如果注册名中没有A~Z(大小写),且长度大于16时,算法会用‘Glb’随便填充(但是要一样的),而且不会引入那个固定字符串的东西。所以,注册码我们写16个数字,然后注册码就是16个G或者b或者l,结果注册成功了。。汗吧?该算法的漏洞实在太大了。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年06月28日 21:40:53
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法