【破文标题】  BoxShotMaker1.88注册算法分析+汇编注册机
【破文作者】  snake
【软件名称】  Box Shot Maker 1.88
【下载地址】  http://yncnc.onlinedown.net/soft/44994.htm
【软件简介】  一款能把普通的一维图片转变成具有三维效果的图片。自带了一个简单的图形编辑器。
【调试环境】  Windows 2000+SP4、PEiD、Ollydbg
【作者声明】  只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

--------------------------------------------------------------------------------------
【算法总结】

注册码长度为50位,以"12345678901234567890123456789012345678901234567890"为例
1、第2位为字符'-'
2、第11位为字符'Y'
3、第41~44位为字符'BSM1'
4、取注册码前6位的每一位的ASCII值%10+30分别得到注册码的最后6位
   则注册码转换为"1-34567890Y23456789012345678901234567890BSM1951234"
5、将第2位换为字符‘#’
6、从常串"1z1h+2a0n-0g8y*9a1n|"第3位起分别取值与注册码从第2位起分别取值进行运算得到注册码的第12~19位
   结果为"1#34567890YIRNVLHHT012345678901234567890BSM1951234"
7、从注册码第2位起依次取相邻3位进行运算生成一个新的16位字符串+"ZY"得字符串"ovcplrkflaewqmcoZY"
8、依次取新字符串相邻两位进行运算得注册码第25~40位
9、注册码第24位为0~9之间的值,其余位任意
得最终注册码为"1-34567890YIRNVLHHT01234XBKARTDKIKFSKTJPBSM1951234",具体运算过程见下面分析

【破解过程】

一、程序脱壳

用PEiD查壳,为ASPack 2.001 -> Alexey Solodovnikov,OD载入手动脱壳(略)
脱壳后查为Borland C++ DLL Method 1

二、算法分析

分别输入Email Address,Registration Code,根据提示的错误信息,可断在此处

