Raspberry Pi – Aplikacja z mechanizmem zabezpieczenia przed kopiowaniem na inne urządzenia

Kilka lat temu napisałem prostą aplikację w języku C, która miała być wykonywana na jednym urządzeniu. Aplikacja miała służyć do uruchamiania wyświetlania pliku AVI przez odtwarzacz Totem. Do kodu jako ciekawostkę dodałem funkcję która zawierała unikalny numer procesora ARM w celu zablokowania przed możliwością uruchomienia na innym urządzeniu. Zabezpieczenie jest bardzo skuteczne, ponieważ każdy procesor ARM wykorzystywany przez Raspberry Pi ma unikalny numer seryjny. Poniżej dla zainteresowanych zamieszczam kod aplikacji w języku C

#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <stdio.h>
#include <termios.h>
#include <term.h>
#include <curses.h>
#include <unistd.h>
 
/* dane do zabezpieczenia na WZORZEC :-)
 
cat /proc/cpuinfo (w raspberry pi)
 
Serial : 000000000000000d //ZABEZPIECZENIE UNIKALNY SERIAL NUMBER PROCESORA TYPU ARM
 
cat /var/log/dmesg 
 
microcode: CPU0 sig=0x206a7, pf=0x1, revision=0x0
  
*/
 
using namespace std;
 
char *WZORZEC = "WYBRANY_CIAG_Z_PROC_CPUINFO_LUB_Z_VAR_DMESG";
char *WZORZEC2 = "WYBRANY_CIAG_Z_PROC_CPUINFO_LUB_Z_VAR_DMESG";
  
long int POZYCJA = 1;
   
void Przesun_o_1(char *s)
{
    char *pom = s;
  
    while ((*pom ++ = *(s + 1)) != '')
        s ++;
    POZYCJA ++;
}
 
 
 int cpuinfo(void){
    char wz[sizeof WZORZEC + 1];
    int a, c;
    FILE *fp = fopen("/proc/cpuinfo", "r");
  
    if (fp == NULL){
         
    }
    for (a = 0; a <= strlen(WZORZEC); a ++){
        c = getc(fp);
        if (c == EOF && a < strlen(WZORZEC))
        {
             
            fclose(fp);
            return (0);
        }
        wz[a] = c;
        wz[a + 1] = '';
    }
        int x1 = 0;
    do
    {
        if (!strcmp(wz, WZORZEC))
        {
             
                        x1 = 1;
        }
        else
        {
            Przesun_o_1(wz);
        }
    } while ((wz[strlen(WZORZEC) - 1] = getc(fp)) != EOF);
  
    if (fp) fclose(fp);
        if (x1 == 1){
            
            return(1);
        }
        if (x1 == 0){
            return (0);
        }
}
 
  int cpuinfo2(void){
    char wz[sizeof WZORZEC2 + 1];
    int a, c;
        
//W RAZIE POTRZEBY ZMIANA NA PLIK /var/log/dmesg
    FILE *fp = fopen("/proc/cpuinfo", "r");
  
    if (fp == NULL){
 
    }
    for (a = 0; a <= strlen(WZORZEC2); a ++){
        c = getc(fp);
        if (c == EOF && a < strlen(WZORZEC2))
        {
             
            fclose(fp);
            return (0);
        }
        wz[a] = c;
        wz[a + 1] = '';
    }
        int x1 = 0;
    do
    {
        if (!strcmp(wz, WZORZEC2))
        {
                        x1 = 1;
        }
        else
        {
            Przesun_o_1(wz);
        }
    } while ((wz[strlen(WZORZEC2) - 1] = getc(fp)) != EOF);
  
    if (fp) fclose(fp);
        if (x1 == 1){
            
            return(1);
        }
        if (x1 == 0){
            return (0);
        }
}
  
 
  
int main(int argc, char** argv) {
   int status = cpuinfo();
   int status2 = cpuinfo2();
   if ((status == 1) && (status2 == 1)){
          execl ("/bin/sh", "sh", "-c","totem /FILMY/film.avi","");
    }else{
       printf("Houston mamy problem :-) ...");
       return 0;
    }
}

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *