Domanda:
Dove e come viene utilizzato l'offuscamento dell'entanglement variabile?
perror
2013-07-16 16:50:19 UTC
view on stackexchange narkive permalink

Non conosco il nome esatto di questo offuscamento, quindi per ora lo chiamo entanglement variabile .

Ho già visto questo principio in alcuni binari ma non l'ho mai trovato una descrizione completa di cosa era possibile e cosa no.

L'idea è di confondere l'invertitore mescolando due valori insieme ed eseguendo le operazioni sui valori misti. Una volta eseguite tutte le operazioni, è possibile ricomporre i risultati con alcune semplici operazioni. Ad esempio, un esempio ingenuo potrebbe essere:

  int foo (int a, int b) {long long x = 0; // Entanglement iniziale x = (a << 32) | b; // Esecuzione di operazioni su entrambe le variabili x + = (12 << 32) & 72; ... // Desentanglement finale a = (int) (x >> 32); b = (int) (((int) -1) & x);} 

Ovviamente, qui mescoliamo tutto in una variabile (e non mi sono preso cura di dettagli come gli overflow). Ma puoi immaginare un entanglement iniziale molto più complesso in cui dividi tutto in due variabili (o più), ad esempio xorizzandole insieme.

Operazioni come addizione, moltiplicazione, ... devono essere ridefinite per questo nuovo formato, in modo che possa fuorviare chi ha invertito.

La mia domanda ora, qualcuno sa di diversi schema di entanglement variabile (quello che ho dato è davvero basilare)? E, forse, può fornire suggerimenti o pubblicazioni a riguardo?

Questa è la fonte effettiva o è qualcosa che un decompilatore ha sputato (o che hai creato in base al disassemblaggio)?
X non è inizializzato. Non dovrebbe essere | b invece di & b? Inoltre, long non è necessariamente il doppio della dimensione di int. Perché non pubblicare un esempio funzionante? Ciò potrebbe rendere più facile dare una risposta significativa alla tua domanda.
In effetti, questa è pura * spazzatura *. È qui solo per illustrare l'idea. Non verrà nemmeno compilato. Ho alcuni esempi in assembly (x86 + SSE), ma non sono realmente espliciti e facili da capire.
@newgre: Grazie per aver notato tutti questi errori (mi dispiace non aver risolto questo problema all'inizio, ero impegnato a fare qualcos'altro ...).
Non conosco pubblicazioni che esplorano questa tecnica in modo specifico, ma JBCO ne fa una forma debole (http://www.sable.mcgill.ca/publications/papers/2007-1/batchelder-cc2007.pdf).
Una risposta:
debray
2013-07-17 20:08:37 UTC
view on stackexchange narkive permalink

Non sono sicuro che sia sulla falsariga che stai cercando (e molto probabilmente hai già capito tutto questo e altro), ma ecco una grossolana formalizzazione e poi alcune riflessioni sull'implementazione. Concettualmente, questo cerca di separare ciò che significa intrecciare diversi valori dal modo in cui i valori intrecciati sono rappresentati .

Formalizzazione

Concettualmente, i valori intrecciati possono essere pensati come aggregati in cui i diversi componenti mantengono i propri valori, non interferiscono tra loro e possono essere estratti in modo indipendente. Un modo conveniente per pensare a tali aggregati è come n -tuple di valori; per semplicità presumo n = 2 qui. Inoltre, presumo che abbiamo operazioni per costruire tuple da una raccolta di valori e per estrarre i valori dei componenti da una tupla.

Ora dobbiamo essere in grado di eseguire operazioni sulle tuple. per ogni operazione op nel programma originale ora abbiamo 2 versioni: op1 , che opera sul primo componente di una 2-tupla, e op2 , che opera sul secondo componente:

<a1, b1> op1 <a2, b2> = if (b1 == b2) then < (a1 op a2), b1> else undefined
<a1, b1> op2 <a2, b2> = if (a1 == a2) then <a1, (b1 op b2) > br>

Infine (ed è qui che entra in gioco l'offuscamento), abbiamo bisogno di un modo per codificare le tuple come valori e decodificare i valori in tuple. Se l'insieme di valori è S, allora abbiamo bisogno di due funzioni enc e dec che devono essere inverse l'una dell'altra:

enc : S x S -> S (codifica coppie di valori come un singolo valore entangled)
dec : S -> S x S (decodifica un valore entangled nei suoi componenti)

enc ( dec (x)) = x per tutte le x
dec ( enc (x)) = x per tutte le x

Esempi:

  • enc prende una coppia di valori a 16 bit e li incorpora in un valore a 32 bit w in modo tale che x occupi i 16 bit bassi di w e y occupi i 16 bit alti di w; dec prende un valore a 32 bit e li decodifica in una coppia dove x è i 16 bit bassi ey i 16 bit alti.

  • enc prende una coppia <x, y> di valori a 16 bit e li incorpora in una parola a 32 bit w in modo tale che x occupi le posizioni dei bit pari di w e y occupi le posizioni dei bit dispari di w (cioè, i loro bit sono interlacciati); dec prende un valore w a 32 bit e li decodifica in una coppia <x, y> in modo tale che x sia costituito dai bit pari di w e y sia costituito dai bit dispari di w.

Considerazioni sull'implementazione

Dal punto di vista dell'implementazione, vorremmo essere in grado di eseguire operazioni direttamente su rappresentazioni codificate di valori. Per questo, corrispondenti a ciascuna delle operazioni op1 e op2 sopra, dobbiamo definire le versioni "codificate" op1 * e op2 * che deve soddisfare il seguente criterio di solidità:

per tutti x1, x2 e y: x1 op1 * x2 = y IFF enc ( dec (x1) op1 dec (x2)) = y

e allo stesso modo per op2*.

Molti dettagli vengono omessi (per lo più abbastanza facili da elaborare), e questo approccio di base potrebbe essere migliorato in vari modi, ma non lo faccio sapere se questo è sulla falsariga che stavi chiedendo e anche se forse è abbastanza semplice e hai già risolto tutto da solo. Comunque, spero che questo sia utile.


Dal commento di @ perror (sotto) sembra chiaro che la formalizzazione sopra non è abbastanza potente da catturare l'offuscamento che ha in mente (anche se potrebbe essere possibile ottenere un po 'di distanza dalla generalizzazione delle funzioni di codifica / decodifica enc e dec”).

Mi ero dimenticato di questo articolo, che discute di una trasformazione che sembra rilevante (vedi Sezione 6.1, "Variabili divise"): / p>

Christian Collberg, Clark Thomborson e Douglas Low. Rompere le astrazioni e non strutturare le strutture dati. IEEE International Conference on Computer Languages ​​ (ICCL'98), maggio 1998. ( link)

Penso che tu abbia perfettamente definito gli operatori di base e formalizzato il contesto di esso. Ma l'esempio che ho fornito era probabilmente troppo ingenuo e, quindi, un po 'fuorviante. Per dare forse un esempio migliore, cosa succede se hai `x = a ^ b` e` y = a ^ (~ b) `e provi ad applicare alcune operazioni su` a` e `b` tramite operazioni su` x` e "y". In questo schema, la parola * entanglement * è un po 'più ovvia immagino. Proverò a scavare un po 'questo schema e proporrò un esempio completo. Infine, è totalmente estraneo ma sei Saumya Debray? (Ho letto molti dei suoi articoli e sono un grande fan! :))
Penso di capire un po 'meglio le sottigliezze dell'offuscamento ora - grazie! Dovrò pensarci ancora un po '. (In una nota non correlata, il mio nome è davvero Saumya. :-)
@perror: la formalizzazione che ho dato non sembra abbastanza potente da catturare ciò che hai in mente. Ma nel frattempo mi sono ricordato di un articolo di Collberg et al. che descrive una trasformazione che potrebbe essere rilevante: vedere la risposta modificata sopra.
Sì, questo è esattamente quello che stavo cercando! Grazie ! Quindi, si chiama "* variabili divise *".


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...