0042C4E5    .  8BEC            mov ebp,esp
0042C4E7    .  83C4 94         add esp,-6C
0042C4EA    .  8955 98         mov dword ptr ss:[ebp-68],edx
0042C4ED    .  8945 9C         mov dword ptr ss:[ebp-64],eax
0042C4F0    .  B8 C4155200     mov eax,x.005215C4
0042C4F5    .  E8 86D80C00     call x.004F9D80
0042C4FA    .  66:C745 B0 0800 mov word ptr ss:[ebp-50],8
0042C500    .  8D45 FC         lea eax,dword ptr ss:[ebp-4]
0042C503    .  E8 685FFDFF     call x.00402470
0042C508    .  8BD0            mov edx,eax
0042C50A    .  FF45 BC         inc dword ptr ss:[ebp-44]
0042C50D    .  8B4D 9C         mov ecx,dword ptr ss:[ebp-64]
0042C510    .  8B81 00030000   mov eax,dword ptr ds:[ecx+300]
0042C516    .  E8 E5E80700     call x.004AAE00
0042C51B    .  8D45 FC         lea eax,dword ptr ss:[ebp-4]
0042C51E    .  E8 5DEEFFFF     call x.0042B380                               ;  取输入的Email长度
0042C523    .  83F8 03         cmp eax,3                                     ;  是否有效
0042C526    .  7C 6A           jl short x.0042C592
0042C528    .  8D45 F8         lea eax,dword ptr ss:[ebp-8]
0042C52B    .  E8 405FFDFF     call x.00402470
......
0042C5F3    .  66:C745 B0 2000 mov word ptr ss:[ebp-50],20
0042C5F9    .  8D45 EC         lea eax,dword ptr ss:[ebp-14]
0042C5FC    .  E8 6F5EFDFF     call x.00402470
0042C601    .  8BD0            mov edx,eax
0042C603    .  FF45 BC         inc dword ptr ss:[ebp-44]
0042C606    .  8B4D 9C         mov ecx,dword ptr ss:[ebp-64]
0042C609    .  8B81 04030000   mov eax,dword ptr ds:[ecx+304]
0042C60F    .  E8 ECE70700     call x.004AAE00
0042C614    .  8D55 EC         lea edx,dword ptr ss:[ebp-14]
0042C617    .  FF32            push dword ptr ds:[edx]                       ; /取徦码
0042C619    .  E8 DAE9FFFF     call x.0042AFF8                               ; \算法call,跟进
0042C61E    .  59              pop ecx
0042C61F    .  8B0D E09B5200   mov ecx,dword ptr ds:[529BE0]                 ;  x._Form1
0042C625    .  8B11            mov edx,dword ptr ds:[ecx]
0042C627    .  8882 91050000   mov byte ptr ds:[edx+591],al                  ;  设置标志位
0042C62D    .  FF4D BC         dec dword ptr ss:[ebp-44]
0042C630    .  8D45 EC         lea eax,dword ptr ss:[ebp-14]
0042C633    .  BA 02000000     mov edx,2
0042C638    .  E8 D7780D00     call x.00503F14
0042C63D    .  A1 E09B5200     mov eax,dword ptr ds:[529BE0]
0042C642    .  8B08            mov ecx,dword ptr ds:[eax]
0042C644    .  80B9 91050000 0>cmp byte ptr ds:[ecx+591],0
0042C64B    .  0F84 1F020000   je x.0042C870                                 ;  关键跳转,不相等则验证通过
0042C651    .  66:C745 B0 2C00 mov word ptr ss:[ebp-50],2C
0042C657    .  8D45 E8         lea eax,dword ptr ss:[ebp-18]
0042C65A    .  E8 115EFDFF     call x.00402470
0042C65F    .  8BD0            mov edx,eax
0042C661    .  FF45 BC         inc dword ptr ss:[ebp-44]
0042C664    .  8B4D 9C         mov ecx,dword ptr ss:[ebp-64]
0042C667    .  8B81 04030000   mov eax,dword ptr ds:[ecx+304]
0042C66D    .  E8 8EE70700     call x.004AAE00
0042C672    .  8D55 E8         lea edx,dword ptr ss:[ebp-18]
0042C675    .  8B45 9C         mov eax,dword ptr ss:[ebp-64]
0042C678    .  05 2C030000     add eax,32C
0042C67D    .  E8 C2780D00     call x.00503F44
0042C682    .  FF4D BC         dec dword ptr ss:[ebp-44]
0042C685    .  8D45 E8         lea eax,dword ptr ss:[ebp-18]
0042C688    .  BA 02000000     mov edx,2
0042C68D    .  E8 82780D00     call x.00503F14
0042C692    .  8B45 9C         mov eax,dword ptr ss:[ebp-64]
0042C695    .  05 2C030000     add eax,32C
0042C69A    .  E8 015EFDFF     call x.004024A0
0042C69F    .  0FBE50 17       movsx edx,byte ptr ds:[eax+17]                ;  取假码第24位
0042C6A3    .  83FA 30         cmp edx,30                                    ;  与‘0’比较
0042C6A6    .  7C 16           jl short x.0042C6BE                           ;  不跳
0042C6A8    .  8B45 9C         mov eax,dword ptr ss:[ebp-64]
0042C6AB    .  05 2C030000     add eax,32C
0042C6B0    .  E8 EB5DFDFF     call x.004024A0
0042C6B5    .  0FBE50 17       movsx edx,byte ptr ds:[eax+17]                ;  取假码第24位
0042C6B9    .  83FA 39         cmp edx,39                                    ;  与‘9’比较
0042C6BC    .  7E 0F           jle short x.0042C6CD                          ;  跳
0042C6BE    >  8B0D E09B5200   mov ecx,dword ptr ds:[529BE0]                 ;  x._Form1
0042C6C4    .  8B01            mov eax,dword ptr ds:[ecx]
0042C6C6    .  C680 91050000 0>mov byte ptr ds:[eax+591],0
0042C6CD    >  B2 01           mov dl,1
0042C6CF    .  A1 94074E00     mov eax,dword ptr ds:[4E0794]
0042C6D4    .  E8 BB410B00     call x.004E0894
0042C6D9    .  8945 94         mov dword ptr ss:[ebp-6C],eax
0042C6DC    .  BA 01000080     mov edx,80000001
0042C6E1    .  8B45 94         mov eax,dword ptr ss:[ebp-6C]
0042C6E4    .  E8 37760D00     call x.00503D20
0042C6E9    .  8B15 E09B5200   mov edx,dword ptr ds:[529BE0]                 ;  x._Form1
0042C6EF    .  8B0A            mov ecx,dword ptr ds:[edx]
0042C6F1    .  80B9 91050000 0>cmp byte ptr ds:[ecx+591],0
0042C6F8    .  0F84 06010000   je x.0042C804
0042C6FE    .  66:C745 B0 3800 mov word ptr ss:[ebp-50],38
0042C704    .  BA 660D5200     mov edx,x.00520D66                            ;  ASCII "Software\XTZY\BoxShotMaker"
......

