呵~前些时间写了软件的算法分析!!!
没有写总结也没有写算法注意机~~今天刚好有时间就做个总结~也把注册源码发了上~~~供大家

英汉互译王V2007算法分析!!!!!!!
1.一款快速高效的英汉翻译软件,不仅可以实现英汉互译,还可实现繁简互译。并伴有语音朗读功能。您在平时学习英语的过程中、上网浏览英文站点时、看英文原版书籍时、或是在做翻译工作时。你需要一个工具帮助您,从而使语言不再成为你前进的障碍,体验异彩纷呈的精神文明和文化世界,我们推荐您使用《英汉互译王》。她将是您工作、学习、网上生活的理想小伴侣。娃娃软件,科技开创美丽生活,祝您使用愉快。
2.用到的软件是PEID OD。
3。我从看雪论坛精华9看到《英汉互译王V2007 算法分析之“联想分析法”》文章.大家可以看看它是怎么做的。我觉的可以,但我觉得要想了解软件算法,就要认认真真的去分析软件的算法CALL,才能比较完整的了解软件的算法。不是仅凭一些联想就可以找软件的算精要的。
4。因此有这个算法分析。希望可以给大家一点启示。
004A974C  /$  55            PUSH EBP
004A974D  |.  8BEC          MOV EBP,ESP
004A974F  |.  51            PUSH ECX
004A9750  |.  B9 07000000   MOV ECX,7
004A9755  |>  6A 00         /PUSH 0
004A9757  |.  6A 00         |PUSH 0
004A9759  |.  49            |DEC ECX
004A975A  |.^ 75 F9         \JNZ SHORT Ectk.004A9755
004A975C  |.  874D FC       XCHG DWORD PTR SS:[EBP-4],ECX
004A975F  |.  53            PUSH EBX
004A9760  |.  56            PUSH ESI
004A9761  |.  57            PUSH EDI
004A9762  |.  894D F8       MOV DWORD PTR SS:[EBP-8],ECX
004A9765  |.  8955 FC       MOV DWORD PTR SS:[EBP-4],EDX             ;  放入固定字符
004A9768  |.  8BD8          MOV EBX,EAX                              ;  机器码
004A976A  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004A976D  |.  E8 C6ADF5FF   CALL Ectk.00404538
004A9772  |.  33C0          XOR EAX,EAX
004A9774  |.  55            PUSH EBP
004A9775  |.  68 4E994A00   PUSH Ectk.004A994E
004A977A  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
004A977D  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
004A9780  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
004A9783  |.  8BC3          MOV EAX,EBX
004A9785  |.  E8 26FFFFFF   CALL Ectk.004A96B0                       ;  把机器码转化为16进制数
004A978A  |.  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
004A978D  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004A9790  |.  E8 1BFFFFFF   CALL Ectk.004A96B0                       ;  把固定字符4k6d8r转化为16进制数
004A9795  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
004A9798  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
004A979B  |.  E8 80A9F5FF   CALL Ectk.00404120
004A97A0  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]            ;  把固定字符4k6d8r转化为16进制数给EAX
004A97A3  |.  E8 A0ABF5FF   CALL Ectk.00404348                       ;  算出把固定字符4k6d8r转化为16进制数的位数
004A97A8  |.  D1F8          SAR EAX,1                                ;   算出EAX=12算术右移1位EAX=6
004A97AA  |.  79 03         JNS SHORT Ectk.004A97AF
004A97AC  |.  83D0 00       ADC EAX,0
004A97AF  |>  85C0          TEST EAX,EAX
004A97B1  |.  0F8E 54010000 JLE Ectk.004A990B
004A97B7  |.  8945 E0       MOV DWORD PTR SS:[EBP-20],EAX            ;  把EAX=6给SS:[EBP-20]。
004A97BA  |.  BE 01000000   MOV ESI,1
004A97BF  |>  83FE 01       /CMP ESI,1
004A97C2  |.  74 0B         |JE SHORT Ectk.004A97CF
004A97C4  |.  8D45 EC       |LEA EAX,DWORD PTR SS:[EBP-14]
004A97C7  |.  8B55 E8       |MOV EDX,DWORD PTR SS:[EBP-18]
004A97CA  |.  E8 51A9F5FF   |CALL Ectk.00404120
004A97CF  |>  8D45 E8       |LEA EAX,DWORD PTR SS:[EBP-18]
004A97D2  |.  E8 B1A8F5FF   |CALL Ectk.00404088
004A97D7  |.  8B45 EC       |MOV EAX,DWORD PTR SS:[EBP-14]
004A97DA  |.  E8 69ABF5FF   |CALL Ectk.00404348                      ;  算出字符位数是40位的
004A97DF  |.  8BF8          |MOV EDI,EAX                             ;  给EDI
004A97E1  |.  D1FF          |SAR EDI,1                               ;   算出EAX=40算术右移1位EAX=20
004A97E3  |.  79 03         |JNS SHORT Ectk.004A97E8
004A97E5  |.  83D7 00       |ADC EDI,0
004A97E8  |>  85FF          |TEST EDI,EDI
004A97EA  |.  0F8E 11010000 |JLE Ectk.004A9901
004A97F0  |.  BB 01000000   |MOV EBX,1                               ;  EBX置1
004A97F5  |>  BA 5C994A00   |/MOV EDX,Ectk.004A995C
004A97FA  |.  8D45 D8       ||LEA EAX,DWORD PTR SS:[EBP-28]          ;  EAX
004A97FD  |.  E8 2E94F5FF   ||CALL Ectk.00402C30                     ;  EAX置2 ECX清0 SS:[EBP-28]存入0124
004A9802  |.  8D45 D4       ||LEA EAX,DWORD PTR SS:[EBP-2C]          ;  堆栈地址=0012ECC4
004A9805  |.  8BD3          ||MOV EDX,EBX
004A9807  |.  03D2          ||ADD EDX,EDX                            ;  EDX+EDX
004A9809  |.  8B4D EC       ||MOV ECX,DWORD PTR SS:[EBP-14]          ;  SS:[EBP-14]中存入的是一个40位数的字符串
004A980C  |.  8A5411 FE     ||MOV DL,BYTE PTR DS:[ECX+EDX-2]         ;  循环取字任符的奇数位给DL,字符取出是EDI控制的
004A9810  |.  8850 01       ||MOV BYTE PTR DS:[EAX+1],DL             ;  DL给DS:[EAX+1]
004A9813  |.  C600 01       ||MOV BYTE PTR DS:[EAX],1                ;  DS:[EAX]置1
004A9816  |.  8D55 D4       ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A9819  |.  8D45 D8       ||LEA EAX,DWORD PTR SS:[EBP-28]
004A981C  |.  B1 02         ||MOV CL,2
004A981E  |.  E8 DD93F5FF   ||CALL Ectk.00402C00
004A9823  |.  8D55 D8       ||LEA EDX,DWORD PTR SS:[EBP-28]
004A9826  |.  8D45 D0       ||LEA EAX,DWORD PTR SS:[EBP-30]
004A9829  |.  E8 0294F5FF   ||CALL Ectk.00402C30
004A982E  |.  8D45 D4       ||LEA EAX,DWORD PTR SS:[EBP-2C]
004A9831  |.  8BD3          ||MOV EDX,EBX
004A9833  |.  03D2          ||ADD EDX,EDX
004A9835  |.  8B4D EC       ||MOV ECX,DWORD PTR SS:[EBP-14]          ;  SS:[EBP-14]中存入的是一个40位数的字符串
004A9838  |.  8A5411 FF     ||MOV DL,BYTE PTR DS:[ECX+EDX-1]         ;  循环取字任符的偶数位给DL,字符取出是EDI控制的
004A983C  |.  8850 01       ||MOV BYTE PTR DS:[EAX+1],DL
004A983F  |.  C600 01       ||MOV BYTE PTR DS:[EAX],1
004A9842  |.  8D55 D4       ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A9845  |.  8D45 D0       ||LEA EAX,DWORD PTR SS:[EBP-30]
004A9848  |.  B1 03         ||MOV CL,3
004A984A  |.  E8 B193F5FF   ||CALL Ectk.00402C00
004A984F  |.  8D55 D0       ||LEA EDX,DWORD PTR SS:[EBP-30]
004A9852  |.  8D45 DC       ||LEA EAX,DWORD PTR SS:[EBP-24]
004A9855  |.  E8 92AAF5FF   ||CALL Ectk.004042EC
004A985A  |.  8B45 DC       ||MOV EAX,DWORD PTR SS:[EBP-24]
004A985D  |.  E8 BEEFF5FF   ||CALL Ectk.00408820
004A9862  |.  8845 E7       ||MOV BYTE PTR SS:[EBP-19],AL            ;  把取的字符存到SS;[EBP19]中
004A9865  |.  BA 5C994A00   ||MOV EDX,Ectk.004A995C
004A986A  |.  8D45 D8       ||LEA EAX,DWORD PTR SS:[EBP-28]
004A986D  |.  E8 BE93F5FF   ||CALL Ectk.00402C30
004A9872  |.  8D45 D4       ||LEA EAX,DWORD PTR SS:[EBP-2C]
004A9875  |.  8BD6          ||MOV EDX,ESI                            ;  只有完成一个大的循环才会加ESI加1
004A9877  |.  03D2          ||ADD EDX,EDX
004A9879  |.  8B4D F0       ||MOV ECX,DWORD PTR SS:[EBP-10]          ;  SS:[EBP-10]存放的是固定字符转化的16进制数
004A987C  |.  8A5411 FE     ||MOV DL,BYTE PTR DS:[ECX+EDX-2]         ;  循环取字任符的奇数位给DL,字符取出是esi控制的
004A9880  |.  8850 01       ||MOV BYTE PTR DS:[EAX+1],DL
004A9883  |.  C600 01       ||MOV BYTE PTR DS:[EAX],1
004A9886  |.  8D55 D4       ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A9889  |.  8D45 D8       ||LEA EAX,DWORD PTR SS:[EBP-28]
004A988C  |.  B1 02         ||MOV CL,2
004A988E  |.  E8 6D93F5FF   ||CALL Ectk.00402C00
004A9893  |.  8D55 D8       ||LEA EDX,DWORD PTR SS:[EBP-28]
004A9896  |.  8D45 D0       ||LEA EAX,DWORD PTR SS:[EBP-30]
004A9899  |.  E8 9293F5FF   ||CALL Ectk.00402C30
004A989E  |.  8D45 D4       ||LEA EAX,DWORD PTR SS:[EBP-2C]
004A98A1  |.  8BD6          ||MOV EDX,ESI                            ;  只有完成一个大的循环才会加ESI加1
004A98A3  |.  03D2          ||ADD EDX,EDX
004A98A5  |.  8B4D F0       ||MOV ECX,DWORD PTR SS:[EBP-10]          ;  SS:[EBP-10]存放的是固定字符转化的16进制数12位固定数
004A98A8  |.  8A5411 FF     ||MOV DL,BYTE PTR DS:[ECX+EDX-1]         ;  循环取字任符的奇数位给DL,字符取出是esi控制的
004A98AC  |.  8850 01       ||MOV BYTE PTR DS:[EAX+1],DL
004A98AF  |.  C600 01       ||MOV BYTE PTR DS:[EAX],1
004A98B2  |.  8D55 D4       ||LEA EDX,DWORD PTR SS:[EBP-2C]
004A98B5  |.  8D45 D0       ||LEA EAX,DWORD PTR SS:[EBP-30]
004A98B8  |.  B1 03         ||MOV CL,3
004A98BA  |.  E8 4193F5FF   ||CALL Ectk.00402C00
004A98BF  |.  8D55 D0       ||LEA EDX,DWORD PTR SS:[EBP-30]
004A98C2  |.  8D45 CC       ||LEA EAX,DWORD PTR SS:[EBP-34]
004A98C5  |.  E8 22AAF5FF   ||CALL Ectk.004042EC
004A98CA  |.  8B45 CC       ||MOV EAX,DWORD PTR SS:[EBP-34]
004A98CD  |.  E8 4EEFF5FF   ||CALL Ectk.00408820
004A98D2  |.  3245 E7       ||XOR AL,BYTE PTR SS:[EBP-19]            ;  把40位数足的2位数和12位固定数的2位进行逻辑或运算
004A98D5  |.  8845 E6       ||MOV BYTE PTR SS:[EBP-1A],AL            ;  把结果存到SS:[EBP-1A]中
004A98D8  |.  8D45 C4       ||LEA EAX,DWORD PTR SS:[EBP-3C]
004A98DB  |.  8A55 E6       ||MOV DL,BYTE PTR SS:[EBP-1A]
004A98DE  |.  E8 8DA9F5FF   ||CALL Ectk.00404270
004A98E3  |.  8B45 C4       ||MOV EAX,DWORD PTR SS:[EBP-3C]
004A98E6  |.  8D55 C8       ||LEA EDX,DWORD PTR SS:[EBP-38]
004A98E9  |.  E8 C2FDFFFF   ||CALL Ectk.004A96B0
004A98EE  |.  8B55 C8       ||MOV EDX,DWORD PTR SS:[EBP-38]
004A98F1  |.  8D45 E8       ||LEA EAX,DWORD PTR SS:[EBP-18]
004A98F4  |.  E8 57AAF5FF   ||CALL Ectk.00404350
004A98F9  |.  43            ||INC EBX
004A98FA  |.  4F            ||DEC EDI
004A98FB  |.^ 0F85 F4FEFFFF |\JNZ Ectk.004A97F5
004A9901  |>  46            |INC ESI
004A9902  |.  FF4D E0       |DEC DWORD PTR SS:[EBP-20]
004A9905  |.^ 0F85 B4FEFFFF \JNZ Ectk.004A97BF
004A990B  |>  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004A990E  |.  8B55 E8       MOV EDX,DWORD PTR SS:[EBP-18]
004A9911  |.  E8 C6A7F5FF   CALL Ectk.004040DC
004A9916  |.  33C0          XOR EAX,EAX
004A9918  |.  5A            POP EDX
004A9919  |.  59            POP ECX
004A991A  |.  59            POP ECX
004A991B  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
004A991E  |.  68 55994A00   PUSH Ectk.004A9955
004A9923  |>  8D45 C4       LEA EAX,DWORD PTR SS:[EBP-3C]
004A9926  |.  BA 03000000   MOV EDX,3
004A992B  |.  E8 7CA7F5FF   CALL Ectk.004040AC
004A9930  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
004A9933  |.  E8 50A7F5FF   CALL Ectk.00404088
004A9938  |.  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
004A993B  |.  BA 04000000   MOV EDX,4
004A9940  |.  E8 67A7F5FF   CALL Ectk.004040AC
004A9945  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
004A9948  |.  E8 3BA7F5FF   CALL Ectk.00404088
004A994D  \.  C3            RETN
004A994E   .^ E9 39A1F5FF   JMP Ectk.00403A8C
004A9953   .^ EB CE         JMP SHORT Ectk.004A9923
004A9955   .  5F            POP EDI
004A9956   .  5E            POP ESI
004A9957   .  5B            POP EBX
004A9958   .  8BE5          MOV ESP,EBP
004A995A   .  5D            POP EBP
004A995B   .  C3            RETN
\\*********************************************************************************\\ 
也把算法做个总结:
1. 软件把机器位数(M)做为了控制内置的for 循环的控制参数!
2. 软件也把内置的字符串位(K)做为了外层for 循环的控制参数!
3. 作者把机器的每个字符ASCII与内字符串的第一个字符进行逻辑或运算把结果保存起!!总共循环M次。
4. 在把保存起的结果与内置字符串的下个字符进行逻辑或运算,总共循环K次。
5. 输出注册码时如果每次逻辑或运算的结果小于两位数。哪就在这个字符前用0进行填充。
6 这个算法注册机的的源码是用C++写的,通过了VC++6.0!!!如果想注册软件清VC++6.0编译!!
using namespace std;
void main()
{  
  char a[20];                              //定义一个存放机器码的空字符串数组                           
  char b[] = "4k6d8r";                       //这这个是程内置的字符串
    cout<<"清输入你的机器码: "<<endl;
  cin>>a;                                  //接收机器码
  int i, j, k, n;
  n = strlen(b);                           // 计算机器码的位数

  k = strlen(a);                           //计算内置字符串的位数
  for(i=0;i<n;i++)                         //这个for 循环是用来取内置字符的ASCII的
    for(j=0;j<k;j++)                     //这个内置的for 循环是用来取字符数组a[j]
    {
           a[j] = a[j] ^ b[i];               //把字符数组A[J]中的ASCII XOR 内置字符数组中的ASCII把它们的结果
    }                                    //保存到A[J]数组中
   for(j=0;j<k;j++)                        //这for 循环个是用来打出我们的注册码的
   {
     if(a[j]<10)                         //用来检查我们算出的数组中每个元素是否为个位是的话
     {                                   //  就用0填充
       printf("%X",0,a[j]); 
     }                                   
     
     printf("%X",a[j]);
     
   }
    printf("\n");
}