MySuperLabel – Software online per la creazione di etichette

Negozi al dettaglio, negozi all’ingrosso e commercianti online hanno bisogno di stampare etichette per i propri prodotti, per il proprio magazzino o per le proprie spedizioni. Parliamo di questo genere di etichette:

O più in generale etichette di qualsiasi forma e dimensione:

Esistono in commercio numerosi programmi più o meno adatti allo scopo ma hanno la svantaggio di dover essere installati su PC e di funzionare solo con stampanti speciali che vanno sia acquistate a parte sia ricaricate con particolari rotoli ricarica.

Molte aziende preferiscono quindi utilizzare i comuni fogli adesivi A4 per stampare le proprie etichette. I fogli adesivi sono molto pratici ed economici, e non richiedono nessuna attrezzatura particolare (solo la propria stampante da ufficio, laser o getto d’inchiostro) e permettono la creazione di molte etichette in quantità. I fogli adesivi si comprano in cartoleria o online ed esistono in una moltitudine di formati diversi, adatti a tutte le esigenze:

Il problema principale però è come creare queste etichette. Si può utilizzare Word o Excel, ma disegnare i codici a barre è complicato (servono font particolari), i margini delle etichette non risultano quasi mai esatti e soprattutto occorre inserire a mano tutti i campi delle etichette (nomi prodotto, descrizioni, prezzi, indirizzi, nomi etc…) o quantomeno fare copia-incolla dei dati da un foglio Excel preesistente.

MySuperLabel

MySuperLabel è un piccolo software online che ho deciso di realizzare per ovviare a questo problema. Il software si utilizza tramite un normale browser (Chrome, Safari e IE11+) e funziona in questo modo: si carica il foglio Excel che contiene i dati dei propri prodotti (può essere tranquillamente un listino prezzi o un database aziendale dei prodotti) e il software genererà automaticamente il PDF pronto per la stampa su etichette adesive. Il software permette di definire la posizione degli elementi nell’etichetta (nome prodotto, descrizione, codici a barre, prezzi etc..), i margini del foglio e di definire da quali colonne del file Excel prendere i dati. In questo modo non è necessario creare un foglio Excel apposito per generare le proprie etichette ma semplicemente si possono utilizzare i fogli Excel di listino o altri fogli Excel pre-esistenti; basta selezionare le colonne opportune dal quale il software preleverà i dati.

Per creare il PDF basta semplicemente caricare il foglio Excel in questa sezione di upload:

Dopo alcuni istanti verrà generato il file PDF pronto per la stampa. Basta quindi scaricare il PDF e stamparlo con la propria stampante:

Da notare che il PDF ha i tutti margini correttamente impostati a seconda del formato etichette con il quale vogliamo stampare. I margini vengono definiti in una apposita sezione del software. I codici a barre sono generati automaticamente dal codice prodotto (o da qualsiasi altro campo Excel si voglia). Scarica qui un PDF di esempio per vedere con mano il risultato.

Caratteristiche principali di MySuperLabel

Elenco qui alcune delle caratteristiche principali, maggiori informazioni si trovano sulla pagina principale del sito https://www.mysuperlabel.com

  • Possibilità di generare codici a barre automaticamente
  • Funziona con qualsiasi tipo di etichette A4 adesive
  • Sono supportati tutti i codici a barre più famosi (EAN13, CODE39, CODE128, Farmaceutici, etc…)
  • Immagini e loghi aziendali su etichetta, anche più di uno
  • E’ possibile generare fino a 1000 etichette alla volta
  • Nessun software da installare
  • Nessuna attrezzatura particolare richiesta
  • Funziona tramite un normale browser internet
  • E’ possibile creare le proprie etichette anche fuori dall’ufficio e portare il PDF alla stampante

Quali tipi di etichette è possibile creare?

Sostanzialmente qualsiasi etichetta per prezzare articoli da negozio oppure etichette per la logistica di magazzino. Ma anche etichette per spedizioni e semplici cartellini informativi da esposizione.

Campi dell’etichetta

L’etichetta viene costruita a partire dai “mattoni base” messi a disposizione dal software. Questi elementi base si dividono in elementi fissi oppure elementi variabili che prendono il proprio valore da una colonna del foglio Excel. Ecco l’elenco:

  • Testi fissi
  • Testi da Excel
  • Prezzi da Excel
  • Codici a barre fissi
  • Codici a barre da Excel
  • Semplici forme geometriche (linee e rettangoli)
  • Colore sfondo etichetta fisso
  • Colore sfondo etichetta da Excel (tramite codice colore numerico)
  • Immagini e loghi aziendali (a colori o bianco/nero)

