-
-
一款文件比较的工具的算法详解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直播授课
赞赏
他的文章
赞赏
雪币:
留言: