Alla scoperta di lARP64Pro

  • View
    9

  • Download
    1

Embed Size (px)

DESCRIPTION

Autore : SmilingWolf[ITA] - Alla scoperta di lARP64Pro

Transcript

  • Alla scoperta di lARP64Pro

    Sommario Introduzione .............................................................................................................................................................1

    lARP64 Pro ................................................................................................................................................................1

    Tools .........................................................................................................................................................................1

    Codeflow Obfuscation ..............................................................................................................................................2

    TLS Callbacks .............................................................................................................................................................3

    CRC Checks & Code En/Decryption ..........................................................................................................................4

    Antis ..........................................................................................................................................................................5

    Anti-Attach Hooks.................................................................................................................................................5

    Misc Anti-Debug ...................................................................................................................................................6

    VMed Antidbg .......................................................................................................................................................8

    Anti-API hooking ...................................................................................................................................................9

    API Redirection ...................................................................................................................................................... 10

    Simple ................................................................................................................................................................ 10

    Advanced ........................................................................................................................................................... 10

    Misc tricks .............................................................................................................................................................. 11

    Stolen OEP ............................................................................................................................................................. 11

    Saluti e ringraziamenti ........................................................................................................................................... 12

  • 1

    Introduzione Ad alcuni reverser piace giocare insieme ai compagni a guardie e ladri, sfidandosi a colpi di unpackme e crackme. in questo contesto che nel 2008 lena151, che certo non ha bisogno di presentazioni, ha deciso di creare la sua creatura pi temuta: lARP64 Pro, un protector per programmi a 64bit rimasto imbattuto per pi di tre anni. Nel 2012 lena151, delusa dalla scarsa quantit di tentativi fatti per sbaragliare le protezioni implementate in lARP64, dichiar interrotto lo sviluppo del software per sempre perch "non c' mai stato un vero bisogno di mantenersi avanti rispetto alla community", aggiungendo inoltre di aver perso la fede nel reversing. Spero quindi, con questo paper, di mostrarle che la community tutt'altro che morta e che lo spirito del reversing vive anche nella nuova generazione, una generazione che lei stessa ha contribuito a fare crescere

    lARP64 Pro "Remark that lARP64Pro is not just like 'any' commercial product but it is merely a 64bit project to

    prove it is indeed possible to create uncrackable software. To that extent, we have sent lARP64Pro itself as well

    as a software protected by lARP64Pro to the cracking community in september of 2008, requesting to crack

    either. Till this day, the cracking community have not succeeded and our conviction is that lARP64Pro will

    remain uncracked at least for a significant time. The project has been made available for commercial purposes

    and a trial version is freely downloadable from this site, however this does not mean it is sold to everyone or for

    every purpose. Yet, contact us in case your x64 software really needs to be super-protected."

    Ecco la presentazione di lARP64 cos come la si poteva leggere sul sito ufficiale. Viene promesso un engine di

    protezione estremamente potente, forte del fatto che nessun dump funzionante del primo unpackme rilasciato

    e nessuna copia crackata di lARP64 stesso siano mai comparsi in rete.

    Ma esattamente, che protezioni sono state implementate? Con questa domanda in mente ho tracciato per due

    settimane il codice del protector e in questo documento voglio condividere con voi ci che ho scoperto.

    Tools x64_dbg (http://x64dbg.com/);

    Multiline Ultimate Assembler (plugin per x64_dbg, usato per assemblare alcuni snippet di codice ASM);

    ScyllaHide (plugin per x64_dbg, usato per patchare i byte BeingDebugged1 e NtGlobalFlag2 e la

    funzione NtQueryInformationProcess usata da CheckRemoteDebuggerPresent3);

    Scylla (https://forum.tuts4you.com/files/file/576-scylla-imports-reconstruction/).

    1 Peter Ferrie, The Ultimate Anti-Debugging Reference, pp. 83-84

    2 Peter Ferrie, The Ultimate Anti-Debugging Reference, pp. 5-8

    3 Peter Ferrie, The Ultimate Anti-Debugging Reference, pp. 62-63

  • 2

    Codeflow Obfuscation Aprendo l'unico unpackme a disposizione della community la prima cosa che si nota la quantit di

    codice incomprensibile che ci si trova davanti. Tuttavia, grazie ad un'analisi pi approfondita e con un po' di

    tracing si arriva facilmente ad una conclusione: il codice perfettamente lineare e la redirezione avviene per

    mezzo di CALL e JCC che fanno saltare in avanti di 1-4 byte l'esecuzione (saltando le istruzioni spazzatura),

    sufficienti a far perdere il controllo del programma al debugger la prima volta che un BP viene settato nel

    punto sbagliato4.

    Nell'immagine si pu vedere il codice prima della pulizia (tracciare all'interno delle prime CALL per capire di quanto spostino in avanti l'esecuzione e assegnare ad esse una label adeguata semplificher moltissimo il lavoro).

    Ed ecco che noppando i byte spazzatura il codice assume un senso.

    Altra caratteristica che concorre nel renderci il tracing difficile il modo in cui vengono effettuate le API calls:

    nella quasi totalit dei casi gli indirizzi delle API ritrovati con GetProcAddress sono stati diminuiti di 1 o 2.

    Quando servono vengono PUSHati e viene usato un JCC salterino per aggiustare l'indirizzo e finire sull'API

    desiderata.

    4 Da qui in avanti mi riferir a questi "redirector" come CALL o JCC salterini per il fatto che incrementano l'indirizzo

    presente in [RSP] mentre saltellano qua e la nel codice del protector.

  • 3

    TLS Callbacks Il primo codice eseguito dal debuggee consiste in 5 TLS Callbacks che si occupano di sistemare gli

    indirizzi delle varie CALL salterine al posto giusto e di determinare la presenza di un debugger.

    Ecco una breve descrizione di ognuna, nell'ordine di esecuzione:

    Procedura 1:

    Sistema gli indirizzi dei jump al posto giusto.

    Procedura 2:

    Calcola il checksum dei primi 270h bytes dall'EP.

    Il checksum calcolato in questo modo risulter ovviamente sballato nel caso in cui un debugger abbia messo un

    BP in quella posizione.

    Il risultato viene poi usato per decryptare dei dati.

  • 4

    Procedura 3:

    Preleva il byte BeingDebugged leggendolo dal Process Environment Block (PEB) passando dal Thread

    Environment Block (TEB).

    Procedura 4:

    Preleva il byte BeingDebugged leggendolo dal PEB. Da notare che l'indirizzo al quale viene aggiunto RAX lo

    stesso che viene messo in RDI durante la procedura 2.

    Procedura 5

    Preleva la NtGlobalFlag leggendola dal PEB passando dal TEB.

    CRC Checks & Code En/Decryption Il codice viene controllato abbastanza frequentemente per mezzo di chiamate a procedure che

    calcolano il CRC di porzioni fisse o di indirizzo e dimensioni arbitrarie di codice. Quasi mai, per, il risultato del

    calcolo del checksum viene verificato in maniera diretta. Molto pi spesso viene semplicemente messo da

    parte e controllato pi tardi o, peggio, usato come chiave per decryptare altre porzioni di codice. In caso di

    check o decryptazioni fallite le conseguenze possono essere varie, ma in ogni caso ci obbligheranno a riavviare

    il debuggee.

    Il controllo non avviene solamente sul codice dello stub: una volta decompresso il codice della codesection

    viene a sua volta verificato.

    Intere regioni dello stub, inoltre, sono racchiuse tra funzioni che ne decryptano il codice, lo eseguono e poi lo

    cryptano nuovamente, rendendo impossibile la ricerca diretta di pattern e riferimenti a indirizzi che potrebbero

    interessarci.

  • 5

    Antis

    Anti-Attach Hooks La prima cosa che il buon reverser fa, una volta accortosi che far girare il processo sotto debugger sar

    un processo molto lungo, tentare di individuare almeno una zona nel codice vicin