【文章标题】:Extra Drive Pro算法分析历程
【文章作者】: 小娃崽
【作者邮箱】: wanzailuan@yahoo.com.cn
【软件名称】: Extra Drive Pro
【下载地址】: http://www.skycn.com/soft/19661.html
【加壳方式】: ASPACK
【编写语言】: LCC Win32 1.x -> Jacob Navia
【使用工具】: OLLYDBG
【操作平台】: XP+SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  下断bp GetWindowTextA,我输入的注册码是"112233445566778899"
  004176F3  |.  68 04010000   push    104                              ; /Count = 104 (260.)
  004176F8  |.  8DBD F4FEFFFF lea     edi, dword ptr [ebp-10C]         ; |
  004176FE  |.  57            push    edi                              ; |Buffer
  004176FF  |.  50            push    eax                              ; |hWnd
  00417700  |.  E8 6F250100   call         ; \GetWindowTextA
  00417705  |.  80BD F4FEFFFF>cmp     byte ptr [ebp-10C], 0            ;  这里比较注册码是否为空
  0041770C  |.  0F84 27010000 je      00417839
  00417712  |.  8DBD ECFDFFFF lea     edi, dword ptr [ebp-214]
  00417718  |.  8D35 61204500 lea     esi, dword ptr [452061]
  0041771E  |.  B9 41000000   mov     ecx, 41
  00417723  |.  F3:A5         rep     movs dword ptr es:[edi], dword p>
  00417725  |.  8D85 F4FEFFFF lea     eax, dword ptr [ebp-10C]
  0041772B  |.  50            push    eax
  0041772C  |.  8D85 ECFDFFFF lea     eax, dword ptr [ebp-214]
  00417732  |.  50            push    eax
  00417733  |.  E8 38EF0000   call    00426670
  00417738  |.  8D8D F4FEFFFF lea     ecx, dword ptr [ebp-10C]
  0041773E  |.  83C8 FF       or      eax, FFFFFFFF
  00417741  |>  40            /inc     eax
  00417742  |.  803C01 00     |cmp     byte ptr [ecx+eax], 0
  00417746  |.^ 75 F9         \jnz     short 00417741
  00417748  |.  89C7          mov     edi, eax                         ;  EAX在这里返回的是注册码位数
  0041774A  |.  83EF 0F       sub     edi, 0F                          ;  位数-0F
  0041774D  |.  89BD E8FDFFFF mov     dword ptr [ebp-218], edi
  00417753  |.  8B85 E8FDFFFF mov     eax, dword ptr [ebp-218]         ;eax=位数-0F=3
  00417759  |.  8D8405 F4FEFF>lea     eax, dword ptr [ebp+eax-10C]     ;  "233445566778899",呵呵,就是注册码的后15位拉!
  00417760  |.  50            push    eax
  00417761  |.  E8 1B62FFFF   call    0040D981                         ;关键CALL1
  00417766  |.  83C4 04       add     esp, 4
  00417769  |.  8985 E4FDFFFF mov     dword ptr [ebp-21C], eax         ;  注意这里EAX返回值
  0041776F  |.  8B85 E8FDFFFF mov     eax, dword ptr [ebp-218]
  00417775  |.  C68405 ECFDFF>mov     byte ptr [ebp+eax-214], 0
  0041777D  |.  8D85 ECFDFFFF lea     eax, dword ptr [ebp-214]
  00417783  |.  50            push    eax                              ;  "112",这里是被截取掉的注册码部分拉!
  00417784  |.  E8 DFC50000   call    00423D68                         ; 关键CALL2
  00417789  |.  83C4 04       add     esp, 4
  0041778C  |.  8995 DCFDFFFF mov     dword ptr [ebp-224], edx
  00417792  |.  8985 D8FDFFFF mov     dword ptr [ebp-228], eax         ;  注意这里的EAX返回值
  00417798  |.  8BBD D8FDFFFF mov     edi, dword ptr [ebp-228]
  0041779E  |.  89BD E0FDFFFF mov     dword ptr [ebp-220], edi
  004177A4  |.  8B85 E0FDFFFF mov     eax, dword ptr [ebp-220]
  004177AA  |.  3985 E4FDFFFF cmp     dword ptr [ebp-21C], eax         ; 这里是关键CALL1,CALL2的返回值进行的比较
  004177B0      0F85 83000000 jnz     00417839                         ;  爆破点
  
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  关键CALL1:
  0040D981  /$  53            push    ebx
  0040D982  |.  56            push    esi
  0040D983  |.  57            push    edi
  0040D984  |.  8B7424 10     mov     esi, dword ptr [esp+10]                      ;  注册码2到ESI
  0040D988  |.  89F1          mov     ecx, esi
  0040D98A  |.  83C8 FF       or      eax, FFFFFFFF
  0040D98D  |>  40            /inc     eax
  0040D98E  |.  803C01 00     |cmp     byte ptr [ecx+eax], 0
  0040D992  |.^ 75 F9         \jnz     short 0040D98D
  0040D994  |.  89C3          mov     ebx, eax                                     ;  上面的循环返回注册码2的位数
  0040D996  |.  BF FFFFFFFF   mov     edi, -1                                      ;  EDI=-1
  0040D99B  |.  EB 22         jmp     short 0040D9BF
  0040D99D  |>  89F0          /mov     eax, esi
  0040D99F  |.  46            |inc     esi
  0040D9A0  |.  0FBE10        |movsx   edx, byte ptr [eax]                         ;  注册码第1位到EDX
  0040D9A3  |.  89F9          |mov     ecx, edi
  0040D9A5  |.  31D1          |xor     ecx, edx                                    ;  注册码第1位和-1进行xor运算
  0040D9A7  |.  89CA          |mov     edx, ecx                                    ;  结果到EDX
  0040D9A9  |.  81E2 FF000000 |and     edx, 0FF                                    ;  与0FF进行and运算
  0040D9AF  |.  8B1495 C0FF44>|mov     edx, dword ptr [edx*4+44FFC0]               ;这里的EDX中的值就要查表了。。
  0040D9B6  |.  89F9          |mov     ecx, edi
  0040D9B8  |.  C1E9 08       |shr     ecx, 8
  0040D9BB  |.  89D7          |mov     edi, edx
  0040D9BD  |.  31CF          |xor     edi, ecx                                    ;  EDI=EDI XOR ECX
  0040D9BF  |>  89D8           mov     eax, ebx
  0040D9C1  |.  4B            |dec     ebx
  0040D9C2  |.  09C0          |or      eax, eax
  0040D9C4  |.^ 7F D7         \jg      short 0040D99D
  0040D9C6  |.  83F7 FF       xor     edi, FFFFFFFF
  0040D9C9  |.  89F8          mov     eax, edi                                     ;  返回值在这里了
  0040D9CB  |.  5F            pop     edi
  0040D9CC  |.  5E            pop     esi
  0040D9CD  |.  5B            pop     ebx
  0040D9CE  \.  C3            retn
