发新话题
打印

[转载]BoxShotMaker1.88注册算法分析+汇编注册机

[转载]BoxShotMaker1.88注册算法分析+汇编注册机

信息来源:看雪论坛


【破文标题】  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

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

TOP

发新话题