PDA

Visualizza la versione completa : [ASSEMBLER] Variabili e direttive di utilizzo registri


Lord112
03-05-2012, 12:53
Ragazzi, allora ho questo problema; ( dopo il mio post precedente, a mio avviso ingiustamente chiuso) ho trovato da internet un bel pdf che illustrava dettagliatamente le variabili in assembler, praticamente si possono definire variabili usando questi comandi:


[nome] direttiva valore
• direttive: BYTE (DB), WORD (DW), DWORD (DD), QWORD (DQ)
• valore può essere:
• un valore numerico
• una stringa tra apici
• il carattere ?
• il costrutto num DUP (val) che replica num volte il valore val.
Il [nome] può essere omesso


Ora però non mi è chiaro, quando ometto il nome della variabile, io cosa diamine vado ad inizzializzare?
Guardiamo questo frammento di codice:
start:


ENCRYPT:
patchstart:
mov bx, offset endencrypt
mov cx, (heap-endencrypt)/2+1
encrypt_loop:
db 002Eh ; cs:
db 0081h ; add word ptr [bx], xxxx
xorpatch db 0007h
encryptvalue dw 0000h


nell'encrypt_loop praticamente definisco una variabile, ma questa variabile non ha nome, nel commento vedo che il valore che assegno alla variabile va a finire in CS, ma non capisco il perchè. Qualcuno di voi sa chiarirmi questa cosa? Grazie mille.

oregon
03-05-2012, 13:59
Originariamente inviato da Lord112
( dopo il mio post precedente, a mio avviso ingiustamente chiuso)

Non sono d'accordo ... prima di tutto, la tu domanda non era affatto chiara e, soprattutto, perché parlavi di un virus ...


ho trovato da internet un bel pdf

Vedi che bisogna comunque documentarsi prima?


quando ometto il nome della variabile, io cosa diamine vado ad inizzializzare?

Inizializzare ... una sola z all'inizio ...

Inizializzi aree di memoria.



Guardiamo questo frammento di codice: ...

start:


ENCRYPT:
patchstart:
mov bx, offset endencrypt
mov cx, (heap-endencrypt)/2+1
encrypt_loop:
db 002Eh ; cs:
db 0081h ; add word ptr [bx], xxxx
xorpatch db 0007h
encryptvalue dw 0000h



nell'encrypt_loop praticamente definisco una variabile

Di quale variabile parli?


va a finire in CS

Tu conosci le microistruzioni x86? Dove hai letto che qualcosa finisce in CS in quel codice? Sai cosa sia CS?

alka
03-05-2012, 14:05
Originariamente inviato da Lord112
Guardiamo questo frammento di codice


Il codice l'hai scritto tu o l'hai preso da qualche parte.
E qual è lo scopo del programma di cui stiamo parlando?

Lord112
03-05-2012, 15:15
Allora, innanzitutto (rivolto ad oregon) so che inizializzazione si scrive con una zeta, è stato un semplice errore, nella fretta di mettere il post online e che tu da gentiluomo avresti potuto pure non mettere in risalto,non stiamo facendo un tema di italiano; per quanto riguarda il vecchio post, io parlavo di virus perchè lo studio che sto conducendo è sui virus metamorfici , quindi volevo specificare bene di cosa stavo parlando, sperando che qualcuno di voi avesse già affrontato il mio stesso problema, ovvero individuare le variabili all'intenro di un codice assembly per generare un data flow analyse (sai a cosa mi riferisco mi auguro).
Per la cronaca, ho studiato per motivi didattici l'assembly del mips, che è sostanzialmente diverso rispetto a quello che mi trovo a dover analizzare adesso.

Nel encrypt_loop con il comando DB definisco un'area di memoria ( che è DEFINITA VARIABILE dal manuale stesso dell'assembly 8086 ) atta a contenere byte .
Siccome come già avevo detto, tale definizione di variabile era senza nome, come si vede dal codice, avevo pensato che il commento ( ;cs) fosse riferito a qualche registro del processore, ecco tutto.


Per alka il codice qui riportato è un frammento di un codice generato da tool di cui ometto il nome per evitare che qualche sprovveduto si metta a fare danni in rete. E' un codice assembly ovviamente come vedi scritto per 8086; come già detto sopra e nel post precedente, il mio compito è fare il DFA , per poter valutare la bontà del sorgente analizzato.

[Piccolo off-topic doveroso da parte mia]
Credo che sia ruolo di un buon forum fornire supporto alla conoscenza ed indirizzare chi sa poco circa un argomento, verso il materiale più giusto a risolvere e colmare quelle che sono le sue carenze. Inoltre dovrebbe essere un punto di ritrovo per discutere su argomenti e passioni comuni, non dovrebbe essere un luogo dove il tipo X mostra di saper fare più del tipo Y , perchè questo è il grosso problema dell'italiano, non condividere, ma cercare di surclassare chi chiede aiuto.

