Destravando o Protect98 2.04
by HaWK

Onde conseguir o programa:

 http://www.protect98.com.br

Pré-Requisitos:

- Conhecimentos basicos de Assembly

Ferramentas Necessárias:

- W32Dasm 8.9

- Hiew 5.84 ou superior


Blá-Blá-Blá Inicial

 Este tutorial serve com fins apenas educativos. Se vc gostou do programa, COMPRE o ORIGINAL! Vale a Pena!


COMEÇANDO...

    Resolvi escrever este tutorial, para mostrar as fragilidades da "trava" deste programa.
    Bom, primeiramente executamos o Protect98 normalmente, e digitamos um nome , e dados nos respectivos campos. Então entramos com a senha: 123456-000000-123456
    Bem, mas porque esta senha? Porque como experiência anterior sabemos que a senha do Protect98 é composta de 3 grupos de 6 digitos, separados por "-", sendo que o grupo do meio, se compõe com a data limite para a execução do programa e os outros são o checksum, e o Nº da licença. Se digitarmos o grupo do meio como uma sequência de 0s (Zeros)  o programa não irá expirar mais, ficando assim "registrado".

    Qual a mensagem que aparece, quando pressionamos <enter>?

Dados incorretos.
Digite os dados de registro exatamente como recebeu.

Ok. GUARDE esta mensagem de erro.

    Agora vamos executar o W32DASM, antes disso convem tirar um backup do arquivo do Protect98, no caso PROTECT.EXE, renomearei para PROTECT.BKP

    Dentro do WDASM, selecionamos:

    Disassembler
    +---------------Open File to Disassemble

    Escolhemos então o arquivo PROTECT.EXE

    O W32DASM vai desassemblar o programa.

    Agora selecionamos o seguinte:

    Refs
    +-----------String Data References

    Lembra-se da mensagem de erro? Ok, vamos procurar a mensagem de erro na lista e damos um duplo clique na mensagem de erro. Isto irá nos levar diretamente para a rotina que é "referenciada" por esta mensagem. O código que chama esta mensagem é o seguinte:

:0040BAC6 52                         push edx
:0040BAC7 E884020000        call 0040BD50              ; <---- Checagem do Nº de série
:0040BACC 83C40C               add esp, 0000000C
:0040BACF 85C0                    test eax, eax                  ; Está correto? EAX = 1???
:0040BAD1 7513                     jne 0040BAE6              ; Sim está, entao vá para 0040BAE6.

* Possible Reference to String Resource ID=59190: "Dados incorretos.
                                  |
:0040BAD3 6836E70000         push 0000E736            ; Não, não está... Mostre msg de erro, etc...
:0040BAD8 8D4C2408            lea ecx, dword ptr [esp+08]
:0040BADC E869670100        call 0042224A

    A rotina 40BD50 é a rotina de checagem do Nº de série, que funciona da seguinte forma:
    O Retorno se dá em EAX, ou seja se EAX = 1, o checksum do Nº de série está correto, caso EAX=0, então o Nº de série não está correto.
    Vamos lá para a rotina 40BD50 ver como ela funciona e forçá-la para ela SEMPRE retornar EAX=1, porque se houver uma checagem no meio do programa para esta rotina ela sempre vai retornar com EAX=1 (Nº de serie Ok)

    A rotina é chamada por 3 enderecos! (O que significa que 3 lugares dentro do Protect98 devem checar se o Nº de série está Ok).

* Referenced by a CALL at Addresses:   <- 3 lugares chamam esta rotina!
|:0040BAC7   , :0040BCE2   , :0040BFA8
|
:0040BD50 53                      push ebx
:0040BD51 8B5C2408         mov ebx, dword ptr [esp+08]
:0040BD55 56                      push esi
:0040BD56 8B742414          mov esi, dword ptr [esp+14]
:0040BD5A 57                      push edi
:0040BD5B 8B7C2414         mov edi, dword ptr [esp+14]
:0040BD5F 6A01                  push 00000001
:0040BD61 56                       push esi
:0040BD62 57                       push edi
:0040BD63 53                       push ebx
:0040BD64 E827000000       call 0040BD90
:0040BD69 83C410               add esp, 00000010
:0040BD6C 85C0                  test eax, eax                             ; Registro Ok? Se sim EAX=0
:0040BD6E 7514                   jne 0040BD84

    Neste endereco 40BD6E, tem um salto condicional:

jne 0040BD84

    Se o Registro EAX=1, o Nº. de registro do Programa está ok, então ao inves de JNE, vamos mudá-lo para JE (Pule se EAX = 0).
    Para isto olhamos qual é o offset do programa, na barra inferior do W32DASM:

    O offset eh 0000B16Eh <- Guarde este endereco

:0040BD70 50                      push eax
:0040BD71 56                      push esi
:0040BD72 57                      push edi
:0040BD73 53                      push ebx
:0040BD74 E817000000     call 0040BD90
:0040BD79 83C410             add esp, 00000010
:0040BD7C 85C0                test eax, eax                        ; No. de Registro Ok?
:0040BD7E 7504                 jne 0040BD84                     ; Se EAX=1 Registro Ok
:0040BD80 5F                     pop edi
:0040BD81 5E                     pop esi
:0040BD82 5B                     pop ebx
:0040BD83 C3                     ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
:0040BD6E(C), :0040BD7E(C)

:0040BD84 5F                     pop edi
:0040BD85 5E                     pop esi
:0040BD86 B801000000     mov eax, 00000001                 ; Registro Ok!!!
:0040BD8B 5B                    pop ebx
:0040BD8C C3                    ret
 

    A mesma coisa acontece, no endereco 40BD7E, tem um salto condicional:

jne 0040BD84

    Se o Registro EAX=1. Nº de registro do Programa ok, então ao inves de JNE, vamos mudá-lo para JE (Pule se EAX = 0)
    Para isto olhamos qual eh o offset do programa, na barra inferior do W32DASM:

    O offset eh 0000B17Eh <- Guarde este endereco

    Fechamos o W32DASM, agora vamos entrar no programa chamado HIEW, da seguinte forma:

    HIEW PROTECT.EXE

    Pressionamos F4 e escolhemos DECODE, para ele desassemblar.

    Pressiona-se F5 e digitamos o endereco B16E ele vai saltar para este endereco.
    Pressiona-se F3 e mudamos o byte 75 (jne) para 74 (je)
    Agora com a seta, vamos logo abaixo para o endereco B17E e mudamos tambem o byte 75(jne) para 74 (je).
    Pressiona-se F9 para gravar.

Pronto! O Protect98 esta destravado!!!!!!!!!
Agora podemos registrar o programa da seguinte forma:

Nome: HaWK (ou outra coisa)
Dados: HaWK (ou outra coisa)
Registro: 123456-000000-123456


CONCLUSÃO

    Esta é apenas UMA das muitas formas de se destravar um programa.
    É claro que esta é para iniciantes. Existem programas que só dão para destravar juntamente com um programa chamado SOFTICE. Que é um debugger On-the-Fly. Ou seja você está rodando um programa, pressiona-se CTRL+D, e bum! Entra o SOFTICE, aí então é só alegria... Mas fica para um próximo tutorial, já que o SI é um pouco complicado de se mexer.
    Um conselho, aprenda primeiro a destravar com o WDASM, tem UM MONTE de programa que dá!