Zoom Icon

Zamzom Serial Fishing

From UIC

Zamzom Serial Fishing

Contents


Zamzom Serial Fishing
Author: Andrew10111989
Email: none
Website: none
Date: 19/06/2010 (dd/mm/yyyy)
Level: Half brain is enough
Language: Italian Flag Italian.gif
Comments:



Tools

PEiD 0.95
OllyDbg 1.10 ( opzionale )
IlDasm


Link e Riferimenti


Introduzione

In questo mio secondo tutorial vedremo come fishare il seriale di ZamZom, questo software serve per vedere chi è connesso alla nostra rete wireless. In versione Basic ci fornisce solo IP e MAC, in versione Premium oltre a questo cerca anche di risalire al nome dei computer connessi. Se vi sia utile o meno, noi lo analizzeremo principalmente perché è scritto in .NET e non ci sono ancora in giro molti tutorial, l’obiettivo quindi è iniziare a familiarizzare con IlDasm e alcune funzioni IL, giusto un’analisi a grandi linee perché, come vedremo, dire che fishare il seriale è banale è un eufemismo… Per questo Tutorial non è prevista nessuna conoscenza in particolare, se non un minimo di utilizzo di olly ( fra l’altro opzionale ) e un po’ di conoscenze generali del .NET.



Essay

Una volta installato il programma avviamolo e notiamo in alto a destra il nostro obiettivo, nella TextBox subito sotto al Button “Upgrade” abbiamo la scritta Basic che ci informa della nostra limitazione, cliccando su “Upgrade” la TextBox diventa modificabile quindi possiamo provare a scrivere qualcosa, mettiamo ad esempio qualche numero casuale, qualche parola, qualunque cosa, tanto cliccando sul pulsante OK ( a meno di non beccare fra 34234^4234 possibilità la combinazione corretta! ) il risultato sarà sempre lo stesso: NULLA! Niente errore di messaggio ahimè, una brutta cosa ragionando come ai vecchi tempi, perché il bp su MessageBox risulterebbe inutile. Provando con Olly ad attaccarsi al processo e mettendo un bp su GetWindowTextW non andiamo da nessuna parte in quanto ogni volta che cerchiamo di accedere alla finestra di ZamZom per inserire la chiave di prova c’è la chiamata alla GetWindowTextW e olly poppa prima di poter fare niente! Neanche la solita GetDlgItemTextW offre nuove prospettive. Magari prima di buttarsi a capofitto con debugger, disassembler e altro sarebbe meglio vedere cosa dice il buon PEiD riguardo l’eseguibile…

PEiD.jpg

Mmmmh interessante, è scritto in .NET, forse è ora di mettere da parte i vecchi strumenti e provare qualcosa di più adatto… Apriamo quindi il nuovo Tool offerto da MS IlDasm e apriamo l’eseguibile…

IlDasm.jpg

Ci troviamo di fronte alla schermata del buon IlDasm. Anche se facilmente reperibile, posto la legenda dei simbolini usati dal Tool ( presa direttamente dalla lezione di Ntoskrnl sul .NET ):

Symbols.jpg

Se avete un minimo di praticità ed esperienza non vi sarà difficile capire come è strutturato il programma, in particolare vediamo che per eseguire le sue funzionalità il programma dispone di diverse classi create ad hoc come la “NetScan”, la “PingRange”, ecc… A noi interessa però vedere cosa accade ( o cosa NON accade ) quando clicchiamo sul pulsante OK nella finestra principale, quindi senza perdere altro tempo espandiamo la classe “Form1” e vediamo cosa contiene:

Form.jpg

Questa è la finestra così come si presenta una volta aperta la classe “Form1”, vediamo sotto forma di Field i vari elementi che compongono la parte grafica, un insieme di Button e Label e scendendo i vari TextBox, un Timer, e altri componenti. Ciò che interessa a noi sono però i Method, i metodi utilizzati da questi componenti a Run-Time, in particolare del nostro pulsante OK, scendiamo quindi più sotto per trovare:

Methods.jpg

Abbiamo quindi 10 Button con altrettanti metodi associati all’evento “Click”. Quale di questi Button è il nostro “OK”? Ovvero quale di questi ha la proprietà .Text = “OK”? Senza analizzare tutti i codice di tutti i Button, facciamoci furbi, apriamo il metodo “InitializeComponent:void()” cliccandoci due volte sopra, che come dice appunto il nome inizializza gli attributi dei vari componenti. A questo punto si apre la finestra con il corrispondente codice IL, proviamo a cercare attraverso il menu’ Find la stringa “OK”:

