Página 1 de 1

CRC32 - tecnica de protecao do executavel

Enviado: 04 Set 2021 07:15
por mauricioportela
Compartilhando ideia...

Código: Selecionar todos

// -----------------------------------------------------------------------------
// Tecnica anti-fraude com CRC32
// licenca.c
// Mauricio P Pires <mauricioppires at gmail dot com>
// Projeto: adaptacao para registrar usuario e licença, 
//          calcular tamanho da funcao licenca*.
//
// * Pode ser usado para calcular tudo - basta adaptar!
// 
// Fonte: Mente Binaria / Papo Binário - Checagem de CRC - Como funciona?
// https://www.youtube.com/watch?v=X0kG4OZOihc&t=207s&ab_channel=PapoBin%C3%A1rio
// -----------------------------------------------------------------------------

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>

#ifndef __CRC32_H__
    #define __CRC32_H__
    typedef unsigned int u_int32_t;
    u_int32_t crc32(unsigned char *block, unsigned int length);
#endif

int initialized = 0;
u_int32_t crc_tab[256];

void chksum_crc32gentab();
u_int32_t chksum_crc32 (unsigned char *block, unsigned int length);
u_int32_t crc32(unsigned char *block, unsigned int length);
bool licenca(char *nome, int serial);

int main(void) {
    char nome[50];
    int serial;
    uint32_t crc = crc32((unsigned char *)licenca, 63);

    // Tamanho da funcao licenca... (tmp)
    // printf("%#x\n", crc32((unsigned char *)licenca, 63));

    printf("Nome: ");
    scanf("%s", nome); // PortelaInfo
    printf("Serial: ");
    scanf("%d", &serial); // 1123
    if (licenca(nome, serial) && crc == 0x17e6a2cd)
        printf("[ok]\n");
    else
        printf("[error]\n");
    return 0;
}

// -----------------------------------------------------------------------------
// bool licenca(char *nome, int serial) {
//     int serial_correto = 0;
//     while (*nome)
//         serial_correto += *nome++;
//     printf("%d",serial_correto); // <---------------- Mostra o valor calculado do nome de usuario... (tmp)
//     return (serial == serial_correto);
// }
// -----------------------------------------------------------------------------

bool licenca(char *nome, int serial) {
    int serial_correto = 0;
    while (*nome)
        serial_correto += *nome++;
    return (serial == serial_correto);
}

void chksum_crc32gentab () {
    unsigned long crc, poly;
    int i, j;
    poly = 0xEDB88320L;
    for (i = 0; i < 256; i++) {
        crc = i;
        for (j = 8; j > 0; j--) {
            if (crc & 1) {
                crc = (crc >> 1) ^ poly;
            } else {
                crc >>= 1;
            }
        }
        crc_tab[i] = crc;
    }
}

u_int32_t chksum_crc32 (unsigned char *block, unsigned int length) {
    register unsigned long crc;
    unsigned long i;
    crc = 0xFFFFFFFF;
    for (i = 0; i < length; i++) {
        crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF];
    }
    return (crc ^ 0xFFFFFFFF);
}

u_int32_t crc32(unsigned char *block, unsigned int length) {
    if(!initialized) {
        chksum_crc32gentab();
        initialized = 1;
    }
    return chksum_crc32(block, length);
}
// -----------------------------------------------------------------------------
// eof
// -----------------------------------------------------------------------------
Att.

Mauricio P Pires

CRC32 - tecnica de protecao do executavel

Enviado: 04 Set 2021 07:36
por mauricioportela
Para compilar:

gcc licenca.c -olicenca

Ver imagem anexa.

CRC32 - tecnica de protecao do executavel

Enviado: 04 Set 2021 10:19
por carlos_dornelas
Bom dia Mauricio,

Acho que não entendi bem o funcionamento da técnica: como ela faz a proteção? evita cópia pirata do .exe?

[]s

Antonio Carlos

CRC32 - tecnica de protecao do executavel

Enviado: 04 Set 2021 12:21
por mauricioportela
Bom dia Carlos!

Ele protege a alteracao do binario. A ideia é proteger uma determinada area do binário. Nesse caso a protecao esta na funcao licenca (literalmente).

Código: Selecionar todos

// da contagem inicial
bool licenca(char *nome, int serial) {
    int serial_correto = 0;
    while (*nome)
        serial_correto += *nome++;
    return (serial == serial_correto);
}
// ate aqui.
0x17e6a2cd eh o tamanho em hexadecimal da funcao acima.

sabe aqueles caras que utilizam editores hex para alterar o comportamento de um binario?!? :D

Pois é! Se ele alterar o binario - ou ate mesmo o codigo antes da compilacao. o sistema vai falhar durante a comparacao usuario/numero E tamanho da funcao.

Código: Selecionar todos

    // aqui - vai ser testado o nome, comparando com o valor correspondente 
    // e o tamanho (previamente calculado) da funcao 
    // * (pode ser qualquer local do codigo - nesse caso, foi usando a funcao licenca por causa da operacao.
    if (licenca(nome, serial) && crc == 0x17e6a2cd) // esse eh o tam da funcao (em hexadecimal)
        printf("[ok]\n");
    else
        printf("[error]\n");
Tem um link no inicio do codigo. dah uma olhadinha! talvez o fernando explique melhor! ;)