Serial Fishing

Estava procurando rever algumas coisas de engenharia reversa e fui ‘brincar’ com serial Fishing. Serial fishing é possível quando a aplicação, ao tentar verificar se o serial digitado foi fornecido corretamente, gera o serial original para fazer uma comparação. Vamos ver como podemos tirar proveito disto.

Como o serial gerado pela aplicação esta residente na memória, basta abrir o processo e pegar ele bonitinho na memória. A parte mais emocionante é encontrar o serial na memória (isto se ele estiver lá). Para fins de uso pessoal estudo, achando tendo o serial na memória já basta, porém como bons nerds atoas que somos, nós escrevemos um código que pegue e exiba o serial na tela.

O programa que estava testar é o jogo Xadrez Master na versão 5.8.6.0, ao abri-lo no OllyDbg e digitar qualquer nome e serial, é exibida uma mensagem informando que o serial está inválida. Sem fechar a janela, voltei para o Olly, dei pause no processo e então pude analisar o seguinte na memória:

CPU Dump:
0012EA48  |00F2F1A8  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA4C  |00F36868  ASCII "XAD-BXLT4-TLKXJ"
0012EA50  |00F1C8A4  ASCII "XAD"
0012EA54  |00F2F18C  ASCII "AABBCCDDEEFF"
0012EA58  |00EDCB64  ASCII "AAB"
0012EA5C  |00F1CEAC  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA60  |00F2F170  ASCII "XAD-BXLT4-TLKXJ"
0012EA64  |00F1CE90  ASCII "AABBCCDDEEFF"
0012EA68  |00ED1D64  ASCII "AABBCCDDEEFF"
0012EA6C  |00ED1D80  ASCII "AABBCCDDEEFF"
0012EA70  |00F1CE74  ASCII "AABBCCDDEEFF"
0012EA74  |00ED1D0C  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA78  |00ED1D38  ASCII "Maycon Maia Vitali (0ut0fBound)"

Estes dados foram obtidos da pilha, e podemos notar o serial XAD-BXLT4-TLKXJ para o nome “Maycon Maia Vitali (0ut0fBound)” em diversos endereços diferentes. Vamos pegar só um exemplo:

0012EA48  |00F2F1A8  ASCII "Maycon Maia Vitali (0ut0fBound)"
0012EA4C  |00F36868  ASCII "XAD-BXLT4-TLKXJ"

Neste caso, nos endereços 0012EA48 e 0012EA4C temos respectivamente os endereços de memória onde estão o nome e serial válidos. Portanto nosso “Serial Fisher” deve obter antes os endereços das strings na memória para depois le-las em sí.

Sem muitas firulas, segue um código-rápido que fiz para fazer Serial Fishing desse software. Lembrando que é necessário digitar um serial qualquer e pressionar o botão de registrar e, sem fechar a caixa da mensagem informando serial inválido, rodar o fisher(pescador):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
 * Serial fisher para RKSoft Xadrez Master 5.8.6.0
 * Por Maycon M. Vitali (0ut0fBound)
 *
 * ATENÇÃO: Este código foi criado para fins de estudo, caso deseje
 * obter o software é necessário que se page a licensa estipulada
 * pelo fabricante.
 */
 
#include <stdio.h>
#include <string.h>
#include <windows.h>
 
#define NAME_PTR_ADDR   0x0012EA48
#define SERIAL_PTR_ADDR 0x0012EA4C
 
#define TITULO_JANELA "Xadrez Master"
 
#define MAX_SIZE 100
 
int main()
{
    HWND cmeHandle;                // Handle da janela do processo
    DWORD cmePid;                  // PID do processo crackme
    HANDLE cmdProcHandle;          // Handle do processo ( depois de aberto )
 
    long lngAddrNome, lngAddrSerial;
    char strNome[MAX_SIZE], strSerial[MAX_SIZE];
 
    char strMensagem[MAX_SIZE*2 + 20];
 
    // Procuramos pela janela do crackme
    if (!(cmeHandle = FindWindow(0, TITULO_JANELA)))
    {
        MessageBoxA(
            0,
            "Execute o xadrez.exe e tente registrar com qualquer serial antes.",
            "Serial Fishing",
            0
        );
        exit(-1);
    }
 
    // Pega e abre processo
    GetWindowThreadProcessId(cmeHandle, &cmePid);
    cmdProcHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, cmePid);
 
    // Obtém os endereços das informações na pilha
    ReadProcessMemory(cmdProcHandle, (void *)NAME_PTR_ADDR, &lngAddrNome, sizeof(lngAddrNome), NULL);
    ReadProcessMemory(cmdProcHandle, (void *)SERIAL_PTR_ADDR, &lngAddrSerial, sizeof(lngAddrSerial), NULL);
 
    // Pega os valores nos endereços obtidos
    ReadProcessMemory(cmdProcHandle, (const void *)lngAddrNome, strNome, sizeof(strNome) - 1, NULL);
    ReadProcessMemory(cmdProcHandle, (const void *)lngAddrSerial, strSerial, sizeof(strSerial) - 1, NULL);
 
    snprintf (strMensagem, sizeof(strMensagem) - 1, "Nome: %s\nSerial: %s", strNome, strSerial);
 
    MessageBoxA(0, strMensagem, "Enjoy!", 0);
 
    printf ("Nome ...: %s\n", strNome);
    printf ("Serial .: %s\n", strSerial);
 
    return 0;
}