Prezzi e versioni

La versione base è completamente gratuita, basta registrarsi con la propria email. Le versioni a pagamento permettono di accedere a tutte le funzionalità avanzate e di creare un numero illimitato di modelli etichetta.

Per qualsiasi altra informazioni contattatemi a info@mysuperlabel.com

 

 

Lettura e generazione fogli Excel/CSV con PHP

Molti dei progetti web/app ai quali ho lavorato e sto attualmente lavorando, richiedono l’upload di fogli Excel e CSV per l’immissione di grandi quantità di dati nel database. Altre volte invece è necessario generare dei report o degli export in formato Excel o CSV, come download o allegati ad email automatiche.

Una libreria che consiglio, estremamente semplice da utilizzare, è PHPSpreadSheet:

https://github.com/PHPOffice/PhpSpreadsheet

La libreria è scritta interamente in PHP, linguaggio che ormai è presente in praticamente tutti gli host web (ad esempio, se avete WordPress, avete sicuramente PHP). Se PHP non è presente è sempre possibile aggiungerlo come servizio extra.

Installazione

Installare la libreria è semplice, basta creare una cartella vuota nello spazio web e copiare il build dell’ultima release. Compilare la libreria richiede composer, ma è sempre possibile utilizzare questa comoda scorciatoia

Scaricato lo zip del build, estraetelo nella cartella vuota che avete creato e voilà, la libreria è “installata”.

Esempio: creazione di file xlsx

Vediamo un semplicissimo esempio che tocca tutte le funzionalità base della libreria. Immaginiamo di avere la libreria installata nella cartella “test”.

require 'test/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;


$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue("A1", "Ciao mondo!");
$writer = new Xlsx($spreadsheet);
$writer->save('prova.xlsx');

Questo semplice programma crea un nuovo file Excel (prova.xlxs) nella cartella corrente (sul server ovviamente) e inserisce la scritta “Ciao mondo!” nella cella A1 del foglio. Tutto qui. setCellValue() è sostanzialmente l’unica API da utilizzare per inserire valori nelle varie celle. Tramite appositi loop potrete ad esempio leggere una riga dal database e creare la riga corrispondente nel foglio Excel e cosi via a creare una tabella completa dei dati.

Se indirizzare le celle con i nomi classici “A1”, “A2”, “C3” etc.. risultasse scomodo, è sempre possible indicizzare tramite due indici numerici separati, uno per la riga e uno per la colonna:

setCellValueByColumnAndRow(1, 5,"Ciao Mondo!");

E’ possibile inoltre impostare font, carattere e allargare/restringere le celle a piacimento, la documentazione contiene tutti gli esempi necessari.

Esempio: lettura di un file xlsx caricato in upload

In questo caso vogliamo leggere un file Excel caricato dall’utente e riversare i dati nel database (o fare delle elaborazioni).

require 'test/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;


$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("prova.xlsx");

In questo caso leggiamo un file (prova.xlsx) già presente nella directory corrente. Il file può essere un upload utente oppure un file generato precedentemente, non ha importanza.

Per leggere una cella, utilizziamo la funzione getCellByColumnAndRow():

$sheet = $spreadsheet->getActiveSheet();
$value = $sheet->getCellByColumnAndRow(2, 3);

che restituisce il contenuto della cella B3. Gli indici partono da 1, quindi A1 è (1,1).

Download diretto del file Excel

Magari preferiamo far partire immediatamente il download nel browser dell’utente non appena la libreria ha creato il file Excel, senza passare da un file temporaneo memorizzato sul server. Molto semplicemente, possiamo impostare gli header PHP per il download e scrivere il foglio Excel nel file speciale php://output. Questo file è un’area di memoria piuttosto che un file vero e proprio: la libreria creerà il foglio Excel in memoria che poi verrà passato in download al browser dell’utente.

$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="prova.xlsx"');
header("Content-Transfer-Encoding: binary");
$writer = new Xlsx($spreadsheet);
$writer->save("php://output");
die();

Il nome del file in download è impostato nell’header content-dispositon filename (nome file: “prova.xlsx”).

Altre funzionalità

Quello che abbiamo visto è veramente il minimo sindacale per creare e leggere file Excel e CSV con PHP. La libreria mette a disposizione moltissime altre feature tra le quali:

  • il supporto per file Excel 2003, CSV, file spreadsheet Mac
  • accesso alle tab
  • calcolo e creazione formule

Per una lista completa delle funzionalità vi rimando alla documentazione e alla pagina ufficiale del progetto:

