• 标 题:菜鸟对XARA 3D V4.0的对比和注册码算法的一点心得,请多多指教!! (8千字)
  • 作 者:turkey99
  • 时 间:2001-12-17 18:00:40
  • 链 接:http://bbs.pediy.com

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

  • 标 题:那大段判断unlock code的代码都是障眼法,要写注册机应该跟踪它启动时判断Key的过程 (172字)
  • 作 者:blowfish
  • 时 间:2001-12-17 18:16:48

或者强行修改,让它认为unlock code是正确的,然后跟踪它生成key的过程。

只要unlock code正确,它就会生成key并写入注册表,每次启动时只建查Key。

所以说unlock code是障眼法。