00404506  |> 3BC3           CMP EAX,EBX 
00404508  |. 75 41          JNZ SHORT LIAOCACH.0040454B 
0040450A  |. 8D7424 48      LEA ESI,DWORD PTR SS:[ESP+48]           <--嘿嘿,都讲了三遍了,你一定明白了吧,所以我把这最后一段留给你自己来看吧,从这里到00404530处我相信你猜也猜的出来  (众人:鄙视你!) 
0040450E  |. 8D4424 28      LEA EAX,DWORD PTR SS:[ESP+28] 
00404512  |> 8A10           /MOV DL,BYTE PTR DS:[EAX] 
00404514  |. 8ACA           |MOV CL,DL 
00404516  |. 3A16           |CMP DL,BYTE PTR DS:[ESI] 
00404518  |. 75 1C          |JNZ SHORT LIAOCACH.00404536 
0040451A  |. 3ACB           |CMP CL,BL 
0040451C  |. 74 14          |JE SHORT LIAOCACH.00404532 
0040451E  |. 8A50 01        |MOV DL,BYTE PTR DS:[EAX+1] 
00404521  |. 8ACA           |MOV CL,DL 
00404523  |. 3A56 01        |CMP DL,BYTE PTR DS:[ESI+1] 
00404526  |. 75 0E          |JNZ SHORT LIAOCACH.00404536 
00404528  |. 83C0 02        |ADD EAX,2 
0040452B  |. 83C6 02        |ADD ESI,2 
0040452E  |. 3ACB           |CMP CL,BL 
00404530  |.^75 E0          \JNZ SHORT LIAOCACH.00404512 
00404532  |> 33C0           XOR EAX,EAX                            <--全部通过后来到这里 
00404534  |. EB 05          JMP SHORT LIAOCACH.0040453B 
00404536  |> 1BC0           SBB EAX,EAX 
00404538  |. 83D8 FF        SBB EAX,-1 
0040453B  |> 3BC3           CMP EAX,EBX 
0040453D  |. 75 0C          JNZ SHORT LIAOCACH.0040454B 
0040453F  |. 8BC7           MOV EAX,EDI 
00404541  |. 5F             POP EDI 
00404542  |. 5E             POP ESI 
00404543  |. 5D             POP EBP 
00404544  |. 5B             POP EBX 
00404545  |. 83C4 54        ADD ESP,54 
00404548  |. C2 0400        RETN 4 
我的注释写的还算清楚吧 ^_^,我再大概给你讲解一下: 
软件的注册码是这样计算出来的,机器码中的各个字符的ASCII码加上1500后除以62的余数在密码表中对应的字符,就是相应的注册码。 
比如说我这里的机器码为xn2urkeUMwpNv5xZ,x的ASCII码为78(十进制120) 78+5DC的值为654(即1620) 接着用1620除以3E(62)得商26余8,好的,我们从“密码表”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ的开始处向后数8下,就会到了8这个字符,嘿嘿,这就是x对应的注册码。 
好的,我给出Delphi的注册机(我仍将其写为函数的形式): 
function KeyGen(Name: String): String; 
var 
 S:String[16]; 
 P:String; 
 Key:String; 
 i,N,Z:integer; 
begin 
 P:='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
 if Length(Name)<16 then 
   Result:='机器码必须为16位...' 
 else 
   begin 
     S:=Name; 
     for i:=1 to 16 do 
       begin 
         N:=Ord(S
); 
         N:=N+1500; 
         Z:= N mod 62; 
         Z:=Z+1; 
         Key:=Key+P[Z]; 
       end; 
     Result:=Key; 
   end; 
end; 
呵呵,这一章就是最后一章了,现在也写完了.... 打个Kiss~~ 
<本章完> 
 