表在这里了:
0044FFC4  96 30 07 77 2C 61 0E EE BA 51 09 99 19 C4 6D 07  ?眇愬?冺餉??
0044FFD4  8F F4 6A 70 35 A5 63 E9 A3 95 64 9E 32 88 DB 0E  ?灪??閣鹤蠲?
0044FFE4  A4 B8 DC 79 1E E9 D5 E0 88 D9 D2 97 2B 4C B6 09  ?秜??韒??
0044FFF4  BD 7C B1 7E 07 2D B8 E7 91 1D BF 90 64 10 B7 1D  粽纱??邿??
00450004  F2 20 B0 6A 48 71 B9 F3 DE 41 BE 84 7D D4 DA 1A  ?檰煈??蒾??
00450014  EB E4 DD 6D 51 B5 D4 F4 C7 85 D3 83 56 98 6C 13  淝??藇菓顖?
00450024  C0 A8 6B 64 7A F9 62 FD EC C9 65 8A 4F 5C 01 14  ?摫梁??詥屏?
00450034  D9 6C 06 63 63 3D 0F FA F5 0D 08 8D C8 20 6E 3B  泙挆?﨏?贈??
00450044  5E 10 69 4C E4 41 60 D5 72 71 67 A2 D1 E4 03 3C  ????煲??
00450054  47 D4 04 4B FD 85 0D D2 6B B5 0A A5 FA A8 B5 35  ??藽?????
00450064  6C 98 B2 42 D6 C9 BB DB 40 F9 BC AC E3 6C D8 32  顬???鹿?泣?
00450074  75 5C DF 45 CF 0D D6 DC 59 3D D1 AB AC 30 D9 26  屵?????ガ?
00450084  3A 00 DE 51 80 51 D7 C8 16 61 D0 BF B5 F4 B4 21  :凞冀?愖???
00450094  23 C4 B3 56 99 95 BA CF 0F A5 BD B8 9E B8 02 28  ?嚳閙?????
004500A4  08 88 05 5F B2 D9 0C C6 24 E9 0B B1 87 7C 6F 2F  蠈弅????粇?
004500B4  11 4C 68 58 AB 1D 61 C1 3D 2D 66 B6 90 41 DC 76  ?塨?????盜
004500C4  06 71 DB 01 BC 20 D2 98 2A 10 D5 EF 89 85 B1 71  焆ǜ?飒??薉熱
004500D4  1F B5 B6 06 A5 E4 BF 9F 33 D4 B8 E8 A2 C9 07 78  ??????砇
004500E4  34 F9 00 0F 8E A8 09 96 18 98 0E E1 BB 0D 6A 7F  老??阉領?罪
004500F4  2D 3D 6D 08 97 6C 64 91 01 5C 63 E6 F4 51 6B 6B  ??沗酤封凴歫
00450104  62 61 6C 1C D8 30 65 85 4E 00 62 F2 ED 95 06 6C  慢?ヘ蕥N?闭氆
00450114  7B A5 01 1B C1 F4 08 82 57 C4 0F F5 C6 D9 B0 65  ???興???新
00450124  50 E9 B7 12 EA B8 BE 8B 7C 88 B9 FC DF 1D DD 62  ???设衼??拝
00450134  49 2D DA 15 F3 7C D3 8C 65 4C D4 FB 58 61 B2 4D  ??糳賓??慘?
00450144  CE 51 B5 3A 74 00 BC A3 E2 30 BB D4 41 A5 DF 4A  凎?t?モ???
00450154  D7 95 D8 3D 6D C4 D1 A4 FB F4 D6 D3 6A E9 69 43  闗???????
00450164  FC D9 6E 34 46 88 67 AD D0 B8 60 DA 73 2D 04 44  ??衆?????
00450174  E5 1D 03 33 5F 4C 0A AA C9 7C 0D DD 3C 71 05 50  ????糉?焼倅
00450184  AA 41 02 27 10 10 0B BE 86 20 0C C9 25 B5 68 57  ???????坨
00450194  B3 85 6F 20 09 D4 66 B9 9F E4 61 CE 0E F9 DE 5E  薳????癩廞
004501A4  98 C9 D9 29 22 98 D0 B0 B4 A8 D7 C7 17 3D B3 59  ??頢????妳
004501B4  81 0D B4 2E 3B 5C BD B7 AD 6C BA C0 20 83 B8 ED  ??尻?沭?茠?
004501C4  B6 B3 BF 9A 0C E2 B6 03 9A D2 B1 74 39 47 D5 EA  ?骿ζ?璱??
004501D4  AF 77 D2 9D 15 26 DB 04 83 16 DC 73 12 0B 63 E3  瞯鷒???珜?
004501E4  84 3B 64 94 3E 6A 6D 0D A8 5A 6A 7A 0B CF 0E E4  ?鑤樾??#123;穪?
004501F4  9D FF 09 93 27 AE 00 0A B1 9E 07 7D 44 93 0F F0  ?鋉??麱紇鍄?
00450204  D2 A3 08 87 68 F2 01 1E FE C2 06 69 5D 57 62 F7  ?蜈???椆坝?
00450214  CB 67 65 80 71 36 6C 19 E7 06 6B 6E 76 1B D4 FE  柋聥???湫??
00450224  E0 2B D3 89 5A 7A DA 10 CC 4A DD 67 6F DF B9 F9  ?觓穚??柝?惡
00450234  F9 EF BE 8E 43 BE B7 17 D5 8E B0 60 E8 A3 D6 D6  ?躾??軕悰??
00450244  7E 93 D1 A1 C4 C2 D8 38 52 F2 DF 4F F1 67 BB D1  鍾????俟柱?
00450254  67 57 BC A6 DD 06 B5 3F 4B 36 B2 48 DA 2B 0D D8  坧???????
00450264  4C 1B 0A AF F6 4A 03 36 60 7A 04 41 C3 EF 60 DF  ????穠???
00450274  55 DF 67 A8 EF 8E 6E 31 79 BE 69 46 8C B3 61 CB  ??軯?????
00450284  1A 83 66 BC A0 D2 6F 25 36 E2 68 52 95 77 0C CC  茚??╯剨瞕?
00450294  03 47 0B BB B9 16 02 22 2F 26 05 55 BE 3B BA C5  ?????唅??
004502A4  28 0B BD B2 92 5A B4 2B 04 6A B3 5C A7 FF D7 C2  ??媒?樄岳??
004502B4  31 CF D0 B5 8B 9E D9 2C 1D AE DE 5B B0 C2 64 9B  ??麋??寞?魤
004502C4  26 F2 63 EC 9C A3 6A 75 0A 93 6D 02 A9 06 09 9C  ???番錊??鰉
004502D4  3F 36 0E EB 85 67 07 72 13 57 00 05 82 4A BF 95  ??枅_k圓??閿
004502E4  14 7A B8 E2 AE 2B B1 7B 38 1B B6 0C 9B 8E D2 92  稔?箱??躛鋒
004502F4  0D BE D5 E5 B7 EF DC 7C 21 DF DB 0B D4 D2 D3 86  ??糜???蛓
00450304  42 E2 D4 F1 F8 B3 DD 68 6E 83 DA 1F CD 16 BE 81  ??棝荮??膾
00450314  5B 26 B9 F6 E1 77 B0 6F 77 47 B7 18 E6 5A 08 88  ??矡澰??嫦蠈
00450324  70 6A 0F FF CA 3B 06 66 5C 0B 01 11 FF 9E 65 8F  橰/?昆??黿轥
00450334  69 AE 62 F8 D3 FF 6B 61 45 CF 6C 16 78 E2 0A A0  ???慫???
00450344  EE D2 0D D7 54 83 04 4E C2 B3 03 39 61 26 67 A7  ??荔丄????
00450354  F7 16 60 D0 4D 47 69 49 DB 77 6E 3E 4A 6A D1 AE  ????矛?橊?
00450364  DC 5A D6 D9 66 0B DF 40 F0 3B D8 37 53 AE BC A9  嫜???????
00450374  C5 9E BB DE 7F CF B2 47 E9 FF B5 30 1C F2 BD BD  黅????サ??
00450384  8A C2 BA CA 30 93 B3 53 A6 A3 B4 24 05 36 D0 BA  ??錰厳????
00450394  93 06 D7 CD 29 57 DE 54 BF 67 D9 23 2E 7A 66 B3  ??圩哞枿?種?
004503A4  B8 4A 61 C4 02 1B 68 5D 94 2B 6F 2A 37 BE 0B B4  ???嵨????
004503B4  A1 8E 0C C3 1B DF 05 5A 8D EF 02 2D              躡??娅??


 总结一下关键CALL1:
                  初始值:edi=-1
                  EDX=注册码(i) xor edi and 0ff,然后查表,EDX=[edx*4+44FFC0]指向的内容
                  ECX=EDI shr 8
                  edi=edx xor ecx 
                  i指向下一位,循环。最终的值xor FFFFFFFF(-1)--->eax
                        
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  关键CALL2:
  00423D68  /$  55            push    ebp
  00423D69  |.  89E5          mov     ebp, esp
  00423D6B  |.  83EC 10       sub     esp, 10
  00423D6E  |.  8365 FC 00    and     dword ptr [ebp-4], 0
  00423D72  |.  8365 F8 00    and     dword ptr [ebp-8], 0
  00423D76  |.  8365 F0 00    and     dword ptr [ebp-10], 0
  00423D7A  |.  EB 03         jmp     short 00423D7F
  00423D7C  |>  FF45 08       /inc     dword ptr [ebp+8]                          
  00423D7F  |>  8B45 08        mov     eax, dword ptr [ebp+8]                    
  00423D82  |.  8A08          |mov     cl, byte ptr [eax]                        
  00423D84  |.  80F9 20       |cmp     cl, 20
  00423D87  |.^ 74 F3         |je      short 00423D7C
  00423D89  |.  80F9 09       |cmp     cl, 9
  00423D8C  |.^ 74 EE         \je      short 00423D7C                             
  00423D8E  |.  8038 2B       cmp     byte ptr [eax], 2B                          
  00423D91  |.  75 05         jnz     short 00423D98                              
  00423D93  |.  FF45 08       inc     dword ptr [ebp+8]
  00423D96  |.  EB 50         jmp     short 00423DE8
  00423D98  |>  8B45 08       mov     eax, dword ptr [ebp+8]
  00423D9B  |.  8038 2D       cmp     byte ptr [eax], 2D                           
  00423D9E  |.  75 48         jnz     short 00423DE8
  00423DA0  |.  C745 F0 01000>mov     dword ptr [ebp-10], 1                        ;[ebp-10]=1
  00423DA7  |.  FF45 08       inc     dword ptr [ebp+8]
  00423DAA  |.  EB 3C         jmp     short 00423DE8                               ;跳
  00423DAC  |>  8B45 08       /mov     eax, dword ptr [ebp+8]                      ;  注册码到EAX
  00423DAF  |.  FF45 08       |inc     dword ptr [ebp+8]                           
  00423DB2  |.  0FBE00        |movsx   eax, byte ptr [eax]                         ;  注册码依次到EAX
  00423DB5  |.  83E8 30       |sub     eax, 30                                     ;  -0
  00423DB8  |.  8945 F4       |mov     dword ptr [ebp-C], eax                      ;  结果保存到[EBP-C]
  00423DBB  |.  BA 00000000   |mov     edx, 0                                      ;edx=0
  00423DC0  |.  B8 0A000000   |mov     eax, 0A                                     ;eax=0a
  00423DC5  |.  83EC 08       |sub     esp, 8
  00423DC8  |.  DF6D F8       |fild    qword ptr [ebp-8]                           ;  [EBP-8]-->ST(0)
  00423DCB  |.  DF3C24        |fistp   qword ptr [esp]                             ;  ST(0)-->[ESP]
  00423DCE  |.  52            |push    edx                                         ;作用应该是[EBP-8] <==>[esp]
  00423DCF  |.  50            |push    eax                                         
  00423DD0  |.  E8 5BF8FFFF   |call    00423630
    {
       00423630  /$  8B4424 08     mov     eax, dword ptr [esp+8]            ;不知道程序在什么地方对[ESP+8]赋值,我这里总是0
       00423634  |.  8B4C24 10     mov     ecx, dword ptr [esp+10]           ;不知道程序在什么地方对[ESP+10]赋值,我这里总是0 
       00423638  |.  09C1          or      ecx, eax
       0042363A  |.  8B4C24 0C     mov     ecx, dword ptr [esp+C]                  ;观察发现[esp+c]=[esp]
       0042363E  |.  75 09         jnz     short 00423649
       00423640  |.  8B4424 04     mov     eax, dword ptr [esp+4]                  ;观察发现[ESP+4]总是等于0A
       00423644  |.  F7E1          mul     ecx                                     ;[esp+c]*0A
       00423646  |.  C2 1000       retn    10                                      ;所以每次到这里就返回了
       00423649  |>  53            push    ebx
       0042364A  |.  F7E1          mul     ecx
       0042364C  |.  89C3          mov     ebx, eax
       0042364E  |.  8B4424 08     mov     eax, dword ptr [esp+8]
       00423652  |.  F76424 14     mul     dword ptr [esp+14]
       00423656  |.  01C3          add     ebx, eax
       00423658  |.  8B4424 08     mov     eax, dword ptr [esp+8]
       0042365C  |.  F7E1          mul     ecx
       0042365E  |.  01DA          add     edx, ebx
       00423660  |.  5B            pop     ebx
       00423661  \.  C2 1000       retn    10
     }

  00423DD5  |.  52            |push    edx
  00423DD6  |.  50            |push    eax 
  00423DD7  |.  8B45 F4       |mov     eax, dword ptr [ebp-C]                      ;EAX<--[EBP-C]
  00423DDA  |.  99            |cdq                            
  00423DDB  |.  010424        |add     dword ptr [esp], eax                        ;[ESP]=[ESP]+EAX
  00423DDE  |.  115424 04     |adc     dword ptr [esp+4], edx                      
  00423DE2  |.  8F45 F8       |pop     dword ptr [ebp-8]                           ;[EBP-8]出栈
  00423DE5  |.  8F45 FC       |pop     dword ptr [ebp-4]
  00423DE8  |>  8B45 08        mov     eax, dword ptr [ebp+8]                      ;  注册码到eax
  00423DEB  |.  8A00          |mov     al, byte ptr [eax]                          ;  注册码依次到al
  00423DED  |.  3C 30         |cmp     al, 30                                      ;  和数字0比较
  00423DEF  |.  7C 04         |jl      short 00423DF5
  00423DF1  |.  3C 39         |cmp     al, 39                                      ;  和数字9比较
  00423DF3  |.^ 7E B7         \jle     short 00423DAC
  00423DF5  |>  837D F0 00    cmp     dword ptr [ebp-10], 0
  00423DF9      74 13         je      short 00423E0E
  00423DFB  |.  8B55 FC       mov     edx, dword ptr [ebp-4]
  00423DFE  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
  00423E01  |.  F7D8          neg     eax
  00423E03  |.  83D2 00       adc     edx, 0
  00423E06  |.  F7DA          neg     edx
  00423E08  |.  8955 FC       mov     dword ptr [ebp-4], edx
  00423E0B  |.  8945 F8       mov     dword ptr [ebp-8], eax
  00423E0E  |>  8B55 FC       mov     edx, dword ptr [ebp-4]
  00423E11  |.  8B45 F8       mov     eax, dword ptr [ebp-8]                       ;EAX的返回值在这里了
  00423E14  |.  C9            leave
  00423E15  \.  C3            retn
  总结一下关键CALL2:
     第一次:[ESP+C]=[ESP]=0 *0A=0+1=1
     第二次:[esp+c]=[esp]=1 *0a=0A+1=0B
     第三次: [esp+c]=[esp]=b*0a=6E+2=70
     类似于:
            sum=0
            sum=sum*0A+注册码(i)数值本身
            i++
