venerdì 19 febbraio 2016

Estrarre i PDF da MEbook (attraverso iflipit)

A differenza degli altri lettori web di documenti digitali che ho avuto modo di testare, MEBook presenta un DRM un po’ più sofisticato, introducendo una semplice cifratura “a sostituzione”.
Ecco come appare l’interfaccia dell’applicazione:


Ho subito proceduto con l’analisi del traffico, arrivando ben presto ad intercettare una richiesta particolarmente interessante. L’ho subito “riprodotta” utilizzando il plugin Live HTTP Headers, ottenendo questo strano risultato:





A colpo d’occhio è possibile stabilire con una certa sicurezza che si tratta del contenuto di un’immagine, passato come secondo argomento alla funzione viewer.imgl. Purtroppo, già dall’header si può notare che alcuni byte risultano manomessi, come, per fare un esempio, quel segmento “JBIF” dovrebbe essere “JFIF”.

Così prima di poter procedere con un minimo di reverse engineering ho dovuto cercare il sorgente della funzione, che non tardò ad arrivare, parzialmente offuscato:


Tralasciando le parti che non ci interessano, partendo dalla funzione _imgl, il contenuto dell’immagine “criptata” viene passato alla funzione d_i che, servendosi della funzione d_s, esegue delle semplici operazioni di sostituzione di caratteri nell’header dell’immagine e infine, tornando alla funzione principale, il risultato viene convertito in base64 e copiato nel parametro “src” di un tag <img> che ne consentirà la visualizzazione. Ho provveduto subito a sistemare e tradurre il codice in Python, così da poterlo utilizzare successivamente per scaricare e decriptare automaticamente le pagine e unirle in un unico file PDF. Questo è il risultato:
def decrypt(data,page):
    data=data.replace('viewer._imgl('+str(page)+',"','')
    data=data.replace('");\nviewer._imgl('+str(page)+');','')
    data=data.decode('string_escape')
    m="fb69218f41737d7da84b1e39a949dbc2"
    arr=list(data)
    for j in range(3):
        for i in range(95,-1,-1):
            newpos=ord(m[i % 32]) % 96
            f=arr[i]
            s=arr[newpos]
            arr[i]=s
            arr[newpos] = f
    data=''.join(arr)
    return data
In conclusione, ho inserito la funzione in uno script che rende più semplice l’estrazione dei vostri libri acquistati su MondadoriEducation; lo potete trovare qui, insieme ad un video dimostrativo che illustra brevemente il procedimento:

Nessun commento:

Posta un commento