============ 跟进 0042C619    .  E8 DAE9FFFF     call x.0042AFF8  ==========

0042AFF8   /$  55              push ebp
0042AFF9   |.  8BEC            mov ebp,esp
0042AFFB   |.  81C4 64FFFFFF   add esp,-9C
0042B001   |.  56              push esi
0042B002   |.  57              push edi
0042B003   |.  B8 A00F5200     mov eax,x.00520FA0
0042B008   |.  E8 73ED0C00     call x.004F9D80
0042B00D   |.  C745 F4 0100000>mov [local.3],1
0042B014   |.  8D55 08         lea edx,[arg.1]
0042B017   |.  8D45 08         lea eax,[arg.1]
0042B01A   |.  E8 CD8D0D00     call x.00503DEC
0042B01F   |.  FF45 F4         inc [local.3]
0042B022   |.  66:C745 E8 0800 mov word ptr ss:[ebp-18],8
0042B028   |.  C645 D7 00      mov byte ptr ss:[ebp-29],0
0042B02C   |.  8D45 08         lea eax,[arg.1]
0042B02F   |.  E8 4C030000     call x.0042B380                               ;  取假码长度
0042B034   |.  83F8 32         cmp eax,32                                    ;  是否为50位
0042B037   |.  0F85 B1000000   jnz x.0042B0EE
0042B03D   |.  66:C745 E8 2000 mov word ptr ss:[ebp-18],20
0042B043   |.  8D45 FC         lea eax,[local.1]
0042B046   |.  E8 2574FDFF     call x.00402470
0042B04B   |.  50              push eax                                      ; /Arg1
0042B04C   |.  FF45 F4         inc [local.3]                                 ; |
0042B04F   |.  8D45 08         lea eax,[arg.1]                               ; |
0042B052   |.  B9 06000000     mov ecx,6                                     ; |
0042B057   |.  BA 2D000000     mov edx,2D                                    ; |
0042B05C   |.  E8 FB910D00     call x.0050425C                               ; \x.0050425C
0042B061   |.  66:C745 E8 1400 mov word ptr ss:[ebp-18],14
0042B067   |.  8D45 FC         lea eax,[local.1]
0042B06A   |.  E8 3174FDFF     call x.004024A0
0042B06F   |.  50              push eax                                      ; /Arg2
0042B070   |.  8D55 D0         lea edx,[local.12]                            ; |
0042B073   |.  52              push edx                                      ; |Arg1
0042B074   |.  E8 6FEA0C00     call x.004F9AE8                               ; \x.004F9AE8
0042B079   |.  83C4 08         add esp,8
0042B07C   |.  C645 CF 01      mov byte ptr ss:[ebp-31],1
0042B080   |.  33C9            xor ecx,ecx
0042B082   |.  894D C8         mov [local.14],ecx
0042B085   |>  8D45 08         /lea eax,[arg.1]
0042B088   |.  E8 1374FDFF     |call x.004024A0
0042B08D   |.  8B55 C8         |mov edx,[local.14]
0042B090   |.  0FBE0410        |movsx eax,byte ptr ds:[eax+edx]              ;  分别取假码前6位进行运算
0042B094   |.  B9 0A000000     |mov ecx,0A
0042B099   |.  99              |cdq
0042B09A   |.  F7F9            |idiv ecx
0042B09C   |.  83C2 30         |add edx,30
0042B09F   |.  8B45 C8         |mov eax,[local.14]
0042B0A2   |.  0FBE4C05 D0     |movsx ecx,byte ptr ss:[ebp+eax-30]
0042B0A7   |.  3BD1            |cmp edx,ecx                                  ;  每位运算的结果与分别与最后6位比较
0042B0A9   |.  74 06           |je short x.0042B0B1                          ;  必须跳,否则验证失败
0042B0AB   |.  C645 CF 00      |mov byte ptr ss:[ebp-31],0
0042B0AF   |.  EB 09           |jmp short x.0042B0BA
0042B0B1   |>  FF45 C8         |inc [local.14]
0042B0B4   |.  837D C8 06      |cmp [local.14],6
0042B0B8   |.^ 7C CB           \jl short x.0042B085
0042B0BA   |>  8B15 E09B5200   mov edx,dword ptr ds:[529BE0]                 ;  x._Form1
0042B0C0   |.  8B02            mov eax,dword ptr ds:[edx]
0042B0C2   |.  8A55 CF         mov dl,byte ptr ss:[ebp-31]
0042B0C5   |.  8890 93050000   mov byte ptr ds:[eax+593],dl
0042B0CB   |.  8D45 08         lea eax,[arg.1]
0042B0CE   |.  BA 2C000000     mov edx,2C
0042B0D3   |.  E8 30900D00     call x.00504108                               ;  取假码前44位
0042B0D8   |.  FF4D F4         dec [local.3]
0042B0DB   |.  8D45 FC         lea eax,[local.1]
0042B0DE   |.  BA 02000000     mov edx,2
0042B0E3   |.  E8 2C8E0D00     call x.00503F14
0042B0E8   |.  66:C745 E8 0800 mov word ptr ss:[ebp-18],8
0042B0EE   |>  8D45 08         lea eax,[arg.1]
0042B0F1   |.  E8 8A020000     call x.0042B380
0042B0F6   |.  83F8 2C         cmp eax,2C                                    ;  是否为44位
0042B0F9   |.  0F85 5C020000   jnz x.0042B35B
0042B0FF   |.  BE 0E0C5200     mov esi,x.00520C0E                            ;  ASCII "1z1h+2a0n-0g8y*9a1n|"
0042B104   |.  8DBD 78FFFFFF   lea edi,[local.34]
0042B10A   |.  B9 05000000     mov ecx,5
0042B10F   |.  F3:A5           rep movs dword ptr es:[edi],dword ptr ds:[esi>
0042B111   |.  A4              movs byte ptr es:[edi],byte ptr ds:[esi]
0042B112   |.  66:C745 E8 0800 mov word ptr ss:[ebp-18],8
0042B118   |.  8D45 08         lea eax,[arg.1]
0042B11B   |.  E8 8073FDFF     call x.004024A0
0042B120   |.  0FBE50 28       movsx edx,byte ptr ds:[eax+28]                ;  取第41位
0042B124   |.  83FA 42         cmp edx,42                                    ;  与‘B’比较
0042B127   |.  74 23           je short x.0042B14C                           ;  跳
0042B129   |.  33C0            xor eax,eax
0042B12B   |.  50              push eax
0042B12C   |.  FF4D F4         dec [local.3]
0042B12F   |.  8D45 08         lea eax,[arg.1]
0042B132   |.  BA 02000000     mov edx,2
0042B137   |.  E8 D88D0D00     call x.00503F14
0042B13C   |.  58              pop eax
0042B13D   |.  8B55 D8         mov edx,[local.10]
0042B140   |.  64:8915 0000000>mov dword ptr fs:[0],edx
0042B147   |.  E9 2E020000     jmp x.0042B37A
0042B14C   |>  8D45 08         lea eax,[arg.1]
0042B14F   |.  E8 4C73FDFF     call x.004024A0
0042B154   |.  0FBE50 29       movsx edx,byte ptr ds:[eax+29]                ;  取第42位
0042B158   |.  83FA 53         cmp edx,53                                    ;  与‘S’比较
0042B15B   |.  74 23           je short x.0042B180                           ;  跳
0042B15D   |.  33C0            xor eax,eax
0042B15F   |.  50              push eax
0042B160   |.  FF4D F4         dec [local.3]
0042B163   |.  8D45 08         lea eax,[arg.1]
0042B166   |.  BA 02000000     mov edx,2
0042B16B   |.  E8 A48D0D00     call x.00503F14
0042B170   |.  58              pop eax
0042B171   |.  8B55 D8         mov edx,[local.10]
0042B174   |.  64:8915 0000000>mov dword ptr fs:[0],edx
0042B17B   |.  E9 FA010000     jmp x.0042B37A
0042B180   |>  8D45 08         lea eax,[arg.1]
0042B183   |.  E8 1873FDFF     call x.004024A0
0042B188   |.  0FBE50 2A       movsx edx,byte ptr ds:[eax+2A]                ;  取第43位
0042B18C   |.  83FA 4D         cmp edx,4D                                    ;  与‘M’比较
0042B18F   |.  74 23           je short x.0042B1B4                           ;  跳
0042B191   |.  33C0            xor eax,eax
0042B193   |.  50              push eax
0042B194   |.  FF4D F4         dec [local.3]
0042B197   |.  8D45 08         lea eax,[arg.1]
0042B19A   |.  BA 02000000     mov edx,2
0042B19F   |.  E8 708D0D00     call x.00503F14
0042B1A4   |.  58              pop eax
0042B1A5   |.  8B55 D8         mov edx,[local.10]
0042B1A8   |.  64:8915 0000000>mov dword ptr fs:[0],edx
0042B1AF   |.  E9 C6010000     jmp x.0042B37A
0042B1B4   |>  8D45 08         lea eax,[arg.1]
0042B1B7   |.  E8 E472FDFF     call x.004024A0
0042B1BC   |.  0FBE50 2B       movsx edx,byte ptr ds:[eax+2B]                ;  取第44位
0042B1C0   |.  83FA 31         cmp edx,31                                    ;  与‘1’比较
0042B1C3   |.  74 23           je short x.0042B1E8                           ;  跳
0042B1C5   |.  33C0            xor eax,eax
0042B1C7   |.  50              push eax
0042B1C8   |.  FF4D F4         dec [local.3]
0042B1CB   |.  8D45 08         lea eax,[arg.1]
0042B1CE   |.  BA 02000000     mov edx,2
0042B1D3   |.  E8 3C8D0D00     call x.00503F14
0042B1D8   |.  58              pop eax
0042B1D9   |.  8B55 D8         mov edx,[local.10]
0042B1DC   |.  64:8915 0000000>mov dword ptr fs:[0],edx
0042B1E3   |.  E9 92010000     jmp x.0042B37A
0042B1E8   |>  8D45 08         lea eax,[arg.1]
0042B1EB   |.  E8 B072FDFF     call x.004024A0
0042B1F0   |.  50              push eax                                      ; /Arg2
0042B1F1   |.  8D55 90         lea edx,[local.28]                            ; |
0042B1F4   |.  52              push edx                                      ; |Arg1
0042B1F5   |.  E8 EEE80C00     call x.004F9AE8                               ; \x.004F9AE8
0042B1FA   |.  83C4 08         add esp,8
0042B1FD   |.  0FBE4D 91       movsx ecx,byte ptr ss:[ebp-6F]                ;  取第2位
0042B201   |.  83F9 2D         cmp ecx,2D                                    ;  与‘-’比较
0042B204   |.  0F85 51010000   jnz x.0042B35B                                ;  不跳
0042B20A   |.  C645 91 23      mov byte ptr ss:[ebp-6F],23                   ;  将第2位改为‘#’
0042B20E   |.  C645 D7 01      mov byte ptr ss:[ebp-29],1
0042B212   |.  C745 C4 0200000>mov [local.15],2
0042B219   |>  8B45 C4         /mov eax,[local.15]
0042B21C   |.  0FBE9405 78FFFF>|movsx edx,byte ptr ss:[ebp+eax-88]           ;  取常串第3位
0042B224   |.  8B4D C4         |mov ecx,[local.15]
0042B227   |.  0FBE440D 8F     |movsx eax,byte ptr ss:[ebp+ecx-71]           ;  取假码第2位
0042B22C   |.  03D0            |add edx,eax
0042B22E   |.  8B4D C4         |mov ecx,[local.15]
0042B231   |.  0FBE440D 90     |movsx eax,byte ptr ss:[ebp+ecx-70]           ;  取假码第3位
0042B236   |.  33D0            |xor edx,eax
0042B238   |.  8B4D C4         |mov ecx,[local.15]
0042B23B   |.  0FBE840D 78FFFF>|movsx eax,byte ptr ss:[ebp+ecx-88]           ;  取常串第3位
0042B243   |.  33D0            |xor edx,eax
0042B245   |.  52              |push edx                                     ; /Arg1
0042B246   |.  E8 25E0FFFF     |call x.00429270                              ; \x.00429270
0042B24B   |.  59              |pop ecx
0042B24C   |.  B9 1A000000     |mov ecx,1A
0042B251   |.  99              |cdq
0042B252   |.  F7F9            |idiv ecx
0042B254   |.  83C2 41         |add edx,41                                   ;  运算结果
0042B257   |.  8B45 C4         |mov eax,[local.15]
0042B25A   |.  0FBE4C05 99     |movsx ecx,byte ptr ss:[ebp+eax-67]           ;  取假码第12位
0042B25F   |.  3BD1            |cmp edx,ecx                                  ;  比较
0042B261   |.  74 06           |je short x.0042B269                          ;  必须跳
0042B263   |.  C645 D7 00      |mov byte ptr ss:[ebp-29],0
0042B267   |.  EB 09           |jmp short x.0042B272
0042B269   |>  FF45 C4         |inc [local.15]                               ;  计数器
0042B26C   |.  837D C4 0A      |cmp [local.15],0A                            ;  循环8次
0042B270   |.^ 7C A7           \jl short x.0042B219
0042B272   |>  807D D7 00      cmp byte ptr ss:[ebp-29],0
0042B276   |.  0F84 D2000000   je x.0042B34E
0042B27C   |.  C745 C0 1800000>mov [local.16],18
0042B283   |.  66:C745 E8 0800 mov word ptr ss:[ebp-18],8
0042B289   |.  837D C0 28      cmp [local.16],28
0042B28D   |.  7D 54           jge short x.0042B2E3
0042B28F   |>  8B55 C0         /mov edx,[local.16]
0042B292   |.  0FBE8415 79FFFF>|movsx eax,byte ptr ss:[ebp+edx-87]           ;  取假码第2位
0042B29A   |.  B9 06000000     |mov ecx,6
0042B29F   |.  99              |cdq
0042B2A0   |.  F7F9            |idiv ecx
0042B2A2   |.  8BCA            |mov ecx,edx
0042B2A4   |.  8B45 C0         |mov eax,[local.16]
0042B2A7   |.  0FBE9405 7AFFFF>|movsx edx,byte ptr ss:[ebp+eax-86]           ;  取假码第3位
0042B2AF   |.  D3E2            |shl edx,cl
0042B2B1   |.  8B45 C0         |mov eax,[local.16]
0042B2B4   |.  0FBE8C05 7BFFFF>|movsx ecx,byte ptr ss:[ebp+eax-85]           ;  取假码第4位
0042B2BC   |.  0BD1            |or edx,ecx
0042B2BE   |.  52              |push edx                                     ; /Arg1
0042B2BF   |.  E8 ACDFFFFF     |call x.00429270                              ; \x.00429270
0042B2C4   |.  59              |pop ecx
0042B2C5   |.  B9 1A000000     |mov ecx,1A
0042B2CA   |.  99              |cdq
0042B2CB   |.  F7F9            |idiv ecx
0042B2CD   |.  80C2 61         |add dl,61                                    ;  运算结果
0042B2D0   |.  8B45 C0         |mov eax,[local.16]
0042B2D3   |.  889405 4CFFFFFF |mov byte ptr ss:[ebp+eax-B4],dl              ;  生成新的字符串
0042B2DA   |.  FF45 C0         |inc [local.16]                               ;  计数器
0042B2DD   |.  837D C0 28      |cmp [local.16],28                            ;  循环16次
0042B2E1   |.^ 7C AC           \jl short x.0042B28F
0042B2E3   |>  C685 74FFFFFF 5>mov byte ptr ss:[ebp-8C],5A
0042B2EA   |.  C685 75FFFFFF 5>mov byte ptr ss:[ebp-8B],59
0042B2F1   |.  C745 BC 1800000>mov [local.17],18
0042B2F8   |.  66:C745 E8 0800 mov word ptr ss:[ebp-18],8
0042B2FE   |.  837D BC 28      cmp [local.17],28
0042B302   |.  7D 4A           jge short x.0042B34E
0042B304   |>  8B55 BC         /mov edx,[local.17]
0042B307   |.  0FBE8415 4CFFFF>|movsx eax,byte ptr ss:[ebp+edx-B4]           ;  新字符串第1位
0042B30F   |.  C1E0 04         |shl eax,4
0042B312   |.  8B55 BC         |mov edx,[local.17]
0042B315   |.  0FBE8C15 4DFFFF>|movsx ecx,byte ptr ss:[ebp+edx-B3]           ;  新字符串第2位
0042B31D   |.  D1F9            |sar ecx,1
0042B31F   |.  33C1            |xor eax,ecx
0042B321   |.  50              |push eax                                     ; /Arg1
0042B322   |.  E8 49DFFFFF     |call x.00429270                              ; \x.00429270
0042B327   |.  59              |pop ecx
0042B328   |.  B9 1A000000     |mov ecx,1A
0042B32D   |.  99              |cdq
0042B32E   |.  F7F9            |idiv ecx
0042B330   |.  83C2 41         |add edx,41                                   ;  运算结果
0042B333   |.  8B45 BC         |mov eax,[local.17]
0042B336   |.  0FBE4405 90     |movsx eax,byte ptr ss:[ebp+eax-70]           ;  取假码第25位
0042B33B   |.  3BD0            |cmp edx,eax                                  ;  比较
0042B33D   |.  74 06           |je short x.0042B345                          ;  必须跳
0042B33F   |.  C645 D7 00      |mov byte ptr ss:[ebp-29],0
0042B343   |.  EB 09           |jmp short x.0042B34E
0042B345   |>  FF45 BC         |inc [local.17]                               ;  计数器
0042B348   |.  837D BC 28      |cmp [local.17],28                            ;  循环16次
0042B34C   |.^ 7C B6           \jl short x.0042B304
0042B34E   |>  0FBE55 9A       movsx edx,byte ptr ss:[ebp-66]                ;  取假码第11位
0042B352   |.  83FA 59         cmp edx,59                                    ;  与‘Y’比较
0042B355   |.  74 04           je short x.0042B35B                           ;  跳
0042B357   |.  C645 D7 00      mov byte ptr ss:[ebp-29],0
0042B35B   |>  8A45 D7         mov al,byte ptr ss:[ebp-29]                   ;  验证标志位
0042B35E   |.  50              push eax
0042B35F   |.  FF4D F4         dec [local.3]
0042B362   |.  8D45 08         lea eax,[arg.1]
0042B365   |.  BA 02000000     mov edx,2
0042B36A   |.  E8 A58B0D00     call x.00503F14
0042B36F   |.  58              pop eax
0042B370   |.  8B55 D8         mov edx,[local.10]
0042B373   |.  64:8915 0000000>mov dword ptr fs:[0],edx
0042B37A   |>  5F              pop edi
0042B37B   |.  5E              pop esi
0042B37C   |.  8BE5            mov esp,ebp
0042B37E   |.  5D              pop ebp
0042B37F   \.  C3              retn

【汇编注册机算法部分源码】

    .data
szStr    db  '1z1h+2a0n-0g8y*9a1n|',0
szData    db  'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',0
    .code
GetRegKey  proc  hDlg:DWORD
    local  szReg[64]:BYTE,szTmp[32]:BYTE
    pushad
    invoke  RtlZeroMemory,addr szReg,sizeof szReg
    invoke  RtlZeroMemory,addr szTmp,sizeof szTmp
    invoke  GetTickCount
    lea  esi,szData
    lea  edi,szReg
    mov  ecx,32h
  @@:
    and  eax,1fh
    mov  dl,BYTE ptr [esi+eax]
    mov  BYTE ptr [edi],dl
    add  eax,3
    inc  edi
    dec  ecx
    jnz  @b
    
    lea  edi,szReg
    mov  BYTE ptr [edi+1],2dh
    xor  ebx,ebx
  @@:
    movsx  eax,BYTE ptr [edi+ebx]
    mov  ecx,0ah
    cdq
    idiv  ecx
    add  edx,30h
    mov  BYTE ptr [edi+2ch+ebx],dl
    inc  ebx
    cmp  ebx,6
    jl  @b
    mov  BYTE ptr [edi+28h],42h
    mov  BYTE ptr [edi+29h],53h
    mov  BYTE ptr [edi+2ah],4dh
    mov  BYTE ptr [edi+2bh],31h
    mov  BYTE ptr [edi+1],23h
    mov  BYTE ptr [edi+0ah],59h
    mov  BYTE ptr [edi+17h],37h
    
    lea  esi,szStr
    mov  ebx,2
  @@:
    movsx  edx,BYTE ptr [esi+ebx]
    movsx  eax,BYTE ptr [edi+ebx-1]
    add  edx,eax
    movsx  eax,BYTE ptr [edi+ebx]
    xor  edx,eax
    movsx  eax,BYTE ptr [esi+ebx]
    xor  edx,eax
    mov  eax,edx
    mov  ecx,1ah
    cdq
    idiv  ecx
    add  edx,41h
    mov  BYTE ptr [edi+9+ebx],dl
    inc  ebx
    cmp  ebx,0ah
    jl  @b
    
    lea  esi,szTmp
    xor  ebx,ebx
  @@:
    movsx  eax,BYTE ptr [edi+1+ebx]
    mov  ecx,6
    cdq
    idiv  ecx
    mov  ecx,edx
    movsx  edx,BYTE ptr [edi+2+ebx]
    shl  edx,cl
    movsx  ecx,BYTE ptr [edi+3+ebx]
    or  edx,ecx
    mov  eax,edx
    mov  ecx,1ah
    cdq
    idiv  ecx
    add  dl,61h
    mov  BYTE ptr [esi+ebx],dl
    inc  ebx
    cmp  ebx,10h
    jl  @b
    mov  BYTE ptr [esi+ebx],5ah
    mov  BYTE ptr [esi+ebx+1],59h
    
    xor  ebx,ebx
  @@:
    movsx  eax,BYTE ptr [esi+ebx]
    shl  eax,4
    movsx  ecx,BYTE ptr [esi+1+ebx]
    sar  ecx,1
    xor  eax,ecx
    mov  ecx,1ah
    cdq
    idiv  ecx
    add  edx,41h
    mov  BYTE ptr [edi+18h+ebx],dl
    inc  ebx
    cmp  ebx,10h
    jl  @b
    mov  BYTE ptr [edi+1],2dh
    invoke  SetDlgItemText,hDlg,IDC_REG,addr szReg
    popad
    ret
GetRegKey  endp

【版权声明】  本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!