TA的每日心情 | 开心 2015-8-23 23:49 |
---|
签到天数: 27 天 [LV.4]偶尔看看III
|
本帖最后由 GGLHY 于 2011-2-24 20:28 编辑
****管理系统单机版的注册算法分析
在医院陪护期间练手而已!如有错误,还望不吝赐教!谢谢!!!
闲话少叙,直接来到:
005A991F E8 D051FCFF call 0056EAF4 ; 算法CALL
005A9924 84C0 test al, al ; 标志位比较
005A9926 74 27 je short 005A994F ; 关键跳,跳则注册失败
005A9928 6A 40 push 40 ; 注意这里的 40 !
005A992A B9 90995A00 mov ecx, 005A9990 ; ASCII "系统提示"
(省略部分代码)
005A9943 C780 4C020000 0>mov dword ptr [eax+24C], 1
005A994D EB 18 jmp short 005A9967
005A994F 6A 10 push 10 ; 杯具了
005A9951 B9 90995A00 mov ecx, 005A9990 ; ASCII "系统提示"
(省略部分代码)
005A9962 E8 9D89EEFF call 00492304
好,咱们进去看看:
005A991F E8 D051FCFF call 0056EAF4 ; 算法CALL
0056EAF4 55 push ebp
(省略部分代码)
0056EB11 E8 4EF7FFFF call 0056E264
0056EB16 8B4D EC mov ecx, [ebp-14] ; 机器码到ECX
0056EB19 8D45 F4 lea eax, [ebp-C]
0056EB1C BA 4CEC5600 mov edx, 0056EC4C ; ASCII "H0"
0056EB21 E8 1260E9FF call 00404B38
(省略部分代码)
0056EB5F 33C9 xor ecx, ecx
0056EB61 BA 58EC5600 mov edx, 0056EC58 ; ASCII "Software\wgzm\ckmxczdj"
0056EB66 8B45 F8 mov eax, [ebp-8]
0056EB69 E8 367BEDFF call 004466A4
0056EB6E 84C0 test al, al
0056EB70 74 5A je short 0056EBCC
0056EB72 8D4D E8 lea ecx, [ebp-18]
0056EB75 BA 78EC5600 mov edx, 0056EC78 ; ASCII "rc"
0056EB7A 8B45 F8 mov eax, [ebp-8]
0056EB7D E8 1A7EEDFF call 0044699C
0056EB82 8B55 E8 mov edx, [ebp-18] ; 假码
0056EB85 B8 CC5E5F00 mov eax, 005F5ECC
0056EB8A E8 F15CE9FF call 00404880
0056EB8F 8B55 F0 mov edx, [ebp-10]
0056EB92 8B45 F8 mov eax, [ebp-8]
0056EB95 E8 967CEDFF call 00446830
0056EB9A BA 84EC5600 mov edx, 0056EC84 ; ASCII "sysj"
0056EB9F 8B45 F0 mov eax, [ebp-10]
0056EBA2 8B08 mov ecx, [eax]
0056EBA4 FF51 54 call [ecx+54]
0056EBA7 40 inc eax
0056EBA8 75 0E jnz short 0056EBB8
0056EBAA E8 05D0E9FF call 0040BBB4
0056EBAF DD1D 8C605F00 fstp qword ptr [5F608C]
0056EBB5 9B wait
0056EBB6 EB 14 jmp short 0056EBCC
0056EBB8 BA 84EC5600 mov edx, 0056EC84 ; ASCII "sysj"
0056EBBD 8B45 F8 mov eax, [ebp-8]
0056EBC0 E8 AB7EEDFF call 00446A70
0056EBC5 DD1D 8C605F00 fstp qword ptr [5F608C]
0056EBCB 9B wait
0056EBCC 8D4D E4 lea ecx, [ebp-1C]
0056EBCF 66:BA 3200 mov dx, 32 ; dx=32
0056EBD3 8B45 F4 mov eax, [ebp-C] ; "H0Y31QH89E"
0056EBD6 E8 39FCFFFF call 0056E814 ; 算法核心,F7
0056E814 55 push ebp
0056E815 8BEC mov ebp, esp
0056E817 51 push ecx
0056E818 B9 04000000 mov ecx, 4
0056E81D 6A 00 push 0
0056E81F 6A 00 push 0
0056E821 49 dec ecx
0056E822 ^ 75 F9 jnz short 0056E81D
0056E824 51 push ecx
0056E825 874D FC xchg [ebp-4], ecx
0056E828 53 push ebx
0056E829 56 push esi
0056E82A 57 push edi
0056E82B 8BF9 mov edi, ecx
0056E82D 66:8955 FA mov [ebp-6], dx ;DX=32
0056E831 8945 FC mov [ebp-4], eax ; "H0Y31QH89E",变形的机器码
0056E834 33C0 xor eax, eax
0056E836 55 push ebp
0056E837 68 D8EA5600 push 0056EAD8
0056E83C 64:FF30 push dword ptr fs:[eax]
0056E83F 64:8920 mov fs:[eax], esp
0056E842 66:8B75 FA mov si, [ebp-6] ;32到SI
0056E846 8B45 FC mov eax, [ebp-4]
0056E849 E8 9E62E9FF call 00404AEC
0056E84E 8BD0 mov edx, eax ; H0连接机器码后的长度
0056E850 8D45 F4 lea eax, [ebp-C]
0056E853 E8 2066E9FF call 00404E78
0056E858 8B45 FC mov eax, [ebp-4] ; "H0Y31QH89E",变形的机器码
0056E85B E8 8C62E9FF call 00404AEC
0056E860 84C0 test al, al
0056E862 76 67 jbe short 0056E8CB
0056E864 8845 E3 mov [ebp-1D], al ;"H0Y31QH89E"的长度
0056E867 B3 01 mov bl, 1 ; bl=1
0056E869 33C0 xor eax, eax
0056E86B 8AC3 mov al, bl
0056E86D 8B55 FC mov edx, [ebp-4] ; "H0Y31QH89E"
0056E870 0FB64402 FF movzx eax, byte ptr [edx+eax>; 依次取H0Y31QH89E每一位
0056E875 0FB7D6 movzx edx, si ;32
0056E878 03D2 add edx, edx ;相加(32+32)
0056E87A 03C2 add eax, edx ;和 + 当前所取的变形机器码的ASC
0056E87C B9 5B000000 mov ecx, 5B
0056E881 33D2 xor edx, edx
0056E883 F7F1 div ecx ; /5B
0056E885 8BF2 mov esi, edx ; 余数
0056E887 EB 10 jmp short 0056E899
0056E889 66:83FE 30 cmp si, 30 ; 余数与30比较
0056E88D 73 06 jnb short 0056E895 ; 不小于则跳
0056E88F 66:83C6 12 add si, 12 ; +12再与30比较
0056E893 EB 04 jmp short 0056E899
0056E895 66:83C6 07 add si, 7 ; +7
0056E899 66:83FE 30 cmp si, 30 ; 余数与30比较
0056E89D ^ 72 EA jb short 0056E889 ; 小则跳
0056E89F 66:83FE 39 cmp si, 39 ; 余数与39比较
0056E8A3 76 06 jbe short 0056E8AB ; 不大于则跳
0056E8A5 66:83FE 41 cmp si, 41 ; 余数与41比较
0056E8A9 ^ 72 DE jb short 0056E889 ; 小则跳
0056E8AB 8D45 F4 lea eax, [ebp-C]
0056E8AE E8 9164E9FF call 00404D44
0056E8B3 33D2 xor edx, edx
0056E8B5 8AD3 mov dl, bl
0056E8B7 8BCE mov ecx, esi ; 余数
0056E8B9 884C10 FF mov [eax+edx-1], cl ; 该余数作为ASC及对应的字符
0056E8BD 66:83C6 32 add si, 32 ; +32
0056E8C1 66:83C6 32 add si, 32 ; +32。(SI再进行下一轮循环)
0056E8C5 43 inc ebx ; bl+1
0056E8C6 FE4D E3 dec byte ptr [ebp-1D] ; (H0连接机器码后的长度)计数器-1
0056E8C9 ^ 75 9E jnz short 0056E869
0056E8CB 8D45 F0 lea eax, [ebp-10] ; 循环结束得到字符串S1,本例为“QGC9ZCCE19”
0056E8CE 8B55 F4 mov edx, [ebp-C]
0056E8D1 E8 EE5FE9FF call 004048C4
0056E8D6 8D45 F4 lea eax, [ebp-C]
0056E8D9 E8 4E5FE9FF call 0040482C
0056E8DE 8B45 F0 mov eax, [ebp-10] ; S1
0056E8E1 E8 0662E9FF call 00404AEC
0056E8E6 8BD0 mov edx, eax ; S1的长度
0056E8E8 8D45 F4 lea eax, [ebp-C]
0056E8EB E8 8865E9FF call 00404E78 ;
0056E8F0 66:8B75 FA mov si, [ebp-6] ;[ebp-6]=32
0056E8F4 8B45 F0 mov eax, [ebp-10]
0056E8F7 E8 F061E9FF call 00404AEC ;S1的长度为0吗?
0056E8FC 84C0 test al, al
0056E8FE 76 67 jbe short 0056E967 ;这里跳,就会略过下面对S1循环运算的过程了
0056E900 8845 E3 mov [ebp-1D], al ;S1的长度
0056E903 B3 01 mov bl, 1
0056E905 33C0 xor eax, eax ; 重复上面的循环,不过变成S1而非机器码了
0056E907 8AC3 mov al, bl ;参见上面的循环
0056E909 8B55 F0 mov edx, [ebp-10]
0056E90C 0FB64402 FF movzx eax, byteptr[edx+eax-1]
0056E911 0FB7D6 movzx edx, si
0056E914 03D2 add edx, edx
0056E916 03C2 add eax, edx
0056E918 B9 5B000000 mov ecx, 5B
0056E91D 33D2 xor edx, edx
0056E91F F7F1 div ecx
0056E921 8BF2 mov esi, edx
0056E923 EB 10 jmp short 0056E935
0056E925 66:83FE 30 cmp si, 30
0056E929 73 06 jnb short 0056E931
0056E92B 66:83C6 12 add si, 12
0056E92F EB 04 jmp short 0056E935
0056E931 66:83C6 07 add si, 7
0056E935 66:83FE 30 cmp si, 30
0056E939 ^ 72 EA jb short 0056E925
0056E93B 66:83FE 39 cmp si, 39
0056E93F 76 06 jbe short 0056E947
0056E941 66:83FE 41 cmp si, 41
0056E945 ^ 72 DE jb short 0056E925
0056E947 8D45 F4 lea eax, [ebp-C]
0056E94A E8 F563E9FF call 00404D44
0056E94F 33D2 xor edx, edx
0056E951 8AD3 mov dl, bl
0056E953 8BCE mov ecx, esi
0056E955 884C10 FF mov [eax+edx-1], cl
0056E959 66:83C6 32 add si, 32
0056E95D 66:83C6 32 add si, 32
0056E961 43 inc ebx
0056E962 FE4D E3 dec byte ptr [ebp-1D]
0056E965 ^ 75 9E jnz short 0056E905 ;同样的循环
0056E967 8BC7 mov eax, edi ; 得到字符串S2,本例为"ZWMA83B7VA"
0056E969 8B4D F0 mov ecx, [ebp-10] ; S1
0056E96C 8B55 F4 mov edx, [ebp-C] ; S2
0056E96F E8 C461E9FF call 00404B38
0056E974 8D45 EC lea eax, [ebp-14]
0056E977 E8 B05EE9FF call 0040482C
0056E97C 8D45 E8 lea eax, [ebp-18]
0056E97F E8 A85EE9FF call 0040482C
0056E984 8D45 E4 lea eax, [ebp-1C]
0056E987 E8 A05EE9FF call 0040482C
0056E98C 8B07 mov eax, [edi] ; S2连接S1,得到字符串S3:"ZWMA83B7VAQGC9ZCCE19"
0056E98E E8 5961E9FF call 00404AEC
0056E993 83F8 0E cmp eax, 0E ; S3的长度与0E比较
0056E996 7E 45 jle short 0056E9DD ; 不大于则跳
0056E998 8D45 EC lea eax, [ebp-14]
0056E99B 50 push eax
0056E99C 8B07 mov eax, [edi] ; 字符串S3:
0056E99E B9 06000000 mov ecx, 6 ; 这里是参数表示取6位
0056E9A3 BA 01000000 mov edx, 1 ; 这里参数表示从第1位取
0056E9A8 E8 9F63E9FF call 00404D4C ; 按照参数取!可以进去看见取得的结果Key1
0056E9AD 8D45 E8 lea eax, [ebp-18]
0056E9B0 50 push eax
0056E9B1 8B07 mov eax, [edi] ; 字符串S3:
0056E9B3 B9 05000000 mov ecx, 5 ; 这里是参数表示取5位
0056E9B8 BA 07000000 mov edx, 7 ; 这里参数表示从第7位取
0056E9BD E8 8A63E9FF call 00404D4C ; 同样的CALL,得到Key2
0056E9C2 8D45 E4 lea eax, [ebp-1C]
0056E9C5 50 push eax
0056E9C6 8B07 mov eax, [edi] ; 字符串S3:
0056E9C8 E8 1F61E9FF call 00404AEC
0056E9CD 8BC8 mov ecx, eax ; S3的长度
0056E9CF 8B07 mov eax, [edi] ; 字符串S3:
0056E9D1 BA 0C000000 mov edx, 0C ; 注意这里的参数0C,从第12位起
0056E9D6 E8 7163E9FF call 00404D4C ; 同样的CALL,得到Key3
0056E9DB /EB 7F jmp short 0056EA5C
0056E9DD |8B07 mov eax, [edi]
0056E9DF |E8 0861E9FF call 00404AEC
0056E9E4 |83F8 08 cmp eax, 8 ; S3的长度与8比较
0056E9E7 |7D 30 jge short 0056EA19 ; 不小于则跳
0056E9E9 |8D45 EC lea eax, [ebp-14]
0056E9EC |50 push eax
0056E9ED |8B07 mov eax, [edi] ; S3
0056E9EF |B9 04000000 mov ecx, 4 ; 取4位
0056E9F4 |BA 01000000 mov edx, 1 ; 从第一位起
0056E9F9 |E8 4E63E9FF call 00404D4C
0056E9FE |8D45 E8 lea eax, [ebp-18]
0056EA01 |50 push eax
0056EA02 |8B07 mov eax, [edi] ; S3
0056EA04 |E8 E360E9FF call 00404AEC
0056EA09 |8BC8 mov ecx, eax
0056EA0B |8B07 mov eax, [edi]
0056EA0D |BA 05000000 mov edx, 5
0056EA12 |E8 3563E9FF call 00404D4C
0056EA17 |EB 43 jmp short 0056EA5C
0056EA19 |8D45 EC lea eax, [ebp-14]
0056EA1C |50 push eax
0056EA1D |8B07 mov eax, [edi] ; S3
0056EA1F |B9 05000000 mov ecx, 5 ; 取5位
0056EA24 |BA 01000000 mov edx, 1 ; 从第1位起
0056EA29 |E8 1E63E9FF call 00404D4C
0056EA2E |8D45 E8 lea eax, [ebp-18]
0056EA31 |50 push eax
0056EA32 |8B07 mov eax, [edi]
0056EA34 |B9 04000000 mov ecx, 4 ; 取4位
0056EA39 |BA 06000000 mov edx, 6 ; 从第6位起
0056EA3E |E8 0963E9FF call 00404D4C
0056EA43 |8D45 E4 lea eax, [ebp-1C]
0056EA46 |50 push eax
0056EA47 |8B07 mov eax, [edi]
0056EA49 |E8 9E60E9FF call 00404AEC
0056EA4E |8BC8 mov ecx, eax
0056EA50 |8B07 mov eax, [edi]
0056EA52 |BA 0A000000 mov edx, 0A ;从第10位开始
0056EA57 |E8 F062E9FF call 00404D4C
0056EA5C 837D E4 00 cmp dword ptr [ebp-1C], 0 ; Key3为空吗?
0056EA60 74 2C je short 0056EA8E ; 为空则跳!
0056EA62 FF75 EC push dword ptr [ebp-14] ; Key1
0056EA65 68 F0EA5600 push 0056EAF0
0056EA6A FF75 E8 push dword ptr [ebp-18] ; Key2
0056EA6D 68 F0EA5600 push 0056EAF0
0056EA72 FF75 E4 push dword ptr [ebp-1C] ; Key3
0056EA75 8D45 DC lea eax, [ebp-24]
0056EA78 BA 05000000 mov edx, 5 ; 哈哈,这个参数是干什么用的呢?
0056EA7D E8 2A61E9FF call 00404BAC
0056EA82 8B45 DC mov eax, [ebp-24] ; 真码
0056EA85 8BD7 mov edx, edi ; S3
0056EA87 E8 58A8E9FF call 004092E4
0056EA8C EB 22 jmp short 0056EAB0
0056EA8E FF75 EC push dword ptr [ebp-14]
0056EA91 68 F0EA5600 push 0056EAF0
0056EA96 FF75 E8 push dword ptr [ebp-18]
0056EA99 8D45 D8 lea eax, [ebp-28]
0056EA9C BA 03000000 mov edx, 3
0056EAA1 E8 0661E9FF call 00404BAC
0056EAA6 8B45 D8 mov eax, [ebp-28]
0056EAA9 8BD7 mov edx, edi
0056EAAB E8 34A8E9FF call 004092E4
0056EAB0 33C0 xor eax, eax
0056EAB2 5A pop edx
0056EAB3 59 pop ecx
0056EAB4 59 pop ecx
0056EAB5 64:8910 mov fs:[eax], edx
0056EAB8 68 DFEA5600 push 0056EADF
0056EABD 8D45 D8 lea eax, [ebp-28]
0056EAC0 BA 02000000 mov edx, 2
0056EAC5 E8 865DE9FF call 00404850
0056EACA 8D45 E4 lea eax, [ebp-1C] ; Key3
0056EACD BA 05000000 mov edx, 5
0056EAD2 E8 795DE9FF call 00404850
0056EAD7 C3 retn
0056EBDB 8B55 E4 mov edx, [ebp-1C] ; 真码
0056EBDE A1 CC5E5F00 mov eax, [5F5ECC] ; 假码
0056EBE3 E8 5060E9FF call 00404C38 ; 关键比较
0056EBE8 0F9445 FF sete [ebp-1] ; 也可以在这里爆破
0056EBEC 33C0 xor eax, eax
0056EBEE 5A pop edx
0056EBEF 59 pop ecx
0056EBF0 59 pop ecx
0056EBF1 64:8910 mov fs:[eax], edx
0056EBF4 68 11EC5600 push 0056EC11
0056EBF9 8B45 F8 mov eax, [ebp-8]
0056EBFC E8 BB4DE9FF call 004039BC
0056EC01 8B45 F0 mov eax, [ebp-10]
0056EC04 E8 B34DE9FF call 004039BC
0056EC09 C3 retn
005A9924 84C0 test al, al ; 标志位比较
005A9926 74 27 je short 005A994F ; 关键跳,跳则注册失败
另:
00404B07 89D6 mov esi, edx
00404B09 8B79 FC mov edi, [ecx-4] ; 机器码长度
00404B0C 8B56 FC mov edx, [esi-4] ; ASCII "H0"的长度=2
00404B0F 01FA add edx, edi ; 相加
00404B11 39CE cmp esi, ecx
00404B13 74 17 je short 00404B2C
00404B15 E8 5E030000 call 00404E78
00404B1A 89F0 mov eax, esi ; 机器码
00404B1C 8B4E FC mov ecx, [esi-4] ; 机器码长度
00404B1F 8B13 mov edx, [ebx] ; ASCII "H0"
00404B21 01FA add edx, edi
00404B23 E8 F4DEFFFF call 00402A1C
可以看出,上面的内容其实就是字符串“H0”连接机器码
还有:
004092E4 /$ 53 PUSH EBX
004092E5 |. 56 PUSH ESI
004092E6 |. 57 PUSH EDI
004092E7 |. 8BFA MOV EDI,EDX
004092E9 |. 8BF0 MOV ESI,EAX
004092EB |. 8BC6 MOV EAX,ESI
004092ED |. E8 FAB7FFFF CALL vip.00404AEC
004092F2 |. 8BD8 MOV EBX,EAX
004092F4 |. 8BC7 MOV EAX,EDI
004092F6 |. 8BD3 MOV EDX,EBX
004092F8 |. E8 7BBBFFFF CALL vip.00404E78
004092FD |. 8BD6 MOV EDX,ESI
004092FF |. 8B37 MOV ESI,DWORD PTR DS:[EDI]
00409301 |. 85DB TEST EBX,EBX
00409303 |. 74 15 JE SHORT vip.0040931A
00409305 |> 8A02 /MOV AL,BYTE PTR DS:[EDX]
00409307 |. 3C 61 |CMP AL,61
00409309 |. 72 06 |JB SHORT vip.00409311
0040930B |. 3C 7A |CMP AL,7A
0040930D |. 77 02 |JA SHORT vip.00409311
0040930F |. 2C 20 |SUB AL,20
00409311 |> 8806 |MOV BYTE PTR DS:[ESI],AL
00409313 |. 42 |INC EDX
00409314 |. 46 |INC ESI
00409315 |. 4B |DEC EBX
00409316 |. 85DB |TEST EBX,EBX
00409318 |.^ 75 EB \JNZ SHORT vip.00409305
0040931A |> 5F POP EDI //对注册码检测就是有小写字母转大写
0040931B |. 5E POP ESI
0040931C |. 5B POP EBX
0040931D \. C3 RETN
即小写字母转大写
/////////////////////////////////////////////////////////////////////////////////////////////////////////
ok,现在这软件的注册算法基本清楚了!
0.字符串“HO”连接机器码,得到变形的机器码。本例为H0Y31QH89E;
1.依次取变形的机器码(本例为H0Y31QH89E)每一位ASC,按照下述方式运算:
第一位ASC + 64 的和 除以 常数5B,其余数作为ASC,得到对应的字符,(对余数的检测及变化见0056E889 - 0056E8A9区间,有可能会影响到下一位的运算结果。此略)
第二位ASC + [(第一位运算的余数 + 64) * 2] 除以 常数5B ,其余数作为ASC,得到对应的字符,
第三位ASC + [ (第二位运算的余数 + 64) * 2] 除以 常数5B ,其余数作为ASC,得到对应的字符,
...
以此类推,直到变形机器码取完为止,得到字符串(本例为“QGC9ZCCE19”),设为S1;
如果S1的长度为0,则略过下面的2这一步。而S3就等价于S1了!
2.与得到S1的方法一样,同样对S1进行取余的运算。(在此略过)得到字符串S2(本例为"ZWMA83B7VA");
3.S2连接S1,得到S3(本例为“ZWMA83B7VAQGC9ZCCE19”);
4.根据S3的长度,分别对应如下的注册码形式
a.S3长度<8,则注册码形式为:****-***; (第二段为S3的第5位开始剩下的部分)
b.7< S3长度<15,则注册码形式为:*****-****-*****; (第三段为S3的第9位开始剩下的部分)
c.14<S3长度,则注册码形式为:******-*****-****... (第三段为S3的第12位开始剩下的部分)
本例S3为20位,则注册码为:ZWMA83-B7VAQ-GC9ZCCE19
有小写字母则转为大写!
//////////////////////////////////////////////////////////////////////////////////////////////////
关于算法总结中得到S1的过程举例如下:
本机变形的机器码(本例为H0Y31QH89E)
第一位为H,ASC为48(16进制,下同)。
(48 + 64) / 5B ,
得到的余数为51H,(经过余数检测运算仍然不变)将其看做ASC码,则其对应的字符为“Q”,得到S1的第1位;
第二位为0,ASC为30(16进制),则:
[30 + (51H + 64)* 2 ] / 5B ,
得到的余数为2E,(注意:经过余数检测运算,2E变为47了,具体参见0056E889 - 0056E8A9区间),将其看作ASC码,则其对应的字符为“G”,得到S1的第2位;
...
最终得到S1为“QGC9ZCCE19”
好,咱输入注册码:ZWMA83-B7VAQ-GC9ZCCE19,注册成功!且注册按钮已变灰!
注册信息保存在:
[HKEY_LOCAL_MACHINE\SOFTWARE\wgzm\ckmxczdj]
"rc"="ZWMA83-B7VAQ-GC9ZCCE19"
"sysj"=hex:00,00,00,00,c0,d2,e3,40
删除变回未注册版!
|
评分
-
查看全部评分
|