描述的不是很好,但是你自己跟一遍就有感觉了。。
--------------------------------------------------------------------------------
  算法就看那两个关键CALL拉,如果你看不懂尽管拿砖头砸我好了
 类似这样的算法以我目前的能力是没办法还原的..呵呵

///////////////////////////////////////////////////////////////////////////////////////////////////////////
后记:两位大虾都说是CRC,于是我这几天特意浏览了看雪上关于CRC的帖子,看到穷举一词,突然有一到灵光打到了我的天灵盖上,于是我也

决定对这个软件穷举一下试试.
思路如下:
          for n=0 to 99999...9(15个)            ;n我用来表示注册码后15位
                  SN1=CALL1(n)                  ;关键CALL1的算法我们是可以求出来的
                      do 
                          { 
                            sn1=call2(i)        ;i表示被截取掉的
                            i++
                          }while(sn2=sn1 or i>99999999)
                 sn='n'+'i'                     ;SN表示注册码
          next n
我想上面那些循环应该可以穷举出一个注册码吧~!
关键算法分析清楚了的,思路也有了,就开始写代码实践下:
   先写关键CALL1的:
Dim sn2 As Long
Dim i As Integer
Dim n As Integer
Dim s As String
Dim l As Integer
Private Function call2(n As Integer)
 sn2 = 0
 s = Str(n)
 l = Len(s)
     For i = 1 To l
        sn2 = sn2 * &HA + Val(Mid(s, i, 1))
     Next i

       call2 = sn2