Como dito no comentário, não forneci esse código com fins de prejudicar a equipe que desenvolve a ferramenta. Tentarei futuramente disponibilizar análise de malwares e afins para não ter problemas futuros.

Categories: Análise de Binário, Segurança Tags:
  1. 3, março, 2009 em 21:59 | #1

    Doidera vew.. vc ta sacando pra caramba em programação!

  2. Otávio Augusto
    3, março, 2009 em 22:20 | #2

    Huuum, como sempre o Maycon vem com algo divertido e extremamente interessante =]

    Mais que justifica os 50 minutos de espera para falar com ele no msn.

    :P

  3. Otacon_x86
    4, março, 2009 em 18:14 | #3

    EEEEEEEEEEEEEEEEEITA rapa! :)
    Parabens mano! otimo RE! ;)
    Abraços

  4. Felipe Nolasco
    4, março, 2009 em 18:33 | #4

    Ficar atoa dá nisso!

  5. 4, março, 2009 em 18:48 | #5

    C0000L

    Agora, diga a verdade, foi com o intuito de prejudicar sim!, pensa q eu nao sei q vc tem uma rinxa com o coder do xadrez master? ahaaaa xD

  6. 4, março, 2009 em 18:50 | #6

    @unkzo
    x)

  7. zer0_3uffer
    6, março, 2009 em 11:53 | #7

    Apesar da concordância do texto não estar boa e do fato dessa prática do xadrez master de comparação de serial ser completamente amadora, é um bom artigo.
    O código está muito bem escrito.

  8. k4m1k451
    10, março, 2009 em 10:00 | #8

    Show de bola!

    x)

  9. shinku
    22, julho, 2009 em 22:11 | #9

    Boa maycon

    Ando estudando um pouco RE, gostaria de saber mais sobre unpacking vme(themida e afins)

    v se aparece no irc heh

    t+

  10. P4R4N014 V1RTU4L
    15, outubro, 2009 em 01:08 | #10

    P4R4N014 V1RTU4L
    Autor: 557275627520476F7469636F00

    Meu barco tem vários navegadores
    E eu atrapalhado não sei qual acionar
    Enfeitado qual penteadeira de quenga
    O meu processador i7 hoje vou estrear

    O vento norte me traz boas lembranças
    Do meu saudoso e rodado Pentium 100
    Tinha o Netscape instalado no sistema
    Creative Labs 4x e Subwoofer também

    O pano de fundo era a Cindy Crawford
    Na proteção de tela o Johnny Castaway
    No zumbido da noite inocentes disputas
    Tantos Lammers e até Larvas derrubei

    A união das fronteiras distorceu os limites
    Papo entre aparelhos Bluetooth já é banal
    A ida do homem à lua, leigos dão palpites
    O assunto rola no Twitter, à moda digital

    Com pacotes de malicia e receitas de bolo
    Menino virar H4cK3r parece coisa normal
    Dispara seu torpedo farejador o tenro tolo
    Brincadeiras de Curumim que só fazem mal

    Na Backdoor, Rootkits e seus malwares
    O H4cK3r une-se a outros como em Tróia
    O mais besta dos maléficos sozinho voa
    E eu no divã, PHerdido nessa Paranóia.

  11. 28, novembro, 2009 em 09:50 | #11

    muito boa mas ja vi isso em algum lugar

  12. OutlanderBr
    18, maio, 2010 em 15:38 | #12

    bacana ja tinha esse tutorial no forum brcrackers!
    mota 10

  13. semnome
    29, fevereiro, 2012 em 22:08 | #13

    na boa …naum intendi nada….afinal qual eh o codigo?

  1. Nenhum trackback ainda.