CRC32 - tecnica de protecao do executavel
Enviado: 04 Set 2021 07:15
Compartilhando ideia...
Att.
Mauricio P Pires
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
// -----------------------------------------------------------------------------
Mauricio P Pires