End Function
到这里我调试了一下,比如我输入1122,返回的是1122,输入多少返回多少~!看到这个结果我哭了。。。。。还穷举个屁。
那不就是说注册机可以这样写了:
                  sn1=call1(n)
                  regcode='sn1'+'n' 
比如sn1=call1(123456789012345)=1364569986
那么你的注册码就是1364569986123456789012345,删掉程序目录下的extradrivepro.ini文件中的temp节,那么你还可以再玩一次
 

  • 标 题: 答复
  • 作 者:CCDebuger
  • 时 间:2006-11-29 15:04

把表开头的 77073096 放到Google或百度里搜一下就知道是什么算法了。贴一份 drizz 的CRC32实现源码:

.686
.model flat,stdcall
option casemap:none

.data
align 16
CRC32Table label dword
i = 0
crc = i
WHILE i LT 256
  crc = i
  REPT 8
      crc = (crc shr 1) xor (0EDB88320h * (crc and 1))
  ENDM
  DD crc
  i = i + 1
ENDM

.code

align 16
CRC32 proc uses esi lpBuffer:DWORD,dwBufLen:DWORD,dwCRC:DWORD
  mov eax,dwCRC
  mov ecx,dwBufLen
  xor eax,-1
  test ecx,ecx
  mov esi,lpBuffer
  jz @F
  .repeat
    xor al,[esi]
    movzx edx,al
    shr eax,8
    mov edx,[CRC32Table+edx*4]
    inc esi
    xor eax,edx
    dec ecx
  .until zero?
@@:  xor eax,-1
  ret
CRC32 endp

end