破解说明:最近下了不少高考题的电子书,都要求注册才能看。我一个穷教师为了学生,只好拿起武器――OD。为了保护作者版权,这里略去软件名称及具体做法,并且隐藏了某些特征字符。
破解过程:用OD载入,提示有壳,不理它,F9运行。随便点一套题,跳出注册框。随便填入,点注册,提示错误。
下断点:bp MessageBoxA,再次注册,程序中断,返回几次后可以找到比较点。
或者用h-point断点在程序复制输入码时中断。慢慢跟踪找比较点。
具体注册码的计算过程如下:
004DCB7C push ebp
004DCB7D mov ebp,esp
004DCB7F add esp,-24
004DCB82 push ebx
004DCB83 push esi
004DCB84 push edi
004DCB85 xor ebx,ebx
004DCB87 mov dword ptr ss:[ebp-24],ebx
004DCB8A mov dword ptr ss:[ebp-1C],ebx
004DCB8D mov dword ptr ss:[ebp-C],ecx
004DCB90 mov dword ptr ss:[ebp-8],edx
004DCB93 mov dword ptr ss:[ebp-4],eax
004DCB96 mov eax,dword ptr ss:[ebp-8]
004DCB99 call 2005gaok.00404100
004DCB9E mov eax,dword ptr ss:[ebp-C]
004DCBA1 call 2005gaok.00404100
004DCBA6 xor eax,eax
004DCBA8 push ebp
004DCBA9 push 2005gaok.004DCD74
004DCBAE push dword ptr fs:[eax]
004DCBB1 mov dword ptr fs:[eax],esp
004DCBB4 mov eax,dword ptr ss:[ebp-4]
004DCBB7 call 2005gaok.004D9C2C
004DCBBC mov dword ptr ss:[ebp-18],42 ; [EBP-18]=42,常数66
004DCBC3 xor eax,eax
004DCBC5 mov dword ptr ss:[ebp-10],eax
004DCBC8 lea eax,dword ptr ss:[ebp-1C]
004DCBCB call 2005gaok.00403CCC
004DCBD0 xor eax,eax
004DCBD2 mov dword ptr ss:[ebp-20],eax ; 计数器[ebp-20]=0
004DCBD5 lea eax,dword ptr ss:[ebp-C]
004DCBD8 push eax
004DCBD9 mov eax,dword ptr ss:[ebp-C]
004DCBDC call 2005gaok.00403F4C ; 机器码*************长度
004DCBE1 mov ecx,eax
004DCBE3 mov edx,5
004DCBE8 mov eax,dword ptr ss:[ebp-C]
004DCBEB call 2005gaok.00404154 ; 取机器码最后9位
004DCBF0 mov eax,dword ptr ss:[ebp-C]
004DCBF3 call 2005gaok.00403F4C ; lenth=9
004DCBF8 mov esi,eax
004DCBFA test esi,esi
004DCBFC jle short 2005gaok.004DCC12
004DCBFE mov ebx,1
004DCC03 mov eax,dword ptr ss:[ebp-C]
004DCC06 movzx eax,byte ptr ds:[eax+ebx-1]
004DCC0B add dword ptr ss:[ebp-10],eax ; 逐位相加,结果1D0
004DCC0E inc ebx
004DCC0F dec esi
004DCC10 jnz short 2005gaok.004DCC03
004DCC12 xor eax,eax
004DCC14 mov dword ptr ss:[ebp-14],eax
004DCC17 mov eax,dword ptr ss:[ebp-8] ; 密钥:*********
004DCC1A call 2005gaok.00403F4C ; lenth=9
004DCC1F mov esi,eax
004DCC21 test esi,esi
004DCC23 jle short 2005gaok.004DCC39
004DCC25 mov ebx,1
004DCC2A mov eax,dword ptr ss:[ebp-8]
004DCC2D movzx eax,byte ptr ds:[eax+ebx-1]
004DCC32 add dword ptr ss:[ebp-14],eax ; 逐位相加,结果2C0
004DCC35 inc ebx
004DCC36 dec esi
004DCC37 jnz short 2005gaok.004DCC2A
004DCC39 mov eax,dword ptr ss:[ebp-C] ; 机器码最后9位
004DCC3C call 2005gaok.00403F4C ; lenth=9
004DCC41 mov esi,eax ; 计数器ESI=9
004DCC43 test esi,esi
004DCC45 jle 2005gaok.004DCD2F
004DCC4B mov ebx,1 ; 计数器EBX=1
004DCC50 mov eax,dword ptr ss:[ebp-8] ; 大循环开始。密钥:*********
004DCC53 call 2005gaok.00403F4C ; lenth=9
004DCC58 inc eax ; 加1
004DCC59 cmp ebx,eax ; EBX>EAX?
004DCC5B jge short 2005gaok.004DCCAA ; 是则跳(不可能)
004DCC5D lea eax,dword ptr ds:[ebx+5] ; EAX=EBX+5
004DCC60 mov edx,dword ptr ss:[ebp-8] ; 密钥:*********
004DCC63 movzx edx,byte ptr ds:[edx+ebx-1] ; 逐位取字符
004DCC68 imul edx ; EAX×EDX,结果保存于EAX
004DCC6A add eax,ebx ; EAX+EBX
004DCC6C mov edx,dword ptr ss:[ebp-C] ; 取机器码最后9位
004DCC6F movzx edx,byte ptr ds:[edx+ebx-1] ; 逐位取字符
004DCC74 imul edx ; EAX×EDX,结果保存于EAX
004DCC76 mov ecx,ebx ; ECX=EBX
004DCC78 add ecx,ecx ; ECX+ECX
004DCC7A mov edx,ecx ; EDX=ECX,即EBX×2
004DCC7C imul edx,dword ptr ss:[ebp-18] ; EDX×66,即EBX×2×66
004DCC80 add eax,edx ; EAX+EDX
004DCC82 imul ecx,ebx ; ECX×EBX,即EBX*EBX*2
004DCC85 add ecx,0D ; ECX+D,即13
004DCC88 imul ecx,dword ptr ss:[ebp-10] ; ECX×累加结果,即1D0
004DCC8C add eax,ecx ; EAX+ECX
004DCC8E lea edx,dword ptr ds:[ebx+ebx*2] ; EDX=EBX×3
004DCC91 add edx,0C ; EDX+C,即12
004DCC94 imul edx,dword ptr ss:[ebp-14] ; EDX×累加结果即2C0
004DCC98 add eax,edx ; EAX+EDX
004DCC9A mov edx,0E6 ; EDX=E6,常数,即230
004DCC9F sub edx,ebx ; EDX-EBX
004DCCA1 mov ecx,edx ; ECX=EDX
004DCCA3 cdq ; EDX清零
004DCCA4 idiv ecx ; EAX÷ECX,余数保存在EDX
004DCCA6 mov edi,edx ; EDI=EDX
004DCCA8 jmp short 2005gaok.004DCCEA
004DCCAA mov eax,dword ptr ss:[ebp-C] ; 以下这一小节没用
004DCCAD movzx eax,byte ptr ds:[eax+ebx-1]
004DCCB2 shl eax,3
004DCCB5 mov ecx,ebx
004DCCB7 shl ecx,2
004DCCBA add eax,ecx
004DCCBC imul ecx,dword ptr ss:[ebp-18]
004DCCC0 add ecx,17
004DCCC3 imul ecx
004DCCC5 mov edx,dword ptr ss:[ebp-10]
004DCCC8 shl edx,3
004DCCCB add eax,edx
004DCCCD mov edx,dword ptr ss:[ebp-14]
004DCCD0 lea edx,dword ptr ds:[edx+edx*8]
004DCCD3 add eax,edx
004DCCD5 mov edx,ebx
004DCCD7 imul edx,ebx
004DCCDA add eax,edx
004DCCDC mov edx,0F0
004DCCE1 sub edx,ebx
004DCCE3 mov ecx,edx
004DCCE5 cdq
004DCCE6 idiv ecx
004DCCE8 mov edi,edx
004DCCEA cmp dword ptr ss:[ebp-20],3 ; 计数器[ebp-20]是否≤3
004DCCEE jle short 2005gaok.004DCCFE
004DCCF0 mov eax,edi ; >四次后的计算,EAX=EDI
004DCCF2 mov ecx,9 ; ECX=9
004DCCF7 cdq ; EDX清零
004DCCF8 idiv ecx ; EAX÷ECX,余数保存在EDX(余数<9)
004DCCFA mov edi,edx ; EDI=EDX
004DCCFC jmp short 2005gaok.004DCD0A
004DCCFE mov eax,edi ; EAX=EDI
004DCD00 mov ecx,63 ; ECX=63,常数,即99
004DCD05 cdq ; EDX清零
004DCD06 idiv ecx ; EAX÷ECX,余数保存在EDX(余数<99)
004DCD08 mov edi,edx ; EDI=EDX
004DCD0A cmp edi,9 ; 是否≤9
004DCD0D jle short 2005gaok.004DCD12 ; 是则跳(第四次时跳)
004DCD0F inc dword ptr ss:[ebp-20] ; 计数器[ebp-20]+1
004DCD12 lea edx,dword ptr ss:[ebp-24] ; 设置缓存
004DCD15 mov eax,edi ; EAX=EDI
004DCD17 call 2005gaok.004094D4 ; EAX转成十进制,再转成字符串
004DCD1C mov edx,dword ptr ss:[ebp-24] ; 新字符串
004DCD1F lea eax,dword ptr ss:[ebp-1C] ; 原字符串
004DCD22 call 2005gaok.00403F54 ; 连接字符串
004DCD27 inc ebx ; 计数器EBX+1
004DCD28 dec esi ; 计数器ESI-1
004DCD29 jnz 2005gaok.004DCC50 ; 继续大循环
004DCD2F mov eax,dword ptr ss:[ebp+8] ; 设置缓存
004DCD32 mov edx,dword ptr ss:[ebp-1C] ; 得到的字符串
004DCD35 call 2005gaok.00403D20 ; 字符串转换移。
004DCD3A xor ecx,ecx ; 以下清空数据.....
004DCD3C mov edx,5
004DCD41 mov eax,dword ptr ss:[ebp-4]
004DCD44 call 2005gaok.004D9C6C
004DCD49 xor eax,eax
004DCD4B pop edx
004DCD4C pop ecx
004DCD4D pop ecx
004DCD4E mov dword ptr fs:[eax],edx
004DCD51 push 2005gaok.004DCD7B
004DCD56 lea eax,dword ptr ss:[ebp-24]
004DCD59 call 2005gaok.00403CCC
004DCD5E lea eax,dword ptr ss:[ebp-1C]
004DCD61 call 2005gaok.00403CCC
004DCD66 lea eax,dword ptr ss:[ebp-C]
004DCD69 mov edx,2
004DCD6E call 2005gaok.00403CF0
004DCD73 retn
004DCD74 jmp 2005gaok.004036E0
004DCD79 jmp short 2005gaok.004DCD56
004DCD7B pop edi
004DCD7C pop esi
004DCD7D pop ebx
004DCD7E mov esp,ebp
004DCD80 pop ebp
004DCD81 retn 4
前四次计算结果每次得2位数(余数<99),后5次计算结果每次得1位数(余数<9),一共13位注册码,再与关键字符**连接。
VB做的注册机(可以用Word宏运行):
sub main()
A = 机器码
A = Right(A, 9)
B = 密钥
A1 = 0: B1 = 0
For i = 0 To 8
A1 = A1 + Asc(Mid(A, i + 1, 1))
B1 = B1 + Asc(Mid(B, i + 1, 1))
Next
char = ""
For i = 1 To 9
R2 = i + 5
R2 = R2 * Asc(Mid(B, i, 1))
R2 = R2 + i
R2 = R2 * Asc(Mid(A, i, 1))
D = i * 2 * 66
R2 = R2 + D
C = (2 * i * i + 13) * A1
R2 = R2 + C
D = i * 3 + 12
R2 = R2 + D * B1
C = 230 - i
D = R2 Mod C
If i <= 4 Then
R2 = D Mod 99
char = char & R2
Else
R2 = D Mod 9
char = char & R2
End If
Next
InputBox "您的注册码为:", "Greet", ** & char
End Sub
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)