Destravando o Advanced Access Password Recovery 1.1 (ACPR)
by HaWK

Onde conseguir o programa:

http://www.elcomsoft.com/acpr.html

O que faz o Programa:

Retira, mostra ou troca senhas de um banco de dados, feito peloMS Access 95/97

Pré-Requisitos:

- Conhecimentos basicos de Assembly

Ferramentas Necessárias:

- W32Dasm 8.93

- Hiew 6.00 ou superior

- ProcDump 1.20 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...



Vamos a mais um tutorial para iniciantes.

Primeiramente executa-se o programa. Aparentemente parecer ser um programa DOS, PORÉM quando se executa da seguinte forma: ACPR /register, aparece um Dialog Box, pedindo o Número do registro. Digitamos um valor qualquer e então pressionamos <ENTER>

Aparece uma mensagem: The code you've entered is invalid!

Entramos no WDASM 8.93 e disassemblamos o programa.
Se você procurar a Referência para esta String, não vai encontrá-la, certo?

Ok... O código deve estar protegido por algum packer...

Particularmente quando eu quero ver o conteúdo de um arquivo qualquer eu utilizo o Windows Commander, mas você pode usar qualquer outra coisa para isto.
Analisando os códigos ASCII, no final do arquivo, você vai ver o seguinte:

WWPack32 decompression routine version 1.00 (c) 1997 Piotr Warezak and Rafal Wierzbicki

Beleza!!!! Está compactado com WWPack versão 1.0.

Isto significa que quando executamos o arquivo ele se autodescompacta na memória e só então é executado. Isto é semelhante ao velho PKLITE da PKWARE.
Para descompactarmos o arquivo vamos usar o ProcDump 1.20 da UCF, um excelente descompactador de PE's. Mas antes não se esqueca de tirar um Backup do executável, por exemplo ACPR.EXE para ACPR.BKP.

Então, vamos executar o  Procdump. Clica-se em Unpack, Seleciona-se a forma como o arquivo está compactado, que no nosso caso é o Wwpack32 I, caso você não soubesse qual era o compactador utilizado, poderia ter usado o Unknow, mas já que sabemos...

Temos que ser bem rápidos para ativar o Procdump, após o arquivo ACPR ser executado, para isto selecionamos o arquivos e rapidamente  pressionamos <ENTER>. Ele vai efetuar um TRACE na memória, e vai perguntar qual é o nome do arquivo com o qual queremos gravar o arquivo descompactado, podemos escolher ACPR.EXE mesmo, já que espero que vocês tenham tirado um Backup antes.

Ok. Agora temos o arquivo descompactado, podemos disassemblá-lo com o WDASM 8.93.

- Disassemblamos o arquivo via WDASM 8.93

- Vamos em Refs -> String Data Reference

- Procuramos por novamente por The code you've entered is invalid!. Duplo clique nele. Vai aparecer o seguinte:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402B0A(C)
|
:00402B2C 6A30                    push 00000030

* Possible StringData Ref from Data Obj ->"Registration"
                                  |
:00402B2E 6823E94000        push 0040E923

* Possible StringData Ref from Data Obj ->"The code you've entered is invalid!"
                                  |
:00402B33 68FFE84000              push 0040E8FF

Com isso vemos que a rotina 00402B0A, é uma chamada condicional, vejamos então esta rotina:

:00402B02 E871FCFFFF     call 00402778  <-- Testa o # de registro
:00402B07 59                       pop ecx
:00402B08 85C0                  test eax, eax   <--- Está Ok ?
:00402B0A 7420                  je 00402B2C  <--- Se EAX = 0, código inválido
:00402B0C 54                      push esp        <--- Caso contrário código Ok.

Opa! Então a rotina deve retornar sempre com EAX diferente de Zero, para o código estar Ok. Vamos lá para a rotina 402778 para forçá-la a retornar sempre como EAX=1 (Que é diferente de Zero!!!!)

* Referenced by a CALL at Addresses:
|:0040282B   , :00402966   , :00402B02   <--- Outras partes do programa devem checar se o registro está Ok. Por isso vamos forçar EAX=1
:00402778 55                      push ebp
:00402779 8BEC                mov ebp, esp
:0040277B 83C498            add esp, FFFFFF98
:0040277E 53                     push ebx
........
:004027FA 85C0                test eax, eax
:004027FC 7504                 jne 00402802

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004027F8(C)
|
:004027FE 33C0                    xor eax, eax  <--- Zera EAX. Código de registro Inválido
:00402800 EB17                    jmp 00402819

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004027FC(C)
|
:00402802 50                        push eax
:00402803 53                        push ebx
:00402804 E83FFFFFFF     call 00402748
:00402809 83C408               add esp, 00000008
:0040280C 85C0                  test eax, eax
:0040280E 7404                   je 00402814
:00402810 33C0                  xor eax, eax      <--- Zera EAX. Código de registro Inválido
:00402812 EB05                  jmp 00402819

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040280E(C)
|
:00402814 B801000000       mov eax, 00000001 <--- EAX = 1. Código Registro Ok.

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402800(U), :00402812(U)
|
:00402819 5E                      pop esi
:0040281A 5B                     pop ebx
:0040281B 8BE5                 mov esp, ebp
:0040281D 5D                     pop ebp
:0040281E C3                     ret               <--- Retorna ao Programa!!!!!!

Existem várias maneiras de efetuar um patch aqui.
Mas vou fazer o seguinte:
- Vamos tirar o XOR EAX,EAX por INC EAX, ou seja ao invés de zerar EAX, ele vai incrementar o EAX, ou seja vou GARANTIR que ele seja SEMPRE MAIOR que ZERO.

O Endereço do Offset do 1º. XOR EAX,EAX é 1DFE e do 2º é 1E10.

Agora a parte final:

Executamos o Hiew da seguinte forma: HIEW ACPR.EXE

- Pressiona-se F4 para disassemblá-lo

- Pressiona-se F5 e digita-se o endereço 1DFE.

- Pressionamos ENTER para editá-lo e o código XOR EAX,EAX (33 C0) vamos mudar para INC EAX (40). Mas como o INC EAX ocupa só um byte, vamos ter que preencher o 2º byte (C0) para (90) que é um NOP, ou seja não faça nada.

- Fazemos o mesmo para o endereço 1E10.

- Gravamos as alterações com F9.

Pronto! O seu  Advanced Access Password Recovery 1.1 está registrado!


CONCLUSÃO

    Este é mais um tutorial simples, usando o WDASM, só que aprendemos também como descompactar arquivos compactados com o WWPACK. Se fosse outro compactador também não teria problemas... Bastaria usar o ProcDump com a opção Unknow.