• 标 题:cardIt V1.2
  • 作 者:飞狐
  • 时 间:2002/09/01 08:22pm 
  • 链 接:http://bbs.pediy.com

万丈高楼平地起,学PJ先打好基础,最好下载后自己先练习追踪一下,否则只是come easy go easy.
cardIt V1.2是专业的名片设计系统,运行于Windows95/98/NT4平台,它不仅适应于名片设计,还适应于各种证件、卡片的制作。
前面的过程,我想你应该了解吧。又给版主添麻烦了。~~~~~~~

:004156B9 E840FC0200              call 004452FE
:004156BE 8BCE                    mov ecx, esi
:004156C0 E82B000000              call 004156F0此处要按F8进入。
:004156C5 85C0                    test eax, eax
:004156C7 6A00                    push 00000000
:004156C9 6A00                    push 00000000
:004156CB 7412                    je 004156DF 为零则跳转到失败处
***************************
:004156F0 64A100000000            mov eax, dword ptr fs:[00000000]
                           
:004156F6 6AFF                    push FFFFFFFF
:004156F8 68D8834600              push 004683D8
:004156FD 50                      push eax
:004156FE 64892500000000          mov dword ptr fs:[00000000], esp
:00415705 83EC38                  sub esp, 00000038
:00415708 56                      push esi
:00415709 8B74244C                mov esi, dword ptr [esp+4C]
:0041570D 837EF810                cmp dword ptr [esi-08], 00000010
[esi-08]是你所输入的注册码的长度。如果不是16个就跳.
:00415711 0F85C0000000            jne 004157D7
:00415717 BAF7FFFFFF              mov edx, FFFFFFF7
:0041571C 33C9                    xor ecx, ecx
:0041571E 8D4609                  lea eax, dword ptr [esi+09]此处是把你所输入的注册码的首地址+9赋值给EAX,也就是取第10位数字
:00415721 2BD6                    sub edx, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00415742(C)
|
:00415723 0FBE70F9                movsx esi, byte ptr [eax-07]此处首先是取第三位数字。
:00415727 83EE30                  sub esi, 00000030把其ASCII值减30
:0041572A 89740C04                mov dword ptr [esp+ecx+04], esi存入此处,需要注意此处地址每次地址都不一样。
:0041572E 83C104                  add ecx, 00000004 ECX+4
:00415731 0FBE30                  movsx esi, byte ptr [eax]见上。
:00415734 83EE30                  sub esi, 00000030把其ASCII值减30
:00415737 40                      inc eax地址指针加1
:00415738 89740C1C                mov dword ptr [esp+ecx+1C], esi存入此处,需要注意此处地址每次地址都不一样。
:0041573C 8D3402                  lea esi, dword ptr [edx+eax]
:0041573F 83FE07                  cmp esi, 00000007是否循环7次。
:00415742 7CDF                    jl 00415723低于继续循环,否则进行比较。
上面的取所输入的注册码的的顺序是,第3位、第10位、第4位、第11位、第5位、
第12位、第6位、第13位、第7位、第14位、第8位、第15位、第9位、第16位。
而其ASCII值减30存入地址依次是:70EB20、70EB3C、70EB24、70EB40、70EB28、
70EB44、70EB2C、70EB48、70EB30、70EB4C、70EB34、70EB50、70EB38、70EB54
:00415744 8B442430                mov eax, dword ptr [esp+30]
:00415748 8B4C2404                mov ecx, dword ptr [esp+04]
:0041574C 03C1                    add eax, ecx
:0041574E 83F809                  cmp eax, 00000009
这一部分是第3位注册码与第14位注册码相加之和是否等于9
:00415751 0F8580000000            jne 004157D7不相同就跳到失败处
:00415757 8B542428                mov edx, dword ptr [esp+28]
:0041575B 8B442408                mov eax, dword ptr [esp+08]
:0041575F 03D0                    add edx, eax
:00415761 83FA09                  cmp edx, 00000009
这一部分是第4位注册码与第12位注册码相加之和是否等于9
:00415764 7571                    jne 004157D7不相同就跳到失败处
:00415766 8B4C240C                mov ecx, dword ptr [esp+0C]
:0041576A 8B542434                mov edx, dword ptr [esp+34]
:0041576E 03D1                    add edx, ecx
:00415770 83FA09                  cmp edx, 00000009
这一部分是第5位注册码与第15位注册码相加之和是否等于9
:00415773 7562                    jne 004157D7不相同就跳到失败处
:00415775 8B442410                mov eax, dword ptr [esp+10]
:00415779 8B4C242C                mov ecx, dword ptr [esp+2C]
:0041577D 03C8                    add ecx, eax
:0041577F 3BCA                    cmp ecx, edx
这一部分是第6位注册码与第13位注册码相加之和是否等于9
:00415781 7554                    jne 004157D7不相同就跳到失败处
:00415783 8B542414                mov edx, dword ptr [esp+14]
:00415787 8B442420                mov eax, dword ptr [esp+20]
:0041578B 03C2                    add eax, edx
:0041578D 83F809                  cmp eax, 00000009
这一部分是第7位注册码与第10位注册码相加之和是否等于9
:00415790 7545                    jne 004157D7不相同就跳到失败处
:00415792 8B4C2418                mov ecx, dword ptr [esp+18]
:00415796 8B542424                mov edx, dword ptr [esp+24]
:0041579A 03D1                    add edx, ecx
:0041579C 3BD0                    cmp edx, eax
这一部分是第8位注册码与第11位注册码相加之和是否等于9
:0041579E 7537                    jne 004157D7不相同就跳到失败处
:004157A0 8B44241C                mov eax, dword ptr [esp+1C]
:004157A4 8B4C2438                mov ecx, dword ptr [esp+38]
:004157A8 03C8                    add ecx, eax
:004157AA 83F909                  cmp ecx, 00000009
这一部分是第9位注册码与第16位注册码相加之和是否等于9
:004157AD 7528                    jne 004157D7不相同就跳到失败处
:004157AF 8D4C244C                lea ecx, dword ptr [esp+4C]
:004157B3 C7442444FFFFFFFF        mov [esp+44], FFFFFFFF
:004157BB E8C9FD0200              call 00445589
:004157C0 B801000000              mov eax, 00000001 01是成功标志。
:004157C5 5E                      pop esi
:004157C6 8B4C2438                mov ecx, dword ptr [esp+38]
:004157CA 64890D00000000          mov dword ptr fs:[00000000], ecx
:004157D1 83C444                  add esp, 00000044
:004157D4 C20400                  ret 0004
总结:
前两位可以是任意字符,而后14位注册码的算法是:
        第3位注册码+第14位注册码=9
        第4位注册码+第12位注册码=9
        第5位注册码+第15位注册码=9
        第6位注册码+第13位注册码=9
        第7位注册码+第10位注册码=9
        第8位注册码+第11位注册码=9
        第9位注册码+第16位注册码=9
如:$%00000009999999