oregon
03-05-2012, 15:32
Originariamente inviato da Lord112
... da gentiluomo avresti potuto pure non mettere in risalto ...

Non te la sarai presa se non sono un gentiluomo ...


non stiamo facendo un tema di italiano

Questo non ha assolutamente importanza.


per quanto riguarda il vecchio post, io parlavo di virus perchè lo studio che sto conducendo è sui virus metamorfici

Purtroppo l'argomento è molto "border line". Sono convinto che tu studi, ma nessuno mi dice che sia effettivamente così. Dato che è indimostrabile, si preferisce non affrontare certi argomenti, almeno così è sempre stato in questo forum.


un data flow analyse (sai a cosa mi riferisco mi auguto).

Ma perché proprio del codice di un virus?


Per la cronaca, ho studiato per motivi didattici l'assembly del mips

E quindi hai visto già in quel caso che il nome della zona di memoria che contiene dei dati è opzionale.


che è sostanzialmente diverso rispetto a quello che mi trovo a dover analizzare adesso.

Non tanto diverso, alla fine.


Nel encrypt_loop con il comando DB definisco un'area di memoria ( che è DEFINITA VARIABILE dal manuale stesso dell'assembly 8086 ) atta a contenere byte .

Ti avevo già chiesto di preciso a quale area ti riferissi nel codice mostrato ...

In ogni caso, un'area di memoria che contiene dati può non avere nomi. Ci sono tanti modi di accedere alla memoria e a volte i nomi non servono.


Siccome come già avevo detto, tale definizione di variabile era senza nome, come si vede dal codice, avevo pensato che il commento ( ;cs) fosse riferito a qualche registro del processore, ecco tutto.

CS è un registro del processore.

Lord112
03-05-2012, 15:44
O finalmente una risposta che giudico buona, capisco perfettamente che l'argomento è al limite di quello che si può e di quello che non si può dire, il punto è che se uno vuole fare danni non certo si mette a fare il DFA di un codice assembler; questa operazione mi serve perchè appunto ho necessità di capire se il codice che sto analizzando è buono o malevolo ecco tutto.

Parto dal codice sorgente di un virus perchè sono sicuro che è malevolo al 100% ; ma sarei potuto partire anche dal codice assembly del programma "ciao mondo".

Dimmi, tu nel mio caso come procederesti? Come realizzeresti un dfa da un codice assembly qualsiasi (così evitiamo il border-line :D) ???

Grazie!

celtico94
03-05-2012, 18:19
Posso solo ipotizzare che le due dichiatrazioni, se fatte in quell' ordine e per prime nella stesura del codice, "vadano a finire" (cioè posso essere referenziate) con DS:0 e DS:2...puoi provare se ciò che dico è giusto debuggando il software e mappando la memoria nel registro DS del processore quando esegue il software

Lord112
04-05-2012, 09:05
Originariamente inviato da celtico94
Posso solo ipotizzare che le due dichiatrazioni, se fatte in quell' ordine e per prime nella stesura del codice, "vadano a finire" (cioè posso essere referenziate) con DS:0 e DS:2...puoi provare se ciò che dico è giusto debuggando il software e mappando la memoria nel registro DS del processore quando esegue il software

Wow non ci ho capito molto di quello che hai scritto, potresti spiegarti meglio? Grazie!

celtico94
04-05-2012, 19:09
Hai allocato due byte (db) senza specificarne il nome. ora tu hai il problema di "come faccio riferimento a quell'area di memoria"? la risposta è semplice. essendo assembly x86 ogni allocazione "va" nel DS, cioè il registro segmento dei dati. ora, se quelle due sono le prime dichiarazioni avute nel programma, facendo riferimento all'indirizzo DS:0 (registro segmento base + offeset 0) fai riferimento alla prima, mentre con DS:1 (registro segmento dati + offset 1) fai riferimento alla seconda...se non comprendi qualcosa che ho detto, dovresti tornare alla teoria sull' assembly e l'architettura dell' 8086.

oregon
04-05-2012, 19:31
Originariamente inviato da celtico94
... "va" nel DS ...

Non è detto che si faccia riferimento a DS. A parte la questione "modalità reale" a 16 o "protetta" a 32 bit, esistono i registri ES, FS, GS e addirittura CS.

Anzi, è proprio quello che fa il "virus" di cui si parla in questo caso, dato che modifica "dinamicamente" il proprio codice modificando il valore dei microcodici contenuti in memoria in base al registro CS:

Loading