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.