果然不是新手能破的了的。
偶是新手只会破解前四位序列号。
这个还是偶第一个分析算法的软件呢。算法都没见过。不知道怎么弄出来
现分析出下。
软件使用的是重启验证机制,用户名和注册码都写入注册表
并且写入附加数据 PLAY/BOY 两个键
PLAY 的算法
COUNT shl 1 * pi
0040106D 6A 18 push 18
0040106F 8D45 D0 lea eax, [ebp-30]
00401072 50 push eax
00401073 68 D5070000 push 7D5
00401078 FF75 08 push dword ptr [ebp+8]
0040107B E8 DA090000 call <jmp.&user32.GetDlgItemTextA>
00401080 D1E0 shl eax, 1 ; 序列号个数左移1位
00401082 8945 C4 mov [ebp-3C], eax ; 放入内存
00401085 DB45 C4 fild dword ptr [ebp-3C] ; 放入st(0)
00401088 D9EB fldpi ; 放入st(1) pi
0040108A DEC9 fmulp st(1), st ; st(1) * st(0)
0040108C D95D CC fstp dword ptr [ebp-34] ; 放入变量
BOY的算法是
0040108F 8D75 D4 lea esi, [ebp-2C] ; 跳过前四位 取序列号后面的字符
00401092 8D7D C8 lea edi, [ebp-38]
00401095 6A 03 push 3
00401097 59 pop ecx ; 3次
00401098 A4 movs byte ptr es:[edi], byte ptr [esi]
00401099 83C6 04 add esi, 4 ; 间隔4位字符取3个字符 也就是从第二组开始取第一个字符
0040109C ^ E2 FA loopd short 00401098
0040109E B8 47434644 mov eax, 44464347
004010A3 3145 C8 xor [ebp-38], eax ; 将挑出来的字符异或44464347
好像在后面还有计算,不会分析了
有一段好像是内存解压代码 不知道是什么意思
执行前是
004010BB 8D05 D7104000 lea eax, [4010D7] ; 指向代码
004010C1 B9 2C000000 mov ecx, 2C
004010C6 8B15 06114000 mov edx, [401106]
004010CC 3110 xor [eax], edx ; 解密
004010CE 83C0 04 add eax, 4
004010D1 83E9 04 sub ecx, 4
004010D4 ^ 75 F6 jnz short 004010CC
004010D6 61 popad
004010D7 9D popfd
执行后的代码
004010BB 8D05 D7104000 lea eax, [4010D7] ; 指向代码
004010C1 B9 2C000000 mov ecx, 2C
004010C6 8B15 06114000 mov edx, [401106]
004010CC 3110 xor [eax], edx ; 解密
004010CE 83C0 04 add eax, 4
004010D1 83E9 04 sub ecx, 4
004010D4 ^ 75 F6 jnz short 004010CC
004010D6 61 popad
004010D7 A1 6B304000 mov eax, [40306B] ; [40306B] = D72CAF21 哪来的?
004010DC 85C0 test eax, eax
004010DE 74 32 je short 00401112
004010E0 35 71FF2CD7 xor eax, D72CFF71 ; EAX xor D72CFF71
004010E5 C1E8 04 shr eax, 4 ; 右移4位
004010E8 8B35 06114000 mov esi, [401106] ; 4376073C
004010EE 3335 03114000 xor esi, [401103] ; 3CE08A40
004010F4 3335 0D114000 xor esi, [40110D] ; EBCC7531
004010FA 3335 0A114000 xor esi, [40110A] ; 31C85531
00401100 90 nop
00401101 90 nop
00401102 90 nop
00401103 40 inc eax ; EAX ++
00401104 8AE0 mov ah, al
00401106 3C 07 cmp al, 7 ;
00401108 76 43 jbe short 0040114D
0040110A 3155 C8 xor [ebp-38], edx ; 这里是 BOY
0040110D 3175 CC xor [ebp-34], esi ; 这里是 PLAY
前四位序列号的计算方法是
先通过用户名第一组四个字符计算生成一个数字
然后再通过一个计算在CodedByTy123-China字符串里取值
这个可以把算法反过来就可以得到序列号
0040143C FF75 9B push dword ptr [ebp-65]
0040143F 58 pop eax ; 用户名 前四位
00401440 C1C0 08 rol eax, 8 ; 循环左移8位
00401443 3345 FC xor eax, [ebp-4] ; 再异或C盘序号
00401446 2E:3305 7514400>xor eax, cs:[401475] ; 再异或850F073A
0040144D 8945 90 mov [ebp-70], eax
00401453 8B45 DB mov eax, [ebp-25] ; 序列号
00401456 0FC8 bswap eax ; 交换顺序
00401458 C1C8 08 ror eax, 8 ; 循环右移8位
0040145B 8945 DB mov [ebp-25], eax
0040145E 8D7D DB lea edi, [ebp-25]
00401461 6A 04 push 4
00401463 59 pop ecx
00401464 6A 10 push 10
00401466 5A pop edx
00401467 8D1D 00304000 lea ebx, [403000] ; 字符 CodedByTy123-China
0040146D 33C0 xor eax, eax
0040146F AC lods byte ptr [esi] ; 取用户名算出来的字符第一个字节到al
00401470 F6F2 div dl ; 将值 / 10
00401472 86C4 xchg ah, al ; 交换 ah, al
00401474 D7 xlat byte ptr [ebx+al] ; 从字符 CodedByTy123-China 中取值
00401475 3A07 cmp al, [edi] ; 对比
第二个对比的地方 这里反着算不了.....
00401498 8B45 88 mov eax, [ebp-78] ; BOY
0040149B 2E:3305 7514400>xor eax, cs:[401475] ; 异或850F073A
004014A2 3345 8C xor eax, [ebp-74] ; 异或 PLAY=COUNT shl 1 * pi
004014A5 F7D0 not eax ; 取反
004014A7 35 CA158B7D xor eax, 7D8B15CA ; 异或 7D8B15CA
第三个对比的地方
004014B2 8D75 E0 lea esi, [ebp-20] ; 继续取序列号的第二组四个字符
004014B5 8B06 mov eax, [esi] ; 取四位放入eax
004014B7 3345 DB xor eax, [ebp-25] ; 和序列号生成的前四位数异或
004014BA 8906 mov [esi], eax
004014BC 33C0 xor eax, eax
004014BE 33D2 xor edx, edx
004014C0 6A 04 push 4
004014C2 59 pop ecx
004014C3 AC lods byte ptr [esi] ; 放入al
004014C4 3203 xor al, [ebx] ; xor Code
004014C6 03D0 add edx, eax ; edx += eax
004014C8 43 inc ebx
004014C9 ^ E2 F8 loopd short 004014C3
004014CB 52 push edx ; edx
004014CC 8D75 9B lea esi, [ebp-65] ; esi = 用户名
004014CF 33C0 xor eax, eax
004014D1 33D2 xor edx, edx
004014D3 6A 04 push 4
004014D5 59 pop ecx
004014D6 AC lods byte ptr [esi]
004014D7 3203 xor al, [ebx] ; xor dByT
004014D9 03D0 add edx, eax ; edx += eax
004014DB 43 inc ebx
004014DC ^ E2 F8 loopd short 004014D6
004014DE 87CA xchg edx, ecx
004014E0 5A pop edx
004014E1 33CA xor ecx, edx ; edx1 != edx2 序列号不对
后面的不会算了... 5555555