[Python] SignedImporter [was: Criptazione dei file sorgenti per evitare la manomissione]

lex mlist lexmlist a gmail.com
Mer 17 Nov 2010 17:57:59 CET


Il giorno 17 novembre 2010 13:43, Manlio Perillo
<manlio.perillo a gmail.com>ha scritto:

> Il problema è che stiamo parlando di un programma probabilmente
> acquistato da un utente e che molto probabilmente gira sul suo computer.
>
> Se l'utente vuole fare danni, saranno anche problemi suoi, no? :)
>
Ahahah, si probabilmente hai perfettamente ragione :D
In effetti in certi casi converrebbe lasciar perdere e permettere di far
fare all'utente ciò che vuole.


> Ed in questo caso secimport non va bene; i moduli dovrebbero essere
> criptati.
>

Ed anche questa sarebbe una bella soluzione, magari implementando una
modifica a CPython che permetta facilmente di aggiungere moduli che ne
modificano il comportamento di import. Ma questa è una cosa che si può fare
in seguito, e il code obfuscation (a mo' di PHP) non la trovo affatto una
soluzione, oltre che una cosa davvero 'anti-pythonic', e poi sinceramente
non sò se sia possibile fare del code obfuscation con python, perchè il
massimo che si potrebbe fare è cambiare i nomi delle variabili, ma non (per
esempio) splittarlo tutto su una riga (mi sembra di aver visto ';' ma
sinceramente non sò quanto permetta). :E


> Questo potrebbe essere un buon motivo; e per risolvere questo problema
> non è nemmeno essere paranoici per la sicurezza.
>
Beh allora la cosa inizia a prendere senso, curiosità a parte :)

Potrebbe essere questo il problema.
> In questo caso devi inizializzare tu hashlib (ma possono succedere
> casini se poi il runtime di Python la reinizializza in seguito).
>

> > Per provare ho lasciato passare l'errore, la soluzione definitiva
> > sarebbe o fare il modulo in C (come lo è zipimport)
>
> Ma dovrai comunque inizializzare il modulo.
> Vedi ad esempio l'API C di cStringIO.
>
> Per hashlib il modulo da inizializzare è _hashlib (Modules/_hashlib.c);
> se questo modulo non può essere importato, allora vengono usati i vari
> moduli _md5, _sha e così via.
>
> Mi strano comunque che ti dia l'errore su _md5, dato che secimport di
> default usa sha1.
>
>
A me sembra strano che in fase di compilazione tenti già di eseguire i
moduli, mi sarei aspettato un simile comportamento solo in fase di
inizializzazione dell'interprete, non in fase di compilazione :3

In che modo potrei inizializzare il modulo '.c' se non è stato compilato?

Riguardo l'algoritmo infatti suona strano anche a me, ma stando all'errore è
riferito proprio al file 'hashlib.py' (nei sorgenti sotto la cartella Lib)
e la funzione incriminata che non trova il modulo _md5 è:
__get_builtin_constructor(name) (se non ricordo male, vado a memoria adesso
che non posso avviare la compilazione), e come dici tu, in caso non trova
_hashlib importa gli altri singolarmente.


> > [...]
>
> > PS. a questo punto, se dovesse rendersi necessario il fare troppe
> > modifiche all'interprete per via di vari problemi nei moduli, si
> > potrebbe pensare ad includere un nuovo file .c all'interprete
>
> Oppure al tuo programma che wrappa l'interprete.
>
Anche, si però assieme al programma comunque bisogna distribuire la copia
dei sorgenti in Python (per la compilazione, o comunque farla recuperare),
perchè deve modificare il comportamento standard di Python.

>
> > e rendere
> > il controllo parte integrante dell'interprete stesso, ovviamente se
> > dovesse essere necessario farlo su *tutti* i moduli, permettendo però,
> > di inserire in qualche modo il dizionario con le chiavi.
>
> Vedi lo script build_signature_database.py.
> Lo si può modificare per fargli generare codice C che definisca il
> dizionario.
>
> Prima di fare questo, però hai bisogno di una instanza di CPython
> "pulita" per creare il dizionario.
>

Ottima idea quella dello script. La necessità di avere una copia "pulita" di
CPython non penso sia uno svantaggio, proprio perchè almeno ciò che deve
fare lo sviluppatore (generare il dizionario) in questo modo lo può fare in
Python.
E poi, tolto Windows, sia Linux, che BSD che Mac OS X (non mi ricordo di
preciso su quest'ultimo, perchè gli ho subito installato XCode e dipendenze
varie) hanno Python di default.


> Ciao   Manlio
>
A scanso di equivoci, ho scritto dall'ufficio, accanto ad una segretaria un
"poco" chiacchierona, quindi potrei non aver rappresentato correttamente i
miei pensieri e/o potrei essere stato deviato dal discorso originario con
qualche affare di tipo burocratico/economico :E

Ciao e buona serata.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20101117/400a460a/attachment.htm 


Maggiori informazioni sulla lista Python