Assembly and Reverse Engineering

Download Assembly and Reverse Engineering

Post on 09-Jun-2015

855 views

Category:

Technology

3 download

Embed Size (px)

DESCRIPTION

Il documento si propone di analizzare le tecniche di base per effettuare il reverse engineering. Verranno inoltre prese in esame le caratteristiche principali di alcuni dei tool utilizzati nel reverse engineering .

TRANSCRIPT

<ul><li> 1. LUIGI CAPUZZELLOReverse Engineering Tecniche di base per il reverse engineering Versione: 1.0Luigi Capuzzello 05/12/2013http://www.linkedin.com/pub/luigi-capuzzello/7/561/12a http://www.slideshare.net/luigicapuzzello @FisherKasparov luigi.capuzzelloIl documento si propone di analizzare le tecniche di base per effettuare il reverse engineering. Verranno inoltre prese in esame le caratteristiche principali di alcuni dei tool utilizzati nel reverse engineering .</li></ul><p> 2. Definizioni Generali.2Sommario Definizioni Generali.............................................................................................................................3 Memoria...........................................................................................................................................3 Registri.............................................................................................................................................4 Principali Direttive Assembly..............................................................................................................6 Dati: estrarre informazioni...............................................................................................................6 Istruzioni di SALTO.........................................................................................................................6 Metodi di Indirizzamento.................................................................................................................6 LEA, LDS, LES................................................................................................................................7 LOOPE, LOOPZ, LOOPNE, LOOPNZ...........................................................................................7 MOV.................................................................................................................................................7 PUSH, POP, PUSHF, POPF, PUSHA, POPA, PUSHAD, POPAD................................................7 PTR...................................................................................................................................................7 Stringa - Direttiva STOS, STOSB, STOSW....................................................................................7 Stringa - Direttiva CMPS, CMPSB, CMPSW..................................................................................8 Stringa - Direttiva LODSB, LODSW, LODSD (ESI --&gt; EAX).......................................................8 Stringa - Direttiva MOVS, MOVSB, MOVSW, MOVSD (ESI --&gt; EDI).......................................8 Stringa - Direttiva REP, REPE, REPZ, REPNE, REPNZ (CX).......................................................9 Stringa - Direttiva SCAS, SCASB, SCASW....................................................................................9 Gestione dei messaggi in windows....................................................................................................11 OllyDbg e i messeggi.....................................................................................................................13 Reverse Engineering: ricerca di un seriale.........................................................................................14 WindAsm........................................................................................................................................15 Hiew...............................................................................................................................................16 Patch mediante file c++..................................................................................................................16 OllyDbg..........................................................................................................................................17 P32Dasm........................................................................................................................................18 PEditor............................................................................................................................................18 Regmon...........................................................................................................................................18 Filemon...........................................................................................................................................18 Programmi Criptati.............................................................................................................................19 VISUAL BASIC: API SU CUI SETTARE UN BREAKPOINT......................................................20 Usare SmartCheck..........................................................................................................................21 Configurare SmartCheck............................................................................................................21 Capire le API in SmartCheck.....................................................................................................22 Consigli per usare SmartCheck..................................................................................................23Luigi Capuzzello 3. Definizioni Generali.3Definizioni Generali. Memoria. In generale facendo riferimento a questa figura potremo dare le seguenti definizioni:Supponiamo di avere un processo caricato in memoria, il processo contiene una sezione (RData) e allinterno della sezione ho unistruzione. Allora definiamo: Raw Offset: lindirizzo che aveva quella sezione quando era su disco; Virtual Offset: lindirizzo della sezione a partire dalla base della RAM; Image Base (Base Address): indirizzo in RAM in cui viene caricato il mio processo. Generalmente: o .exe hanno Base Address = 0x00400000; o .dll hanno Base Address = 0x10000000; RVA: indirizzo dellistruzione a partire dallimage base; Virtual Address: indirizzo della istruzione in RAM: VA = RVA + Base Address; Virtual Size: dimensione in RAM della mia sezione; Raw Size: dimensione su disco della mia sezione; Un indirizzo di memoria potr essere sempre indicato come segment:offset segment sar sempre un valore a 16 bit offset sar un valore a 16 o 32 bit a seconda del tipo di processore. Nel caso di processore a 16 bit loffset deve poter essere di 16 (e non di 0) per indicare un segmento di 64Kb. La RAM poi divisa in pagine di memoria della grandezza di 4.096 byte (10 bit) I segmenti o paragrafi sono sempre lunghi 65.536 byte (16 bit)Luigi Capuzzello 4. Definizioni Generali.4Registri.Esistono fondamentalmente otto registri. La lettera E indica che i registri sono a 32 bit. Il legame tra con i registri a 16 bit il seguente: AL: AX: EAX:1 byte ---&gt; FF 2 byte ---&gt; FF FF 4 byte ---&gt; FF FF FF FFIl significato di ogni registro il seguente: RegistroNomeUsoEAXAccumulatorManipolazione degli operandi e dei risultati delle operazioni logico-aritmetiche, nonch, in genere, del valore restituito dalle funzioni al codice chiamante.EBXBase AddressingPuntatore ai dati contenuti nel segmento DS (ad esempio, viene usato per contenere l'indirizzo del primo byte di un array o di un tipo di dato complesso, come una struttura o un record).ECXCounterUsato come contatore nei cicli, nelle istruzioni di shifting e rotazione e nelle operazioni di manipolazione di stringhe.EDXDataPuntatore nelle operazioni di I/O nonch come registro ausiliario in alcune istruzioni aritmetiche (moltiplicazione e divisione).ESISource IndexUsato nelle operazioni di manipolazione di stringhe, come puntatore ai dati di partenza. Viene usato anche per contenere l'offset di dati contenuti nel segmento DS (rispetto all'indirizzo di base contenuto in EBX).EDIDestination IndexUsato nelle operazioni di manipolazione di stringhe, come puntatore ai dati di destinazione. Viene usato anche per contenere il puntatore ai dati (o all'indirizzo) di destinazione contenuti nel segmento ES o l'offset di dati contenuti nel segmento DS (rispetto all'indirizzo di base contenuto in EBX).EBPBase PointerPuntatore ai dati sullo stack (ad esempio, i parametri e le variabili locali di procedure eLuigi Capuzzello 5. Definizioni Generali.5funzioni). Viene usato anche per contenere l'indirizzo dei dati contenuti nel segmento SS. ESPStack PointerEsistono Puntatore all'ultimo elemento posto sullo stack. Viene anche usato per contenere l'indirizzo di offset di dati contenuti nel segmento SS (rispetto all'indirizzo di base contenuto in EBP).poi cinque segmenti usati dal processore per elaborare un processo: CS: Code Segment; il segmento usato di default per le istruzioni; SS: Stack Segment; il segmento usato di default per lo stack; DS: Data Segment; il segmento usato di default per gli accessi alla memoria in RW; ES: Data Segment; il segmento usato di default per gli operandi di dest. e per la manipolazione di stringhe Per modificare i segmenti di default occorre utilizzare loperatore :Esempio: mov es:[eax],edxLuigi Capuzzello 6. Definizioni Generali.6Principali Direttive Assembly. Dati: estrarre informazioni. TYPE: dimensione in bytes di ogni singolo elemento del dato LENGTH: numero di elementi che compongono il dato SIZE: fornisce il numero di bytes totali che formano il dato SEG: Fornisce il segmento in cui inserito il dato OFFSET: Fornisce l'indirizzo del primo bytes del dato relativo al suo segmentoAd esempio: DatiSEGMENT Prova DW 232 DUP (5) ENDSDati... MOV MOV MOV MOV MOVAX,TYPE Prova CX,LENGTH Prova DX,SIZE Prova BX,SEG Prova SI,OFFSET Prova; ; ; ; ;AX = 2 BX = 232 DX = 232 * 2 BX = Dati SI = 0 (in questo caso Prova il primo elemento)Istruzioni di SALTO Le piu' comuni sono: je (jump if egual) salta se si e' verificata una condizione di eguaglianza in un confronto jne (jump if not egual) salta se non si e' verificata una condizione di eguaglianza jz (jump if zero) salta se il se il bit del registro di flag che rappresenta lo zero e' settato jnz (jump if not zero) salta se il se il bit che rappresenta lo zero non e' settato ja (jump if above) salta se e' maggiore jb (jump if below) salta se e' minore jae/jbe (jump if above or equal/jump if below or equal) come sopra ma salta anche se uguale jg (jump if great) come ja ma tiene conto del segno jl (jump if less) come jb ma tiene conto del segno jge/jle (jump if great or equal/jump if less or equal) I loro opcode sono Mnemonico Opcode salto corto Opcode salto lungo je 74 OF 84 jz 74 OF 84 jne 75 OF 85 jnz 75 OF 85 ja 77 OF 87 jb 72 OF 82 jae 73 OF 83 jbe 76 OF 86 jg 7F OF 8F jl 7C OF 8C jge 7D OF 8D jle 7E OF 8E Come potate notare praticamente le istruzioni je/jz jne/jnz sono esattamente uguali per la cpu.Metodi di Indirizzamento Esistono diversi metodi di indirizzamento delle variabili: 1. Indirizzamento immediato mov ax, 1643 ; 1643 il dato numerico da mettere in AX 2.Indirizzamento assoluto mov ax,[7563] ; 7563 l'indirizzo del dato da mettere in AXLuigi Capuzzello 7. Definizioni Generali.73.Indirizzamento con registro mov ax, [si] ;metto in ax il dato puntato da si (che si trova all'indirizzo si).Si pu anche scrivere: mov ax, [si+45] ; avete capito cosa fa vero? MOV AX,[BX+SI+5] MOV AX,[BX][SI]5 ; come scrivere quello che c sopra4.Indirizzamento indiretto mov ax, [[1450]];in pratica in 1450 c' l'indirizzo del dato da mettere in AX.LEA, LDS, LES Loperatore LEA carica un OFFSET (punatatore di tipo NEAR appartenente cio allo stesso segmento) allinterno del registro specificato. LEA dx , stringa MOV dx , OFFSET stringa;carica in dx lOFFSET di stringa ; la stessa operazioneLEA EAX, [EBP+dst];mette in EAX il puntatore allindirizzo EBX+dstLOOPE, LOOPZ, LOOPNE, LOOPNZSono le istruzioni per compiere cicli. Si basano sul valore del registro CX. In particolare: Il valore del registro CX viene decrementato ogni volta che si arriva ad uno di questi LOOPxx LOOPE LOOPNE LOOPZ LOOPNZgira gira gira giramentre mentre mentre mentre uguale non uguale zero non zeroMOV Per prelevare un byte allindirizzo puntato dal registro EAX faccio MOV AL, [EAX]PUSH, POP, PUSHF, POPF, PUSHA, POPA, PUSHAD, POPAD PUSH, POP: PUSHF, POPF: PUSHA, POPA:consente di inserire e prelevare valori dallo stack conente di salvare nello stack i valori dei flag consente di salvare nello stack i valori di tutti i registri (AX,BX,CX,DX,SP,BP)PTRConsente di accedere ad una variabile cambiando il tipo con cui stata definita. Il tipo della nuova etichetta potr essere BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR. RamVideo DW 0B800H MOV AL, BYTE PTR CS:[RamVideo] AL EAX) Usato per caricare il valore di una stringa in un registro LODSB : carica un BYTE da DS:(E)SI ----&gt; AL LODSW : carica una WORD da DS:(E)SI ----&gt; AX LODSD : carica una DOUBLEWORD da DS:(E)SI ----&gt; EAX .DATA numeri DB 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 .CODE ... cld mov cx, 10 ; numero di iterazioni mov si, OFFSET numeri mov ah, 2 prendi: lodsb add al,'0' ; converte in ASCII mov dl, al int 21h ; lo visualizza loop prendi ; torna a cercareStringa - Direttiva MOVS, MOVSB, MOVSW, MOVSD (ESI --&gt; EDI) Spostano byte da una stringa ad unaltra: MOVSB: sposta un BYTE da MOVSW: sposta una WORD da MOVSD: sposta una DWORDDS:[(E)SI] ---&gt; ES:[(E)DI] DS:[(E)SI] ---&gt; ES:[(E)DI] DS:[(E)SI] ---&gt; ES:[(E)DI]Dunque listruzione MOVSB esegue in colpo solo quattro istruzioni: MOV AL, DS:[SI]Luigi Capuzzello 9. Definizioni Generali.9MOV ES:[DI], AL INC SI INC DI .MODEL small .DATA source DB 10 DUP ('012345679') detin DB 10 DUP (?) .CODE mov ax, @data ; un altro modo per carica il segmento mov ds, ax ; lo metto in DS mov es, ax ; e anche in ES ... ... ... cld mov cx, 10 ; imposto il numero di iterazioni mov si, OFFSET source ; Carico l'ind. del sorgente mov di, OFFSET destin ; Carico l'ind. della desinazione rep movsb ; sposto 10 byteStringa - Direttiva REP, REPE, REPZ, REPNE, REPNZ (CX) Consentono di effettuare loop nelle seguenti circostanze REP: ripete fino a quando CX=0 REPE: ripete fino a quando CX uguale REPZ: ripete fino a quando CX=0 REPNE: ripete fino a quando CX diverso REPNZ: ripete fino a quando CX 0 Esempio 1. Posso utilizzare questo costrutto per fare il confronto tra stringhe 004012C8 . MOV ESI,CrackMe5.00403273 ; ESI = User 004012CD . MOV EDI,CrackMe5.0040327F ; EDI = Seriale 004012D2 . MOV ECX,0C 004012D7 . REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 004012D9 . JE SHORT CrackMe5.00401300 Esempio 2. Codice SMC automodificante 00401363 . MOV ESI,Tre.004015C3 00401368 . MOV EDI,Tre.00401374 0040136D . MOV ECX,49 00401372 . REP MOVS BYTE PTR ES:[EDI],BYTE PTRStringa - Direttiva SCAS, SCASB, SCASW Usata per cercare un dato valore allinterno di una stringa. .DATA stringa DB "Ken il guerriero" lung EQU $-stringa ; lunghezza della stringa pstringa DD string ; puntatore alla stringa .CODE ... ... cld ; direzione dx --&gt; sx mov cx, lung les di, pstringa mov al, 'r' ; carattere da cercare repne scasb ; cerco jnz non_trovato ; se non lo trovo salto ... ... ; ES:DI punta al carattere che cercavo ... ; in questo c...</p>