• 标 题:Particle Fire V1.1a
  • 作 者:程式猎人
  • 时 间:2000年6月5日
  • 链 接:http://bbs.pediy.com


简介:这是一个相当好的屏幕保护程序。
追踪:RN:01234567
  这个软件的破解过程对于初学者来说有一定的难度,因为通常的软件在注册过程中就可以看到它的比较过程,而这个软件它不是输入注册码后就进行比较的。它是在软件运算的过程中不断的去比较,所以这个软件在难度上应当属于中级水平。
  因为这个软件是当你输入正确的注册码后才注册成功也就是它使用实时检证的方法,所以现在先输入0123456后,再设bpx hmemcpy后,输入7后被拦下。

:0040254F FFD7                    call edi
:00402551 85C0                    test eax, eax  <-出来的地方,eax=0012d687
:00402553 7423                    je 00402578
:00402555 8D442410                lea eax, dword ptr [esp+10]
:00402559 6A00                    push 00000000
:0040255B 50                      push eax
:0040255C 68F0030000              push 000003F0
:00402561 56                      push esi
:00402562 FFD7                    call edi
:00402564 5D                      pop ebp
:00402565 A314214100              mov dword ptr [00412114], eax <-eax=12d687

* Possible Reference to String Resource ID=00001: "Particle Fire!"
                                  |
:0040256A B801000000              mov eax, 00000001
:0040256F 5F                      pop edi
:00402570 5E                      pop esi
:00402571 5B                      pop ebx
:00402572 83C414                  add esp, 00000014
:00402575 C21000                  ret 0010

  我们在上面的地方被拦下来,仔细分析一下上面的程式,你可以发现在上面程式将我们输入的注册码放在了00412114这个固定地址上。如果你现在向下追踪的话,你将是一无发现,因为程序就如我在前面所说的那样,它不是在下面就进行比较,而是在某个时间来进行比较的。
  现在我们就得使用W32dasm来分析这个软件,查找00412114这个地址,我们将找到几个地址,其中下面的地址是关键的地方,如下所示:

:00402726 A114214100              mov eax, dword ptr [00412114]
:0040272B 50                      push eax
:0040272C E8CFE8FFFF              call 00401000
:00402731 83C404                  add esp, 00000004
:00402734 85C0                    test eax, eax
:00402736 0F852D030000            jne 00402A69
  在这里可是这个软件的比较关键之处,而且如果你在这里设下断点的话,你将无法回到正常的地方,因为程序一值在调用它,用它来不断的验证注册码的正确性。下面是这个软件如何计算注册码的。因为它使用了令人讨厌的XOR操作,而我使用C语言又没有将它给算出来(可能C语言处理XOR时有问题)。

:00401000 8B442404                mov eax, dword ptr [esp+04]
:00401004 56                      push esi
:00401005 3D00CA9A3B              cmp eax, 3B9ACA00  <-1000000000
:0040100A 763D                    jbe 00401049
:0040100C 3D00943577              cmp eax, 77359400  <-2000000000
:00401011 7336                    jnb 00401049
:00401013 8BC8                    mov ecx, eax
:00401015 8BF0                    mov esi, eax
:00401017 C1E114                  shl ecx, 14
:0040101A 8BD0                    mov edx, eax
:0040101C C1E610                  shl esi, 10
:0040101F 81E10000F0FF            and ecx, FFF00000
:00401025 C1EA10                  shr edx, 10
:00401028 0BF2                    or esi, edx
:0040102A 2BD2                    sub edx, edx
:0040102C 33F1                    xor esi, ecx
:0040102E 8BC8                    mov ecx, eax
:00401030 C1E90C                  shr ecx, 0C
:00401033 33F1                    xor esi, ecx
:00401035 B994260000              mov ecx, 00002694
:0040103A 33C6                    xor eax, esi
:0040103C F7F1                    div ecx
:0040103E 85D2                    test edx, edx
:00401040 7507                    jne 00401049  ***

* Possible Reference to String Resource ID=00001: "Particle Fire!"
                                  |
:00401042 B801000000              mov eax, 00000001
:00401047 5E                      pop esi
:00401048 C3                      ret

  好了,现在我使用修改方法来进行这个软件注册,我在这里先输入1234567890后,再修改***处,具体方法如下:

                      ****************************
                      *  查找:85 D2 75 07 B8  *
                      *  替换:85 D2 90 90 B8  *
                      ****************************
  我现在想同大家说的是,我因为没有得到这个软件的注册码而不死心,毕竟我离注册码只有一步之隔,因为我已经知道了这个软件是如何运算的过程。于是我就使用C语言编写了下面的程序,我准备使用穷举法来得到注册码。但是通过下面的程序算出来的注册码是不对的,我仔细的验证了我编写的过程,相信它是绝对没有错误的,所以在这里想请高手来帮助一下,如何能够得到这个软件的注册码(你不论使用什么语言都可以)。

main()
{
unsigned long i,j;
unsigned long eax,ebx,ecx,edx;

clrscr();

for(i=0x3b9aca00;i<0x4190ab00;i++)
  {
  eax=i<<16;
  ebx=i>>16;
  ecx=eax|ebx;

  eax=i<<20;
  ebx=i>>12;
  edx=eax|ebx;

  eax=ecx|edx|i;

  j=eax%0x2694;
  if(j==0)
    {
      printf("\n  Your register number is %lx",i);
      break;
    }
  }
  printf("\n your seach is over!!!");
  getch();
}

声明:此文可以自由拷贝,散发和传播,如果你认为有错误的地方你可以将改正后发表在网上,但是请不要将原作者的名字删除或改变,你可以加上你修改后作者名字,并希望你能将修改的文章发给本人。如果愿意同我讨论的话,可以向下面的邮箱写信。我将非常高兴同你讨论关于解密方面的事情,谢谢。(千万不要给我发病毒或黑客程序啊)
邮箱:programhunter@china.com


附:论坛回应:

序 号:1182
标 题:穷举程序如下:
发信人:郭大志
时 间:2000-6-6 13:23:08
详细信息:

关于Particle Fire, 作者的破解思路是对的,就是用穷举的方法猜注册码,我以前也是这么干的 ,如果不用穷举法,就要求解一个逻辑(主要是异或运算)方程组,而这是相当困难的。实际上对这个屏保程序的注册码的穷举法速度很快。以前在水木清华的某个版(newsoftware还是hacker版记不清了)发过一个穷举注册码的程序。

在城市猎人的程序的基础上修改的。找到的一个最小的注册码为1000002675,适用于v1.1a。

#include <stdio.h>

void main(void)
{
unsigned long i;
unsigned long eax;

for(i = 0x3b9aca00; i < 0x7190ab00; i++)
{

eax = (i >> 16) | (i << 16);
eax ^= (i << 20);
eax ^= (i >> 12);
eax ^= i;

eax %= 0x2694;
if(eax == 0)
{
printf("\nYour register number is %lu",i);
break;
}
}
printf("\n your search is over!!!");
}