破解说明:最近下了不少高考题的电子书,都要求注册才能看。我一个穷教师为了学生,只好拿起武器——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

  • 标 题: 答复
  • 作 者:Pr0Zel
  • 时 间:2005-07-05 10:32

004DCCA3    cdq                                      ; EDX清零
这一句是不正确,
这是一个扩展数位的操作符
可以看看下面的:

CDQ 指令

指令格式: CDQ

指令功能: 将EAX中的数符号扩展为EDX:EAX中的64位数,EDX存放高32位,Q表示8个字节.

指令说明: 该指令一般用在累加器参加算术运算之前,以符合运算规则或防止溢出.

  • 标 题: 答复
  • 作 者:小虾
  • 时 间:2005-07-05 10:56

CDQ是扩展指令,将EDX扩展为EAX的高位,除了上面兄弟说的之外,CDQ在扩展时也分有符号数和无符号,如果EAX是有符号数,EDX将被扩展成有符号数“0FFFFFFFFh”,如果EAX是无符号数,EDX将被清0。