首页
社区
课程
招聘
一款文件比较的工具的算法详解Hex Comparison v1.80
发表于: 2006-1-9 19:12 4853

一款文件比较的工具的算法详解Hex Comparison v1.80

2006-1-9 19:12
4853
                      
  作为入门的菜鸟,我们刚开始的时候就是找到程序的关键比较处,强行修改程序使执行流程改变从而爆破程序。但当我们看到大侠们那些详尽的算法分析文章时,在羡慕他们深厚的功底的同时也想试试软件的算法分析,我们今天就拿一个新点的国外软件开刀吧,LET'S GO!
破解对象:Hex Comparison v1.80
软件功能介绍:一款小巧的十六进制文件比较和编辑修改工具。可以同时打开两个文件在同一界面比较,它可以自动比较两个文件的
不同之处并高亮显示。并可以把不同之处生成文件保存成文档。
所需工具:OllyDBG 1.10caocong汉化第二版(用于动态调试跟踪和代码分析的工具,简称OD)、PEID 0.94(用于对软件进行查壳,还可以脱
简单程序的壳)
破解过程:首先运行程序,看看有没有可以利用的信息。这个程序如果没有注册的话就会有要求注册的窗口出现,还有使用20 次的限制
老规矩,PEID 0.94查壳,显示为Borland C++ 1999
OD载入程序,利用插件找到注册代码计算处,填入全名/公司名称:ocn试着填写试炼码:1234567890,出现错误提示“你的注册码无效。
如果你购买了本软件并得到了错误注册码, 请发送邮件到: support@exeicon.com”。通过跟踪运行代码发现注册码必须44位,修改注册
码为44位,我这里修改为“12345678900987654321123456789009876543212345”。这时再注册程序就会断下,代码如下:
全名/公司名称:ocn
试炼码:12345678900987654321123456789009876543212345
0040B300  /.  55              PUSH EBP
0040B301  |.  8BEC            MOV EBP,ESP
0040B303  |.  83C4 9C         ADD ESP,-64
0040B306  |.  8955 A0         MOV DWORD PTR SS:[EBP-60],EDX
0040B309  |.  8945 A4         MOV DWORD PTR SS:[EBP-5C],EAX
0040B30C  |.  B8 A0DD4C00     MOV EAX,hexcmp.004CDDA0
0040B311  |.  E8 2A2E0B00     CALL hexcmp.004BE140
0040B316  |.  8B15 0C514D00   MOV EDX,DWORD PTR DS:[4D510C]     ; 011B26FC 常量
0040B31C  |.  8A8A A4040000   MOV CL,BYTE PTR DS:[EDX+4A4]   ; 注册标志CL
0040B322  |.  84C9            TEST CL,CL
0040B324  |.  0F85 36030000   JNZ hexcmp.0040B660                ; CL不为0就跳,第一次当然不跳
0040B32A  |.  66:C745 B8 0800 MOV WORD PTR SS:[EBP-48],8
0040B330  |.  8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
0040B333  |.  E8 F068FFFF     CALL hexcmp.00401C28
0040B338  |.  8BD0            MOV EDX,EAX
0040B33A  |.  FF45 C4         INC DWORD PTR SS:[EBP-3C]
0040B33D  |.  8B4D A4         MOV ECX,DWORD PTR SS:[EBP-5C]
0040B340  |.  8B81 F0020000   MOV EAX,DWORD PTR DS:[ECX+2F0]
0040B346  |.  E8 A96A0600     CALL hexcmp.00471DF4
0040B34B  |.  8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
0040B34E  |.  E8 59A2FFFF     CALL hexcmp.004055AC            ; 计算公司名的位数
0040B353  |.  83F8 03         CMP EAX,3                       ; 与3比较
0040B356  |.  0F9CC2          SETL DL                         ; 假,DL置0
0040B359  |.  83E2 01         AND EDX,1                       ; EDX=EDX AND 1
0040B35C  |.  52              PUSH EDX                        ; /Arg1
0040B35D  |.  FF4D C4         DEC DWORD PTR SS:[EBP-3C]       ; |
0040B360  |.  8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]    ; |
0040B363  |.  BA 02000000     MOV EDX,2
0040B368  |.  E8 FBCE0B00     CALL hexcmp.004C8268            ; \hexcmp.004C8268
0040B36D  |.  59              POP ECX
0040B36E  |.  84C9            TEST CL,CL
0040B370  |.  74 3C           JE SHORT hexcmp.0040B3AE        ;  CL=0 跳,否则提示输入全名
0040B372  |.  66:C745 B8 1400 MOV WORD PTR SS:[EBP-48],14
0040B378  |.  BA 43D54C00     MOV EDX,hexcmp.004CD543         ; 请输入你的全名!
省略一段代码
----------------------------------------------------------------------------
0040B3D9  |.  8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
0040B3DC  |.  FF32            PUSH DWORD PTR DS:[EDX]          ; /假注册码压入
0040B3DE  |.  E8 D9E7FFFF     CALL hexcmp.00409BBC             ; 关键CALL,跟进
0040B3E3  |.  59              POP ECX
0040B3E4  |8B0D 0C514D00 MOV ECX,DWORD PTR DS:[4D510C]*** ;注意此处和0040B400处
0040B3EA  |.  8881 A4040000    MOV BYTE PTR DS:[ECX+4A4],AL
0040B3F0  |.  FF4D C4          DEC DWORD PTR SS:[EBP-3C]
0040B3F3  |.  8D45 F4          LEA EAX,DWORD PTR SS:[EBP-C]
0040B3F6  |.  BA 02000000      MOV EDX,2
0040B3FB  |.  E8 68CE0B00      CALL hexcmp.004C8268
0040B400  |.  8B0D 0C514D00    MOV ECX,DWORD PTR DS:[4D510C]***
0040B406  |.  8A81 A4040000    MOV AL,BYTE PTR DS:[ECX+4A4]
--------------------------------------------------------------------------------
注意这两端代码:
0040B3E4  |.  8B0D 0C514D00    MOV ECX,DWORD PTR DS:[4D510C]
0040B3EA  |.  8881 A4040000    MOV BYTE PTR DS:[ECX+4A4],AL和
0040B400  |.  8B0D 0C514D00    MOV ECX,DWORD PTR DS:[4D510C]            
0040B406  |.  8A81 A4040000    MOV AL,BYTE PTR DS:[ECX+4A4]
紧跟这下面的一个判断,如果AL=0的话,则注册失败。因此0040B3DE的CALL必须让AL=1
------------------------------------------------------------------------
0040B40C  |.  84C0           TEST AL,AL
0040B40E      0F84 1D020000  JE hexcmp.0040B631       ; AL=0跳到错误处理,不能跳
-----------------------------------------------------------------------
省略一段代码,是注册成功时对注册表的处理
-----------------------------------------------------------------------
0040B5F4  |.  66:C745 B8 5C00    MOV WORD PTR SS:[EBP-48],5C
0040B5FA  |>  66:C745 B8 7400    MOV WORD PTR SS:[EBP-48],74
0040B600  |.  BA 7DD54C00        MOV EDX,hexcmp.004CD57D    ; 注册成功!感谢你。
0040B605  |.  8D45 D0             LEA EAX,DWORD PTR SS:[EBP-30]
0040B608  |.  E8 FBCA0B00         CALL hexcmp.004C8108
0040B60D  |.  FF45 C4             INC DWORD PTR SS:[EBP-3C]
0040B610  |.  8B00                MOV EAX,DWORD PTR DS:[EAX]
0040B612  |.  E8 490B0600         CALL hexcmp.0046C160
0040B617  |.  FF4D C4             DEC DWORD PTR SS:[EBP-3C]
0040B61A  |.  8D45 D0             LEA EAX,DWORD PTR SS:[EBP-30]
0040B61D  |.  BA 02000000         MOV EDX,2
0040B622  |.  E8 41CC0B00         CALL hexcmp.004C8268
0040B627  |.  8B45 A4             MOV EAX,DWORD PTR SS:[EBP-5C]
0040B62A  |.  E8 E1620500         CALL hexcmp.00461910
0040B62F  |.  EB 37               JMP SHORT hexcmp.0040B668
0040B631  |>  66:C745 B8 8000     MOV WORD PTR SS:[EBP-48],80
0040B637  |.  BA 9FD54C00         MOV EDX,hexcmp.004CD59F  ;你的注册码无效。如果你购买了本软件并得到了错误注册码, 请发送邮件到: support@exeicon.com
---------------------------------------------------------------------------
        ************关键CALL,跟进CALL hexcmp.00409BBC***************
