| Corso newbies numero 11 | ||
Data |
by "IronSpark" |
|
25/09/2002 |
Published by Quequero |
|
Andregeddon un esempio di .i.a :) |
Qualche mio eventuale commento sul tutorial ..... alllora .... il tutorial è pieno zeppo di cazzate .... più si scende nei particolare più la mia lameraggine aumenta!!! :))))) Ok quella e' stata l'invasione di iron :) cmq bravo il problema e' che finche' userai frontpage express 2.0 mi darai SEMPRE tutorial S-formattati :))) |
Quequero un esempio di ..... mmmmm..... ma non mi viene in mente nulla :P |
.... |
|
.... |
Difficoltà |
(x)NewBies ( )Intermedio ( )Avanzato ( )Master |
|
Il tutorial è molto semplice e si presenta bene per chi non sa niente o quasi di asm o reversing . ho cercato di essere più semplice possibile, mica come il sommo Que che quando spiega non lo capisce nessuno :PPP ..... Que lo sai che ti Amo!!!!! :DD
Introduzione |
Tools usati |
URL o FTP del programma |
Notizie sul programma |
Essay |
Ciao ragazzi, benvenuti al mio primo tutorial!!! a dir la verità ne avevo fatto un altro ma una volta formattando l' ho cancellato!!!:(( ...... non cominciate con dire che sono leimmmmmmm... bastardiiiiii ... vi ho sentito pronunciare quella parola!!!! :)). Siamo giunti a questo tutorial per cercare di REVERSARE e non craccare questo non so se semplice programmino scritto dall' ormai GRANDE : ANDREAGEDDON!!!L' uomo che ha sopportato e sopporta tutt ora le mie domande leim e le mie continue seghe mentali su cose inutili!!!! ANDREA se fossi donna ti avrei già ...... vabbè lassamo sta!!! Questo programmillo sembra piuttosto semplice e a quanto dice Andrea serve per imparare ad usare meglio il nostro disassemblatore preferito :IDA!!! (sicuramente que metterà qualche asterisco sul nome del programma:))). Noi lo reverseremo con molta calma e nella più assoluta semplicità!! Partiamo........wrooooooooommmmmmmmm ..... eccoci in viaggio!!! (n.d.r. Ironspark basta con le cazzate!! Che hai fumato oggi? :>>> NdQue) Allora prima di tutto dovete avere IDA se non non facciamo niente! se non lo avete sparatevi:))... scherzo cercate e cercate in rete qualche versione di sicuro la ritroverete (mi raccomando www.google.com rulez!!!). aprite il file e disassemblatelo (ora pensavo ma perchè fare sto prog per imparare ad usare IDA se ci sono i tut del Que alla UIC????? Boh forse perchè sono fatti dal Que e andrea non voleva sentirsi meno:PPPP). Riprendiamo, avete disassemblato il file??si??? bene procediamo con l' analisi: prendiamo confidenza con i tasti della toolbar in IDA , cerchiamo il tasto che ci da le string reference ( referenze di stringa sarebbero le variabili stringa che sono state impostate come variabili inizializzate quando è stato programmato il file, cioè scrivendo un file in asm avremmo scritto:
.data
Cicciopancetta db "io sono un pirla!!!"
AndreaGeddon db "è il + grande uomo che esista???"
ecco abbiamo dichiarato delle variabili che sono Cicciopancetta
e AndreaGeddon assegnadolgi uno spazio ben definito in memoria attraverso db
e dd e poi abbiamo immesso nello spazio allocato i valori che nel nostro caso
corrispondono alle stringhe tra le virgolette. spero di essere stato chiaro
e spero che la spiegazione sia giusta:))) Ecco cercate il tasto per creare una
lista di string reference , cioè cercate un tasto che abbia questo simbolo sopra
"-". dopo averlo trovate non esitate a premerlo... lo avete fatto?????
nooooooooooooooooooo avete attivato un super virus... mannaggia e ora come famo???
boh a questa domanda non c è soluzione e noi allora ce ne freghiamo e andiamo
avanti......Ovviamente spero che prima di dissassemblare il file abbiate provato
ad eseguire il file.... non lo avete fatto??? LEIM fatelo e cercate di far comparire
la message box con su scritto:"Non registrato!"........ dopo averlo
fatto ed esservi resi conto ritornate ad Ida.... ovviamente avrete capito che
nella lista di string reference cercheremo la scritta "Non registrato!"
e da li procedendo all' indietro reverseremo il codice per capire come funziona!!!
mmmm.... mi sa che i soliti imbranati stanno ancora cercando il tasto per aprire
la finestra con le string reference:)))).. dai ce la farete prima o poi!!!!dovreste
trovare una riga simile:
"-".data:0040502C 00000010 C
Non registrato!
cliccateci sopra due volte e chiudete la finestra dovreste
trovarvi in Ida a questa riga di codice:
.data:0040502C
aNonRegistrato db 'Non registrato!',0
visto che sto studiacchiando un pò di programmazione assembly
vi do qualche informazione in più su questi dati:))
ovviamente aNonRegistrato
è il nome della variabile che stiamo allocando in memoria cioè il nome che attribuiamo
allo spazio che vogliamo riservare in memoria , il "db" sta per define
byte e 'Non registrato!' è il valore
che immettiamo nello spazio precedentemente dichiarato. sappiate che ogni Ansi
tsring in windows deve terminare con un NULL che in esadecimale corrisponde
a 0, cioè dice alla chiamata che userà tale variabile che la stringa termina
con uno zero e deve finire di allocarla quando lo incontrà:))..... spero di
avervi fatto capire qualcosa!!! Adesso una volta notati questi particolari andiamo
al sodo della questione:
.data:0040502C aNonRegistrato db 'Non registrato!',0
; DATA XREF: .text:004012E0o
Ida è così bello che vi dice che il dato che abbiamo immagazzinato
è referenziato , diciamo usato, alla riga della sezione .text indirizzo 004012E0
(Image base + Relative Virtual Address) e ci da la possibilità cliccando due
volte su DATA XREF: .text:004012E0o di andare a quell indirizzo!!!!! Potere
ad IDAAAAAAAAAAAAAAAAAAA......... Cliccato??? Ok dovremmo trovarci qui:
.text:004012D5 loc_0_4012D5:
; CODE XREF: .text:004012ADj
.text:004012D5
mov ecx,
[esp+24h]
.text:004012D9
push 10h
.text:004012DB
push offset
aRegistration ; "Registration"
.text:004012E0
push offset
aNonRegistrato ; "Non registrato!"
.text:004012E5
push ecx
.text:004012E6
call ds:MessageBoxA
Come vedete ritroviamo la chiamata alla message box
che guarda caso usa proprio la variabile che abbiamo sopra analizzato!!!!
Innanzitutto diamo uno sguardo ad un file che a noi deve piacere per forza e che è uno dei punti cardine della programmazione sotto windows l' Api reference. Un Api è una blocco di codice che è contenuto nelle dll e che viene richiamato ogni volta che se ne richiede bisogno per esempio: se vogliamo far apparire auna messagebox possiamo sfruttare un Api che si chiama messagebox e che è contenuta in una dll di windows così nella programmazione sotto windows risparmiamo tempo ad implementarla(= scriverla ed eseguirla). L' Api MessageBoxA è quindi rappresentabile come una funzione a cui noi passiamo dei parametri e che ci ritorna dei valori:
int MessageBox(
HWND
hWnd, // handle of owner window//handle
della nostra finestra
LPCTSTR
lpText, // address of text in message box//indirizzo
in cui allochiamo il testo
LPCTSTR
lpCaption, // address of title
of message box // indirizzo in cui allochiamo il titolo
UINT
uType
// style of message box//tipo di message box
);
come possiamo vedere è una funzione che ritorna un intero,
a seconda del valore che assume tale intero avremo diversi casi: ci ritornerà
0 se non c è abbastanza memoria per eseguire
la messagebox,altrimenti il valore di ritorno sarà un valore che dipenderà dal
tipo di messagebox!!! vediamo un piccolo sorgente in asm che vi permetterà di
capire come lavora un programma in asm:
__________________CUT HERE____________________________
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
; calls to functions in user32.lib and kernel32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
CiccioRiccio db "Win32 is cool!"
CiccioFiccio db "Ecco la vostra prima message box:URRAAAAA"
.code
start:
push MB_OKCANCEL
push offset CiccioFiccio
push offset CiccioRiccio
push NULL
call MessageBoxA
cmp eax,IDOK
jnz Ciccio
push MB_OKCANCEL
push offset CiccioRiccio
push offset CiccioFiccio
push NULL
call MessageBoxA
Ciccio:
push 0
call ExitProcess
end start
______________CUT HERE_____________________
le linee di codice sono mooooolto semplici e sono state assemblate con il compilatore masm!!! allora scorriamo il codice indietro cercando il controllo che ci faccia saltare alla message box di errore che è quella che abbiamo dettagliatamente analizzato. Poche righe sopra troviamo il controllo e abbiamo le seguenti linee di codice:
.text:004012A5 loc_0_4012A5:
; CODE XREF: .text:0040128Cj
.text:004012A5
cmp pappagallo,
1Fh ; ecco qui il controllo
.text:004012AD
jnz short
loc_0_4012D5 ;salta se il controllo fallisce
.text:004012AF
mov eax,
[esp+24h]
.text:004012B3
push 40h
.text:004012B5
push offset
aRegistration ; "Registration"
.text:004012BA
push offset
aComplimentiCeL ; "Complimenti ce l'hai fatta!"
.text:004012BF
push eax
.text:004012C0
call ds:MessageBoxA
allora
la riga di codice:
cmp
pappagallo, 1Fh
fa il confronto fra due valori che possono e no essere due
registri nel nostro caso controlla che ciò che è contenuto nella variabile pappagallo
sia uguale al valore esadecimale 1F che corrisponde al valore decimale 31. esattamente
cmp sta per "compare" ed esegue tale confronto! la riga di codice:
jnz
short loc_0_4012D5
è un salto condizionato cioè salta alla locazione 4012D5
se il valore ritornato dal confronto non è zero.Infatti jnz sta per "junp
if not zero". semplicemente pensate che il compare faccia la sottrazione
tra i valori e il risultato sia zero se sono uguali e uno se non sono uguali,
il jump successivo opera in base a quei valori.... nel nostro caso se i due
valori sono uguali il risultato del compare è zero e quindi non esegue il salto!!!!Si
nota velocemente che se il salto non viene eseguito si arriva alla call di avvenuta
registrazione!!! il passo successivo sarà dare un nome alla variabile che viene
confrontata che io ho già rinominato in pappagallo!!! Come si fa??? semplicemente
andando sulla variabile selezionandola e cliccando sul tasto destro del mouse
si apre una tendina in cui c è la riga rename.... cliccateci sopra e date alla
avriabile il nome che volete!!!! ecco fatto ora avate rinominato la variabile
e vi sarà più facile ricondurvi ad essa scorrendo il codice, come vi sarà più
facile ricercarla!!! Allora vediamo come agire.Andiamo su search si aprirà il
menu a tendina e cerchiamo la voce text... fatto? cliccateci sopra e cercate
la parola pappagallo e cercate il nome con cui avete rinominato la variabile
che vi ho detto di rinominare! fatto?? bene la prima volta che incontriamo tale
variabile è un questa parte di codice:
.text:0040104A
push 0
; hTemplateFile
.text:0040104C
push 4000000h
; dwFlagsAndAttributes
.text:00401051
push 0
; dwCreationDisposition
.text:00401053
push 0
; lpSecurityAttributes
.text:00401055
push 0
; dwShareMode
.text:00401057
push 0
;
dwDesiredAccess
.text:00401059
push offset
a_Siwvid ; lpFileName
.text:0040105E
call ds:CreateFileA
.text:00401064
cmp eax,
0FFFFFFFFh
.text:00401067
jnz short
loc_0_401070
.text:00401069
or byte
ptr pappagallo, 10h
come notate troviamo un altro compare che esegue un confronto
fra il valore 0FFFFFFFFh e il registro eax che contiene il valroe tornato dalla
chiamata precedente cioè call ds:CreateFileA.... come si può facilemente notare
il valore di ritorno di una funzione è sempre restituito in eax!!!!! o quanto
meno nella maggior parte dei casi:-)).... Allora notiamo che viene eseguita
un Api che andiamo a studiare:
HANDLE CreateFile(
LPCTSTR
lpFileName,
// pointer to name of the file
DWORD
dwDesiredAccess,
// access (read-write) mode
DWORD
dwShareMode,
// share mode
LPSECURITY_ATTRIBUTES
lpSecurityAttributes, // pointer to security attributes
DWORD
dwCreationDistribution,
// how to create
DWORD
dwFlagsAndAttributes, // file attributes
HANDLE
hTemplateFile
// handle to file with attributes to copy
);
questa Api crea o apre un dei seguenti oggetti:
·
files
·
pipes
·
mailslots
·
communication resources
·
consoles
·
directory (only open)
come valore di ritorno si ha un handle che può essere usato
per accedere all' oggetto cioè un handle di apertura al file specificato:-)......
Ricordatevi di dare uno sguardo all' ApiReference.
Guardando bene come è costruita questa funzione notiamo
subito che il file che va a creare o aprire è il file siwvid.* che è un file
del nostro debugger preferito softice!!! se la ricerca succede abbiamo un valore
di ritorno che è confrontato con -1 e si nota che il salto avviene se il confronto
fallisce!! Se non viene eseguito il jnz abbiamo che viene fatta un operazione
di or tra la variabile pappagallo e il numero 10h ( in decimale 16 :-)) Chiarooooooooooooooooooo!!!!!!
Alcune cose che non vi spiego le lascio capire a voi perchè
se no non sprecate le vostre menti bacate come faccio io ogni giorno con i miei
bei tensori di tensione e tensori
di deformazione o il mio bel plane stress e plane strainnnnnnnn!!!!! passiamo
avanti e con lo stesso metodo cerchiamo un altra volta la parola pappagallo
scoprendo questa parte di codice:
push
ecx
.text:004010ED
push 0F003Fh
.text:004010F2
push 0
.text:004010F4
push offset
aUic ; "UIC"
.text:004010F9
push 80000001h
.text:004010FE
call ds:RegOpenKeyExA
.text:00401104
test eax, eax
.text:00401106
jnz short
loc_0_40110F
.text:00401108
or byte
ptr pappagallo, 2
et voila.... siamo punto e accapo.... il discorso è sempre
quello cambia solo l' Api!!! vediamola inzieme inzieme:
LONG RegOpenKeyEx(
HKEY
hKey, // handle of open key
LPCTSTR
lpSubKey,
// address of name of subkey to open
DWORD
ulOptions,
// reserved
REGSAM
samDesired,
// security access mask
PHKEY
phkResult
// address of handle of open key
);
è una funzione che restituisce cosa????vediamo subito: se
la funzione viene eseguita correttamente si ha come valore di ritorno ERROR_SUCCESS
altrimenti si ha un valore diverso definito nella libreria WINERROR.H!!! cerchiamo,
cerchiamo e troviamo questo confronto:
cmp
farina, 7CDh
.text:00401124
jnz short
loc_0_40112D
.text:00401126
or byte
ptr pappagallo, 1
dobbiamo fare un compare tra la variabile che io ho rinominato
"farina" e quel numerello esadecimale... se cerchiamo la variabile
farina notiamo che è referenziata in questa pare di codice :
.text:00401003
push ebx
.text:00401004
push esi
.text:00401005
push edi
.text:00401006
push offset
farina ; lpSystemTime
.text:0040100B
call ds:GetSystemTime
provate voi adesso ad usare l' APi reference e capire che
cosa è quella variabile:-))))!!!!!
cercando e trovando ed analizzando e reversando.... ando
ando ando si giunge qui:
.text:00401216
push esi
.text:00401217
call ds:IsZoomed
.text:0040121D
test eax, eax
.text:0040121F
jz
loc_0_40110F
.text:00401225
or byte
ptr pappagallo, 4
anche qui lascio il tutto a voi!!! Ormai è chiaro come funziona!!!
e se cercate l' ultima volta pappagallo trovate il compare finale :
cmp
pappagallo, 1Fh
.text:004012AD
jnz short
loc_0_4012D5
.text:004012AF
mov eax,
[esp+24h]
.text:004012B3
push 40h
.text:004012B5
push offset
aRegistration ; "Registration"
.text:004012BA
push
offset aComplimentiCeL ; "Complimenti ce l'hai fatta!"
.text:004012BF
push eax
.text:004012C0
call ds:MessageBoxA
Quindi il tutto si riduce ad capire come funzionano quelle
benedette Api e cosa ci danno come valore di ritorno per poter far avvenire
i salti:-)))!!! Io avrei finito e vorrei salutare alcuni miei grandi amiconi:
AndreaGeddonz..Yado..!!!!!raggazi perdono se sono li pronto a rompervi ogni
santa volta ma siete i miei guru:)))!!.
il mio tut è semplice semplice perchè non sono un reverser ma un appassionato che a tempo perso si diverte con queste cose!!!!grazie e arrivederci!!!
|
Note finali |
allora se penso a queste note la-la-si-do-do..... mi sa che non vanno bene!!! io reverso perchè ...... non ho un cazzo da fare!!!! :PPP Rotfl questa si che si chiama passione ;p NdQue
Disclaimer |
Noi reversiamo solo a scopo didattico!
Capitoooooooo????? Bhè credo di si ;))))