XARA 3D v4.0
虽然网上已有注册机,但本着学习的目的,我还是将它研究了一番,现写出心得如下:
运行xara 3d,发现没有注册有15天限制,且作出来的图的背景上有它的logo,看一下注册方式,只要输入注册码即可,没有用户名什么的,再用fi侦测一下,用aspack
2.1加了壳,脱了它,再运行脱壳后的程序,随便输入几个数字,然后启动trw,下断
bpx hmemcpy ,按f5回到程序,点ok,被trw断下,bd *禁止所有断点,pmodule回到程序的领空,然后小心的按f10,来到如下地方:
:0041F6BA mov eax, dword ptr [esp+00000144] //将注册码送到EAX
:0041F6C1 cmp dword ptr [eax-08], 00000007 //比较注册码的长度是否为7
:0041F6C5 jne 0041F8CA //不对就出错
:0041F6CB movsx edx, byte ptr [eax] //将注册码第一位送到ECX
:0041F6CE push edx
:0041F6CF call 0047C3E8 //比较注册码第1位是否为大写的英文字母
:0041F6D4 add esp, 00000004
:0041F6D7 test eax, eax //检查正确与否的标志
:0041F6D9 je 0041F8CA //不符合条件就出错
:0041F6DF mov eax, dword ptr [esp+00000144] //将注册码送到EAX
:0041F6E6 movsx ecx, byte ptr [eax+01] //将注册码第二位送到ECX
:0041F6EA push ecx
:0041F6EB call 0047C3E8 //比较注册码第2位是否为大写的英文字母
:0041F6F0 add esp, 00000004
:0041F6F3 test eax, eax //检查正确与否的标志
:0041F6F5 je 0041F8CA //不符合条件就出错
:0041F6FB mov edx, dword ptr [esp+00000144]//将注册码送到EAX
:0041F702 movsx eax, byte ptr [edx+02] //将注册码第三位送到ECX
:0041F706 push eax
:0041F707 call 0047C3E8 //比较注册码第3位是否为大写的英文字母
:0041F70C add esp, 00000004
:0041F70F test eax, eax //检查正确与否的标志
:0041F711 je 0041F8CA //不符合条件就出错
:0041F717 mov ecx, dword ptr [esp+00000144]//将注册码送到EAX
:0041F71E movsx edx, byte ptr [ecx+03] //将注册码第四位送到ECX
:0041F722 push edx
:0041F723 call 0047C3E8 //比较注册码第4位是否为大写的英文字母
:0041F728 add esp, 00000004
:0041F72B test eax, eax //检查正确与否的标志
:0041F72D je 0041F8CA //不符合条件就出错
:0041F733 mov eax, dword ptr [esp+00000144]//将注册码送到EAX
:0041F73A movsx ecx, byte ptr [eax+04] //将注册码第五位送到ECX
:0041F73E push ecx
:0041F73F call 0047C3E8 //比较注册码第5位是否为大写的英文字母
:0041F744 add esp, 00000004
:0041F747 test eax, eax //检查正确与否的标志
:0041F749 je 0041F8CA //不符合条件就出错
:0041F74F mov edx, dword ptr [esp+00000144]//将注册码送到EAX
:0041F756 movsx eax, byte ptr [edx+05] //将注册码第六位送到ECX
:0041F75A push eax
:0041F75B call 0047C3E8 //比较注册码第6位是否为大写的英文字母
:0041F760 add esp, 00000004
:0041F763 test eax, eax //检查正确与否的标志
:0041F765 je 0041F8CA //不符合条件就出错
:0041F76B mov ecx, dword ptr [esp+00000144]//将注册码送到EAX
:0041F772 movsx edx, byte ptr [ecx+06] //将注册码第七位送到ECX
:0041F776 push edx
:0041F777 call 0047C3E8 //比较注册码第7位是否为大写的英文字母
:0041F77C add esp, 00000004
:0041F77F test eax, eax //检查正确与否的标志
:0041F781 je 0041F8CA //不符合条件就出错
:0041F787 mov eax, ebp //用EBP的值初始化EAX
:0041F789 mov ecx, ebp //用EBP的值初始化ECX
:0041F78B shr eax, 1 //将EAX的值逻辑右移1次
:0041F78D and eax, 55555555 //将EAX+55555555h,和放到EAX中
:0041F792 and ecx, 55555555 //将ECX+55555555h,和放到ECX中
:0041F798 lea ecx, dword ptr [eax+2*ecx]//将ECX*2再加上EAX,和放到ECX
:0041F79B mov eax, dword ptr [esp+00000144]//将注册码送到EAX
:0041F7A2 imul ecx, 5678DE15 //将ECX*5678DE15h的积放到ECX
:0041F7A8 mov bl, byte ptr [eax+01]//将注册码第二位放入BL中
:0041F7AB mov dl, byte ptr [eax+03]//将注册码第四位放入DL中
:0041F7AE mov byte ptr [esp+32], bl//将BL的值放到ESP+32
:0041F7B2 mov bl, byte ptr [eax]//将注册码第一位放到BL
:0041F7B4 mov byte ptr [esp+30], bl//将BL的值放到ESP+30
:0041F7B8 mov bl, byte ptr [eax+05]//将注册码第六位放到BL
:0041F7BB mov byte ptr [esp+31], bl//将BL的值放到ESP+31
:0041F7BF mov bl, byte ptr [eax+02]//将注册码第三位放到BL
:0041F7C2 mov byte ptr [esp+33], bl//将BL的值放到ESP+33
:0041F7C6 mov bl, byte ptr [eax+06]//将注册码第七位放到BL
:0041F7C9 movsx eax, byte ptr [eax+04]//将注册码第五位放到EAX
:0041F7CD movsx esi, bl//将BL的值,即注册码第七位放到ESI
:0041F7D0 lea eax, dword ptr [eax+2*eax]//将EAX即注册码第五位乘以3,积放到EAX
:0041F7D3 movsx edx, dl//将DL即注册码第四位放到EDX
:0041F7D6 lea eax, dword ptr [esi+8*eax]//将EAX乘以8,再加上ESI即注册码第七位,和放到EAX
:0041F7D9 movsx esi, byte ptr [esp+33]//将ESP+33即注册码第三位放到ESI
:0041F7DE lea eax, dword ptr [eax+2*eax]//将EAX乘以3的积放到EAX
:0041F7E1 lea eax, dword ptr [esi+8*eax]]//将EAX乘以8,再加上ESI即注册码第三位,和放到EAX
:0041F7E4 movsx esi, byte ptr [esp+31]//将ESP+31即注册码第六位放到ESI
:0041F7E9 lea eax, dword ptr [eax+2*eax]//将EAX乘以3的积放到EAX
:0041F7EC lea eax, dword ptr [esi+8*eax]]//将EAX乘以8,再加上ESI即注册码第六位,和放到EAX
:0041F7EF movsx esi, byte ptr [esp+30]//将ESP+30即注册码第一位放到ESI
:0041F7F4 lea eax, dword ptr [eax+2*eax]//将EAX乘以3的积放到EAX
:0041F7F7 lea eax, dword ptr [esi+8*eax]]//将EAX乘以8,再加上ESI即注册码第一位,和放到EAX
:0041F7FA movsx esi, byte ptr [esp+32]//将ESP+32即注册码第二位放到ESI
:0041F7FF lea eax, dword ptr [eax+2*eax]//将EAX乘以3的积放到EAX
:0041F802 lea eax, dword ptr [esi+8*eax]]//将EAX乘以8,再加上ESI即注册码第二位,和放到EAX
:0041F805 lea eax, dword ptr [eax+2*eax]//将EAX乘以3的积放到EAX
:0041F808 lea eax, dword ptr [edx+8*eax-0494DE99]]//将EAX乘以8,再加上ESI即注册码四第位,再减去0494DE99h,最后的结果放到EAX
:0041F80F cmp eax, ecx //比较EAX和ECX的值
:0041F811 jne 0041F8CA //不相等就game over了
好了,现在将它的算法总结如下:
设 EBP=ECFAD166(不同的机器EBP因该不同) B=0494DE99
注册码:M 我暂且将M从高位到低位,每一位上的数字设为M1,M2,M3,M4,M5,M6,M7
他们满足下面这个等式:(其中的shr()代表逻辑右移一次,以下所有等式中的数,如没有特别说明,都为16进制)
[(EBP+55555555)*2+(shr(EBP)+55555555)]*5678de15
= (((((M5*18+M7)*18+M3)*18+M6)*18+M1)*18+M2)*18+M4-B
上面这个等式不好看,将它作下变换,得到下面的等式:
[(EBP+55555555)*2+(shr(EBP)+55555555)]*5678de15+B
= (M5*18^6+M7*18^5+M3*18^4+M6*18^3+M1*18^2+M2*18+M4)
这下就好看多了,B是个固定的常数,想办法得到EBP,我们就可以计算出等式左边的值,当然这个值是一个16进制的数,那么怎么把这个16进制的数与等式的右边对应起来呢,仔细看看
M5*18^6+M7*18^5+M3*18^4+M6*18^3+M1*18^2+M2*18+M4
这个表达式,是不是与这个表达式(等式中的数为10进制)
1*10^6+2*10^5+3*10^4+4*10^3+5*10^2+6*10+7
很相似呢,后面这个表达式写成常规形式就是 123467 这个数,同理,前面那个表达式写成常规形式就是 M5 M7 M3 M6 M1 M2 M4
,当然这是个24进制的7位数,到这里,我们已经看到曙光了,将等式左边的值转换为24进制的数,将我们计算得到的这个7位24进制的数的每一位,分别与M5 M7
M3 M6 M1 M2 M4 对应上,我门就得到了注册码 M 每一位上的数,接下来就好说了,将每一位的顺序调整一下,就得到了我们想要的注册码
M .不过还没有完,我们还需要将M的每一位,对照软件作者给定的24进制转换表,转换成我门可以输入的字符,到此才算结束了,这时才得到了真正的注册码。那么作者给定的24进制转换表在那里呢,我没有找到,但我猜测这张表就是26个大写英文字母,因为如果你的注册码里面含有26个大写英文字母以外的字符时,程序根本不会到达核心对比的地方,就已经game
over了。
下面是我还没有理解的地方:
1。那个EBP在我的机器上始终是ECFAD166 ,不知道在其它的机器上是不是这个值,我想呢,因该是不同的,可能它是根据机器的某个地方的数值计算出来的,无奈我水平有限,找了半天也没有搞清楚这个EBP的值是怎么来到。还请高手指教!!
2。不知道是我的算法分析错误还是我的计算错误,我算了好几遍也没有算对,始终没有得到正确的注册码,无奈之下,上网下载了一个注册机,得到我的注册码是LTIFVPT,可我怎么也算不来这个值。请高手救救我啊!!
3。这是我第一次看懂软件的算法,可惜我不会编程,不知哪位高手能告诉我怎么写它的注册机,让我这个菜鸟也过过做注册机的瘾,哈哈,不要笑我啊!!
好了,不说了,写的够罗嗦的了,浪费了大家这么多时间,有空就帮帮我吧!!
最后还说一点废话:
1.将注册表中的这个键[HKEY_CURRENT_USER\Software\Xara\X3D4\Install]
下的key键删除就又可以注册了;
2.如果你只是想注册的话,则只要填注册码时,随便填入7个大写的字母,然后在
0041F811 jne 0041F8CA 处下 r fl z ,不让程序跳走,就注册成功了,且以后也不要再注册了,跟真正的注册版一模一样!
Cracker:Turkey/灭害灵
2001.12.17@17:40
- 标 题:菜鸟对XARA 3D V4.0的对比和注册码算法的一点心得,请多多指教!! (8千字)
- 作 者:turkey99
- 时 间:2001-12-17 18:00:40
- 链 接:http://bbs.pediy.com