---------------------------------------------------------------------------
00409BBC   /$  55                 PUSH EBP
00409BBD   |.  8BEC               MOV EBP,ESP
00409BBF   |.  81C4 74FFFFFF      ADD ESP,-8C
00409BC5   |.  56                 PUSH ESI
00409BC6   |.  57                 PUSH EDI
00409BC7   |.  B8 60D64C00        MOV EAX,hexcmp.004CD660
00409BCC   |.  E8 6F450B00        CALL hexcmp.004BE140
00409BD1   |.  C745 F8 01000000   MOV DWORD PTR SS:[EBP-8],1
00409BD8   |.  8D55 08            LEA EDX,DWORD PTR SS:[EBP+8]
00409BDB   |.  8D45 08            LEA EAX,DWORD PTR SS:[EBP+8]
00409BDE   |.  E8 5DE50B00        CALL hexcmp.004C8140
00409BE3   |.  FF45 F8            INC DWORD PTR SS:[EBP-8]
00409BE6   |.  66:C745 EC 0800    MOV WORD PTR SS:[EBP-14],8
00409BEC   |.  C645 DB 00         MOV BYTE PTR SS:[EBP-25],0
00409BF0   |.  8D45 08            LEA EAX,DWORD PTR SS:[EBP+8]
00409BF3   |.  E8 B4B9FFFF        CALL hexcmp.004055AC
00409BF8   |.  83F8 2C            CMP EAX,2C
00409BFB   |.  0F85 49020000      JNZ hexcmp.00409E4A
;计算注册码位数的CALL, ; 0X2C=44,注册码必须 44位,不是就跳
00409C01   |.  BE 5CD34C00         MOV ESI,hexcmp.004CD35C
;  字符串1z1h+2a0n-0g8y*9a1n|
00409C06   |.  8D7D 88             LEA EDI,DWORD PTR SS:[EBP-78]
;  上面是计算用的常字符串1z1h+2a0n-0g8y*9a1n|
00409C09   |.  B9 05000000         MOV ECX,5            
00409C0E   |.  F3:A5    REP MOVS DWORD PTR ES:[EDI],DWORD PTR > ;转移常串
00409C10   |.  A4                  MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ES>
00409C11   |.  8D45 08             LEA EAX,DWORD PTR SS:[EBP+8]
00409C14   |.  E8 73B9FFFF         CALL hexcmp.0040558C
00409C19   |.  0FBE50 28           MOVSX EDX,BYTE PTR DS:[EAX+28]
00409C1D   |.  83FA 48             CMP EDX,48  
00409C20   |.  74 23               JE SHORT hexcmp.00409C45  
;假注册码的0x28(40)位->EDXSTR[40]=H,是跳
00409C22   |.  33C0                XOR EAX,EAX
00409C24   |.  50                  PUSH EAX
00409C25   |.  FF4D F8             DEC DWORD PTR SS:[EBP-8]
00409C28   |.  8D45 08             LEA EAX,DWORD PTR SS:[EBP+8]
00409C2B   |.  BA 02000000         MOV EDX,2
00409C30   |.  E8 33E60B00         CALL hexcmp.004C8268
00409C35   |.  58                  POP EAX
00409C36   |.  8B55 DC             MOV EDX,DWORD PTR SS:[EBP-24]
00409C39   |.  64:8915 00000000    MOV DWORD PTR FS:[0],EDX
00409C40   |.  E9 24020000         JMP hexcmp.00409E69
00409C45   |>  8D45 08             LEA EAX,DWORD PTR SS:[EBP+8]
00409C48   |.  E8 3FB9FFFF         CALL hexcmp.0040558C
00409C4D   |.  0FBE50 29           MOVSX EDX,BYTE PTR DS:[EAX+29]
00409C51   |.  83FA 46             CMP EDX,46
00409C54   |.  74 23               JE SHORT hexcmp.00409C79  
;假注册码的0x29(41)位->EDX, STR[40]=F,是跳
00409C56   |.  33C0                XOR EAX,EAX
00409C58   |.  50                  PUSH EAX
00409C59   |.  FF4D F8             DEC DWORD PTR SS:[EBP-8]
00409C5C   |.  8D45 08             LEA EAX,DWORD PTR SS:[EBP+8]
00409C5F   |.  BA 02000000         MOV EDX,2
00409C64   |.  E8 FFE50B00         CALL hexcmp.004C8268
00409C69   |.  58                  POP EAX
00409C6A   |.  8B55 DC             MOV EDX,DWORD PTR SS:[EBP-24]
00409C6D   |.  64:8915 00000000    MOV DWORD PTR FS:[0],EDX
00409C74   |.  E9 F0010000         JMP hexcmp.00409E69
00409C79   |>  8D45 08             LEA EAX,DWORD PTR SS:[EBP+8]
00409C7C   |.  E8 0BB9FFFF         CALL hexcmp.0040558C
00409C81   |.  0FBE50 2A           MOVSX EDX,BYTE PTR DS:[EAX+2A]
00409C85   |.  83FA 43             CMP EDX,43  
00409C88   |.  74 23                JE SHORT hexcmp.00409CAD
假注册码的0x2A(42)位->EDX, STR[41]=C,是跳
00409C8A   |.  33C0                 XOR EAX,EAX
00409C8C   |.  50                   PUSH EAX
00409C8D   |.  FF4D F8              DEC DWORD PTR SS:[EBP-8]
00409C90   |.  8D45 08              LEA EAX,DWORD PTR SS:[EBP+8]
00409C93   |.  BA 02000000          MOV EDX,2
00409C98   |.  E8 CBE50B00          CALL hexcmp.004C8268
00409C9D   |.  58                   POP EAX
00409C9E   |.  8B55 DC              MOV EDX,DWORD PTR SS:[EBP-24]
00409CA1   |.  64:8915 00000000     MOV DWORD PTR FS:[0],EDX
00409CA8   |.  E9 BC010000          JMP hexcmp.00409E69
00409CAD   |>  8D45 08              LEA EAX,DWORD PTR SS:[EBP+8]
00409CB0   |.  E8 D7B8FFFF          CALL hexcmp.0040558C
00409CB5   |.  0FBE50 2B            MOVSX EDX,BYTE PTR DS:[EAX+2B]
00409CB9   |.  83FA 31              CMP EDX,31
00409CBC   |.  74 23                JE SHORT hexcmp.00409CE1  
;  假注册码的0x2B(43)位->EDX, STR[44]=1,是跳
00409CBE   |.  33C0                 XOR EAX,EAX
00409CC0   |.  50                   PUSH EAX
00409CC1   |.  FF4D F8              DEC DWORD PTR SS:[EBP-8]
00409CC4   |.  8D45 08              LEA EAX,DWORD PTR SS:[EBP+8]
00409CC7   |.  BA 02000000          MOV EDX,2
00409CCC   |.  E8 97E50B00          CALL hexcmp.004C8268
00409CD1   |.  58                   POP EAX
00409CD2   |.  8B55 DC              MOV EDX,DWORD PTR SS:[EBP-24]
00409CD5   |.  64:8915 00000000     MOV DWORD PTR FS:[0],EDX
00409CDC   |.  E9 88010000          JMP hexcmp.00409E69
00409CE1   |>  8D45 08              LEA EAX,DWORD PTR SS:[EBP+8]  ; 跳到这里
00409CE4   |.  E8 A3B8FFFF          CALL hexcmp.0040558C
00409CE9   |.  50                   PUSH EAX                     ; /假码压入
00409CEA   |.  8D55 A0              LEA EDX,DWORD PTR SS:[EBP-60]
00409CED   |.  52                   PUSH EDX                      ; |地址压入
00409CEE   |.  E8 E1410B00          CALL hexcmp.004BDED4
00409CF3   |.  83C4 08              ADD ESP,8
00409CF6   |.  0FBE4D A1            MOVSX ECX,BYTE PTR SS:[EBP-5F]
00409CFA   |.  83F9 30              CMP ECX,30
00409CFD   |.  0F85 47010000       JNZ hexcmp.00409E4A
第二位是0? 不是注册失败
00409D03   |.  C645 A1 23           MOV BYTE PTR SS:[EBP-5F],23
;  #=0X23替换第二位
00409D07   |.  C645 DB 01           MOV BYTE PTR SS:[EBP-25],1
00409D0B   |.  C745 D4 02000000     MOV DWORD PTR SS:[EBP-2C],2
00409D12   |> /8B45 D4             /MOV EAX,DWORD PTR SS:[EBP-2C]
;  开始处理注册码,从第二位开始
00409D15   |. |0FBE5405 88          |MOVSX EDX,BYTE PTR SS:[EBP+EAX-78]   
;  取常串中的字符
00409D1A   |. |8B4D D4              |MOV ECX,DWORD PTR SS:[EBP-2C]
00409D1D   |. |0FBE440D 9F          |MOVSX EAX,BYTE PTR SS:[EBP+ECX-61]   
;  取假码下一位到EAX
00409D22   |. |03D0                 |ADD EDX,EAX           ;  相加
00409D24   |. |8B4D D4              |MOV ECX,DWORD PTR SS:[EBP-2C]
00409D27   |. |0FBE440D A0          |MOVSX EAX,BYTE PTR SS:[EBP+ECX-60
; 再取假码的一位
00409D2C   |. |33D0                 |XOR EDX,EAX           ; EDX=EDX XOR EAX
00409D2E   |. |8B4D D4              |MOV ECX,DWORD PTR SS:[EBP-2C]
00409D31   |. |0FBE440D 88          |MOVSX EAX,BYTE PTR SS:[EBP+ECX-78]
00409D36   |. |33D0                 |XOR EDX,EAX           ;再异或EAX
00409D38   |. |52                   |PUSH EDX
00409D39   |. |E8 928AFFFF          |CALL hexcmp.004027D0 ;EDX转移到EAX,准备除
00409D3E   |. |59                   |POP ECX
00409D3F   |. |B9 1A000000          |MOV ECX,1A            ;  ECX=0X1A=26
00409D44   |. |99                   |CDQ                   ;  扩展
00409D45   |. |F7F9                 |IDIV ECX              ;  除
00409D47   |. |83C2 41              |ADD EDX,41            ;  EDX=EDX+0X41
00409D4A   |. |8B45 D4              |MOV EAX,DWORD PTR SS:[EBP-2C] ;\2->EAX
00409D4D   |. |0FBE4C05 A9          |MOVSX ECX,BYTE PTR SS:[EBP+EAX-57];取假码
00409D52   |. |3BD1                |CMP EDX,ECX     ;计算出的结果与假码比较
00409D54      |75 06                |JE SHORT hexcmp.00409D5C;相等就继续
00409D56   |. |C645 DB 00           |MOV BYTE PTR SS:[EBP-25],0
00409D5A   |. |EB 0B                |JMP SHORT hexcmp.00409D67
00409D5C   |> |FF45 D4              |INC DWORD PTR SS:[EBP-2C] ; 计数+1
00409D5F   |. |8B55 D4              |MOV EDX,DWORD PTR SS:[EBP-2C]
00409D62   |. |83FA 0A              |CMP EDX,0A
00409D65   |.^\7C AB                \JL SHORT hexcmp.00409D12  ;小于10,跳回
--------------------------------------------------------------------------------
第一段算法总结:就是从常串中取出一个字符,取出注册码的第一位相加,再取一位与结果异或,然后再异或常串中的字符,再除以常数0X(1A)=26余数加上0X41得到最终结果。
--------------------------------------------------------------------------------
00409D67   |>  8A45 DB             MOV AL,BYTE PTR SS:[EBP-25] ;  标志位->AL
00409D6A   |.  84C0                TEST AL,AL                  ;  测试AL
00409D6C   |.  0F84 CB000000       Ehexcmp.00409E3D            ;  AL=0,跳
00409D72   |.  C745 D0 18000000    MOV PTR SS:[EBP-30],18  ; 再从26位开始计算
00409D79   |.  66:C745 EC 0800     MOV WORD PTR SS:[EBP-14],8
00409D7F   |.  8B55 D0             MOV EDX,DWORD PTR SS:[EBP-30]
00409D82   |.  83FA 28             CMP EDX,28                   ;  是否已经计算完
00409D85   |.  7D 4D              JGE SHORT hexcmp.00409DD4    ;  小于44则不跳
00409D87   |> /8B4D D0            /MOV ECX,DWORD PTR SS:[EBP-30]
00409D8A   |. |0FBE440D 89        |MOVSX EAX,BYTE PTR SS:[EBP+ECX-77]
; 从注册码的第二位取
00409D8F   |. |B9 06000000        |MOV ECX,6                   ;  6->ECX
00409D94   |. |99                 |CDQ                         ;  扩展
00409D95   |. |F7F9               |IDIV ECX                    ;  除以ECX
00409D97   |. |8BCA               |MOV ECX,EDX                 ;  余数EDX->ECX
00409D99   |. |8B45 D0            |MOV EAX,DWORD PTR SS:[EBP-30] ;[EBP-30]计数
00409D9C   |. |0FBE5405 8A        |MOVSX EDX,BYTE PTR SS:[EBP+EAX-76]
;  取注册码的下一位
00409DA1   |. |D3E2               |SHL EDX,CL                  ;  <<CL位
00409DA3   |. |8B45 D0            |MOV EAX,DWORD PTR SS:[EBP-30]
00409DA6   |. |0FBE4C05 8B        |MOVSX ECX,BYTE PTR SS:[EBP+EAX-75];取下一位
00409DAB   |. |0BD1                |OR EDX,ECX        ;上面的结果异或第三位
00409DAD   |. |52                 |PUSH EDX
00409DAE   |. |E8 1D8AFFFF        |CALL hexcmp.004027D0  ; \转移到EAX
00409DB3   |. |59                 POP ECX
00409DB4   |. |B9 1A000000        |MOV ECX,1A            ;  0X1A=ECX
00409DB9   |. |99                 |CDQ
00409DBA   |. |F7F9               |IDIV ECX              ;  除以ECX
00409DBC   |. |80C2 61            |ADD DL,61             ;  余数加0x61
00409DBF   |. |8B45 D0            |MOV EAX,DWORD PTR SS:[EBP-30]
00409DC2   |.  889405 5CFFFFFF    |MOV BYTE PTR SS:[EBP+EAX-A4],DL
;  结果转移,下面计算用到
00409DC9   |. |FF45 D0            |INC DWORD PTR SS:[EBP-30] ;计数加1
00409DCC   |. |8B55 D0            |MOV EDX,DWORD PTR SS:[EBP-30]
00409DCF   |. |83FA 28            |CMP EDX,28
00409DD2   |.^\7C B3              \JL SHORT hexcmp.00409D87
;  是否小于44,小于跳回继续计算
--------------------------------------------------------------------------------
第二段算法总结:从注册码第二位开始取,除以6。再取下一位左移余数位,再加上注册码的下一位进行异或运算转移到EAX除以0X1A(26)余数再加上0X61保存进行下面计算。  
--------------------------------------------------------------------------------
00409DD4   |>  C645 84 5A       MOV BYTE PTR SS:[EBP-7C],5A
00409DD8   |.  C645 85 59       MOV BYTE PTR SS:[EBP-7B],59
00409DDC   |.  C745 CC 18000000 MOV DWORD PTR SS:[EBP-34],18
00409DE3   |.  66:C745 EC 0800  MOV WORD PTR SS:[EBP-14],8
00409DE9   |.  8B45 CC          MOV EAX,DWORD PTR SS:[EBP-34]
00409DEC   |.  83F8 28          CMP EAX,28
00409DEF   |.  7D 4C            JGE SHORT hexcmp.00409E3D
00409DF1   |> /8B55 CC          /MOV EDX,DWORD PTR SS:[EBP-34]
00409DF4   |0FBE8C15 5CFFFFF    |MOVSX ECX,BYTE PTR SS:[EBP+EDX-A4]
;  取上面计算出的字串第一位
00409DFC   |C1E1 04             |SHL ECX,4           ;  <<4
00409DFF   |8B45 CC             |MOV EAX,DWORD PTR SS:[EBP-34]
00409E02   |0FBE9405 5DFFFFFF   |MOVSX EDX,BYTE PTR SS:[EBP+EAX-A3]
;  再取下一位
00409E0A   |D1FA                |SAR EDX,1           ;  算术右移1
00409E0C   |33CA                |XOR ECX,EDX         ;再与第一位结果异或
00409E0E   |51                  |PUSH ECX   
00409E0F   |. |E8 BC89FFFF      |CALL hexcmp.004027D0
;  \转移到EAX
00409E14   ||59                 |POP ECX
00409E15   |B9 1A000000         |MOV ECX,1A          ;  0X1A->ECX
00409E1A   |99                  |CDQ                 ;  扩展
00409E1B   |F7F9                |IDIV ECX
00409E1D   |83C2 41             |ADD EDX,41          ;  余数加0x41
00409E20   |8B45 CC             |MOV EAX,DWORD PTR SS:[EBP-34]
00409E23   |0FBE4405 A0         |MOVSX EAX,BYTE PTR SS:[EBP+EAX-60]
;  与注册码的从26位开始比较
00409E28   |3BD0                |CMP EDX,EAX
00409E2A   |75 06               JNZ SHORT hexcmp.00409E32
00409E2C   |C645 DB 00          |MOV BYTE PTR SS:[EBP-25],0
00409E30   |EB 0B               |JMP SHORT hexcmp.00409E3D
00409E32   |FF45 CC             |INC DWORD PTR SS:[EBP-34];计数加1
00409E35   |8B55 CC             |MOV EDX,DWORD PTR SS:[EBP-34]
00409E38   |83FA 28             |CMP EDX,28
00409E3B   ^\7C B4              \JL SHORT hexcmp.00409DF1
; 小于44位跳回继续计算
00409E3D   0FBE4D AA      MOVSX ECX,BYTE PTR SS:[EBP-56]  ; 第11位->ECX
00409E41   |.  83F9 59          CMP ECX,59                ; ECX与0X59(Y)
00409E44    74 04               JE SHORT hexcmp.00409E4A  ; 相等跳
00409E46    C645 DB 00          MOV BYTE PTR SS:[EBP-25],0
00409E4A   |>  8A45 DB          MOV AL,BYTE PTR SS:[EBP-25]
; 标志位->AL,如果AL=0则注册失败。
--------------------------------------------------------------------------------
第三段算法总结: 第二段计算出的字符串逐位逻辑左移4异或下一位算术右移1,结果再除以0x1A的余数加上0x41。
--------------------------------------------------------------------------------
算法总结:
第一步:程序判断计算公司名的位数,然后与3比较假,DL置0;同时注册码必须是44位。
第二步:判断注册码的最后四位是不是HFC1, 第11位必须是"Y",是就继续比较不是就出错,
第三步:(1)程序内置一个固定字符串“1z1h+2a0n-0g8y*9a1n|”,它会参与运算,首先看注册码第二位是不是0,是的话把它替换称。
“#”(0x23),不是错误提示。
(2)注册码的第12位到20位等于注册码的第二位加字符串“1h+2a0n-0g8y*9a1n|”(注意这里从原串的第三位开始取)的第一位的结果异。
或假码的下一位,再异或常串的第一位,结果除以26取余再加0x41,计算十次。
(3)计数从26开始到44结束。从第二位开始计算,注册码的第三位逻辑左移(注册码的第二位除以6的余数)位,再异或第四位的结果除以26再加0x61,依此计算12轮,得到的结果记为字符串Str2。
(4)注册码的第25位到40位等于Str2每位逻辑左移4再异或它的下一位算术右移1的结果再除以26取余再加0x41必须。
第四部:对的话出现注册成功提示,不再出现过期和注册框。
奉上一组注册码:
注册名:ocn
注册码:1034567890YIRNVLHHT11234XBKARTDKIKFSKTJPHFC1

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (1)
雪    币: 172
活跃值: (232)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发,学习中...
2006-1-9 19:23
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册