Strings.jpg

Ed eccoci qua! Dopo aver richiamato il Button4, viene pushato con ldstr la stringa “OK”, quindi c’è la call a seT_Text(string).

  • da MSDN: Pushes a new object reference to a string literal stored in the metadata.

Insomma abbiamo capito che il Button incriminato nella verifica del seriale è il Button4, apriamo quindi con un doppio click il suo metodo “Button4_Click” dalla finestra principale:


.method private instance void Button4_Click(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size 85 (0x55)
.maxstack 3
.locals init (bool V_0)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: callvirt instance class [System.Windows.Forms]System.Windows.Forms.TextBox Zamzom_Wireless_Network_Tool.Form1::get_TextBox4()
IL_0007: callvirt instance string [System.Windows.Forms]System.Windows.Forms.TextBox::get_Text()
IL_000c: ldstr "314031333145"
IL_0011: ldc.i4.0
IL_0012: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators::CompareString(string,
string,
bool)
IL_0017: ldc.i4.0
IL_0018: ceq
IL_001a: stloc.0
IL_001b: ldloc.0
IL_001c: brfalse.s IL_004e
IL_001e: ldarg.0
IL_001f: callvirt instance class [System.Windows.Forms]System.Windows.Forms.Label Zamzom_Wireless_Network_Tool.Form1::get_Label3()
IL_0024: ldstr "please wait......"
IL_0029: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Label::set_Text(string)
IL_002e: nop
IL_002f: ldarg.0
IL_0030: callvirt instance class [System.Windows.Forms]System.Windows.Forms.TextBox Zamzom_Wireless_Network_Tool.Form1::get_TextBox4()
IL_0035: call valuetype [System.Drawing]System.Drawing.Color [System.Drawing]System.Drawing.Color::get_DarkGray()
IL_003a: callvirt instance void [System.Windows.Forms]System.Windows.Forms.TextBoxBase::set_BackColor(valuetype [System.Drawing]System.Drawing.Color)
IL_003f: nop
IL_0040: ldarg.0
IL_0041: ldstr "http://www.zamzom.com/upload/new/zamzom wireless n"
+ "etwork tool.exe"
IL_0046: callvirt instance void Zamzom_Wireless_Network_Tool.Form1::UpdateApplication(string)
IL_004b: nop
IL_004c: br.s IL_0052
IL_004e: nop
IL_004f: nop
IL_0050: br.s IL_0053
IL_0052: nop
IL_0053: nop
IL_0054: ret
} // end of method Form1::Button4_Click

Analizziamo questo breve codice. Ad IL_0007 abbiamo una callvirt che pusha nello stack il geT_Text della TextBox4, presumibilmente la TextBox dove inseriamo il nostro seriale, quindi a IL_000C pusha nello stack la stringa “314031333145” ( O_o ), e chiama successivamente a IL_0012 la CompareString!

  • da MSDN: Calls a late-bound method on an object, pushing the return value onto the evaluation stack.

Quindi ora abbiamo nello Stack un int32 (IL_0011: ldc.i4.0) che vale 0 se le due stringhe sono uguali, quindi viene pushato un altro int32 uguale a 0, e richiama IL_0018: ceq che pusha 1 se gli ultimi due valori pushati sono uguali.

  • da MSDN: Compares two values. If they are equal, the integer value 1 (int32) is pushed onto the evaluation stack; otherwise 0 (int32) is pushed onto the evaluation stack.

Quindi a IL_001C c’è un brfalse.s che effettua un salto condizionato se il valore è NULLO, altrimenti continua con la registrazione del programma, ovvero imposta la stringa “Please wait…”, oscura di grigio la TextBox4, esegue l’upgrade e riavvia il programma!

  • da MSDN: Transfers control to a target instruction if value is false, a null reference, or zero.

Come avrete ormai capito la stringa lì in alto bella in chiaro non è altro che il nostro seriale, l’obiettivo quindi è bello che raggiunto, non ci resta che copiarlo e vedere il programma comportarsi nel modo che abbiamo previsto ^_^ …


Note Finali

Se vi aspettavate qualcosa di più tosto mi spiace aver deluso le vostre attese, questo tutorial dimostra come una nuova tecnologia può mettere in difficoltà chi tenta di muoversi alla vecchia maniera, ma mette a suo completo agio chi invece ha le carte giuste… Un saluto e ringraziamento a Ntoskrnl per la sua preziosa lezione sul .NET, ottima guida per la scrittura di questo tutorial… Ciao e alla prossima! ^_^

A_19


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevole e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.