https://github.com/PHPOffice/PhpSpreadsheet
https://phpspreadsheet.readthedocs.io/en/develop/

Reverse engineering: sblocco di un software proprietario

Un piccolo esempio di reverse engineering e sblocco del software. Tecnica un po’ noob dato che non ho utilizzato alcun disassembler come IDA Pro o altri tool avanzati, ma pur sempre efficace.

Protezione software con licenza controllata da server remoto

Al fine di evitare copie non autorizzate, molti software implementano un meccanismo di protezione che richiede una specifica licenza installata sullo stesso PC dove girerà il programma. Il proprietario del software acquista la licenza d’uso e può così utilizzare il programma. Le copie del programma semplicemente non funzioneranno perchè sprovviste della relativa licenza. I meccanismi di protezione più sofisticati utilizzano un server remoto per controllare la validità della licenza ed è quindi fondamentale che questo server sia accessibile e sempre funzionante, ma non è sempre così.

Sono stato contattato da una persona che, pur avendo regolarmente acquistato la licenza, si è ritrovato con il software bloccato, proprio perchè il relativo server di licenza è stato messo offline.

In questi casi è perfettamente lecita la modifica del software per ripristinarne il funzionamento perchè la licenza d’uso è stata regolarmente acquistata ed è un diritto dell’utente continuare ad utilizzare il programma.

Il software in questione è FinalTable, programma per l’analisti statistiche delle partite a poker :

 

Provando ad avviare il programma si ottiene un errore di connessione con server remoto, la licenza non può essere verificata ed il programma rimane bloccato alla schermata inziale. Questo è quello che lamentava l’utente e mi ha quindi contattato per risolvere il problema.

Alcuni indizi

Nel manuale in pdf si specifica che la licenza viene verificata all’apertura del programma e, se valida, il bottone OK viene abilitato, permettendo l’accesso alla schermata principale. Probabilmente il codice di verifica della licenza, alla fine del processo, non fa altro che abilitare il bottone OK.

Ho notato inoltre che la finestra principale, il font caratteri e lo stesso bottone OK utilizzano lo stile di default in Windows. Probabilmente il programma è scritto in Visual Basic o che almeno utilizza le librerie native MFC. Se così fosse è possibile inviare comandi esterni agli elementi dell’interfaccia, ad esempio è possibile inviare il comando “enable” allo stesso bottone OK così come farebbe il programma stesso dopo la verifica della licenza.

Tentativi & proof of concept

Ho utilizzato il comodissimo tool WinHack (http://sandsprite.com/) per provare a giocare con la UI ed inviare alcuni comandi al bottone OK

 

 

Il tool permette di conoscere l’ID del bottone (ogni elemento grafico ha il suo ID) , in questo caso 131642.

 

 

A questo punto è possibile inviare messaggi al bottone. Noi siamo interessati al messaggio WM_ENABLE

 

 

Inviando il comando WM_ENABLE il bottone si abiliterà e potremo cliccarlo col mouse:

 

 

E potremo così accedere al programma vero e proprio bypassando completamente il controllo di licenza:

 

 

Implementazione del crack

Il più è fatto, abbiamo trovato un modo per aggirare il controllo di licenza ed entrare comunque nel programma. Adesso occorre scrivere un piccolo programma che automatizza gli step visti prima: cerca il bottone, recupera l’id, invia il comando WM_ENABLE al bottone e lo clicca (comando WM_CLICK).

Il lavoro perfetto per C++ e <windows.h>


#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <windows.h>
using namespace std;

HWND buttonHandle = 0;

BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM)
{
   char label[100];
   int size = GetWindowTextA(handle, label, sizeof(label));

   if (strcmp(label, "OK") == 0)
   {
      buttonHandle = handle;
      cout << handle << endl;

      EnableWindow( handle, TRUE );
      SendMessage(buttonHandle, BM_CLICK, 0, 0);
      exit(0);
      return false;
   }
   return true;
}

int main()
{
   HWND windowHandle = FindWindowA(NULL, "Final Table");
 
   if (windowHandle == NULL)
   {
      cout << "Final Table non trovato!" << endl;
   }

   else
   {
      cout << "Final Table trovato!" << endl;
      SetForegroundWindow(windowHandle);
      BOOL ret = EnumChildWindows(windowHandle, GetButtonHandle, 0);
   }
}

L’utilizzo è semplice: avviare FinalTable e attendere che venga mostrata la schermata principale con il bottone disabilitato (il controllo di licenza è ovviamente fallito). A questo punto basta lanciare il crack e si verrà portati automaticamente alla sezione principale come se la licenza fosse stata correttamente verificata.