prorel | HelloWorld a écrit :
....
Et sinon le voici mon listing du bootloader de XP (de base, pas de SP). Jamais publié, tu le trouveras pa sailleurs :
Code :
- ;cette routine doit se situer à l'adresse 07C0h
- ;Instruction de saut à la routine de boot (3 octets)
- jmp start ;0054 ;0000
- nop ;0002
- ;Nom du fabricant et n° version (8 octets)
- DB 'NTFS',0,0,0,0 ;0003
- ;Octets par secteur (2 octets)
- SectorSize DW 512 ;000B ok
- ;Secteurs par cluster (1 octet)
- SecteurParCluster DB 4 ;000D ok
- ;Nbre secteurs réservés (2 octets)
- NbSecteursALire DW 0 ;000E ok
- ;inutilisé (5 octet)
- SecteursLus DW 0 ;0010
- dummy3 DW 0 ;0011
- Int13Ex DB 0 ;0013
- ; si 1 => fonction étendues de lecture / écriture du disque présentes
- ;Descripteur de support (1 octet)
- DB 0F8h ; disque dur ;0015
- ;inutilisé (2 octets)
- DW 0 ;0016
- ;Nbre de secteurs par piste (2 octets)
- NbSecteurParPiste DW 03Fh ;0018
- ;Nbre de têtes (2 octets)
- NbTetes DW 0FFh ;001A
- ;Distance entre 1er secteur du volume et 1er secteur du support (4 octets)
- StartSector DD 004E327Fh ;001C
- ;inutilisé (4 octets) (initialisé à 0, => espace réservé pour l'exécution)
- ;sert a stocker le nombre de secteurs du disque
- TotalDiskSectors DD 0 ;0020
- ;inutilisé (4 octets)
- DiskNumber DW 80h ;0024
- DW 80h ;0026
- ;Nombre total de secteur (8 octets)
- DQ 005DA3FDh ;0028
- ;N°logique de cluster de $MFT (Master File Table) (8 octets)
- MFTStartCluster DQ 0003E6D5h ;0030 ok
- ; start sector = 1022804
- ;N°logique de cluster de $MFTMirr (Miroir de Master File Table) (8 octets)
- DQ 0005DA3Fh ;0038
- ;Nombre de cluster par segment de fichier (4 octets)
- NbClusterParSegmentFichier DD 0F6h ;0040 ok
- ;variable signée => 0F6h = -10
- ;si < 0 alors il indique la taille d'un segment de fichier
- ; au moyen d'une puissance de 2 : -9 => 2 puissance 9 => 512
- ; sinon il faut multiplier sa valeur par SizeOfCluster pour obtenir
- ; la taille d'un segment de fichier
- ;donc, SizeOfSegment = 2 puissance 10 = 1024 (1 Ko = taille d'une entrée dans la MFT)
- ;Nombre de clusters par block d'index (4 octets)
- DD 2 ;0044
- ;N° de série du disque (8 octets);0048
- DB 7Ch, 0EDh, 02h, 6Ch, 21h, 03h, 6Ch, 24h
- ;Checksum (4 octets)
- DD 0 ;0050
- start: ;054h
- cli
- xor ax, ax
- mov ss, ax
- mov sp, 7C00h
- sti
- mov ax, 07C0h
- mov ds, ax
- call CalculeNbSecteurs
- mov ax, 0D00h
- mov es, ax
- xor bx, bx ;ES:BX : adresse où écrire les secteurs lus
- mov byte ptr [NbSecteursALire], 10 ;nombre de secteurs à lire (et placer en ES:BX)
- call LireSecteur
- push 0D00h ;0D00:0000 debut de la routine de chargement
- push 026Ah ;0D00:026A point d'entrée de la routine
- ;attention : les 512 octets du secteur de boot sont inclus
- retf
- ;----------------------------------------------------------------------------------------------------
- ; compte le nombre total de secteurs du disque dur
- ; la taille max calculée du disque dur est d'environ 8 Go
- ; même si le disque fait plus
- ; la taille en secteurs est affectée à TotalDiskSectors
- ;
- ; adresse = 7Bh
- CalculeNbSecteurs:
- mov dl, [DiskNumber] ;[0024]
- mov ah, 08 ;lire le format du disque (DL = numero du dique)
- int 13
- jnb ok
- erreur:
- mov cx, FFFF ;s'il n'est pas possible d'obtenir des infos sur le disque
- mov dh, cl ;de la part du BIOS, on considère que le disque est de taille max
- ;à savoir secteurs = 63
- ; cylindres = 1023
- ; têtes = 255
- ok:
- ;ici, DL = Nombre de disques durs connectés
- ; DH = Nombre de têtes de lecture/écriture (0=première tête)
- ; CH = Nombre de cylindres (bits 0 à 7)
- ; CL = Nombre de secteurs (bits 0 à 5), Nombre de cylindres (bits 6 à 7)
- movzx eax, dh ; nombre de têtes - 1
- inc ax ; AX = nbre de têtes
- movzx edx, cl
- and dl, 00111111b ; recupérer le nombre de secteurs (6 bits)
- mul dx ; multiplie ax (nb_tetes) avec dx (nb secteurs)
- ; DX+AX contiennent la taille ocuupée par un cylindre
- ; comme la multiplication est de 6 bits * 8 bits,
- ; le résultat tient au max sur 14 bits, soit AX
- ; donc DX = 0
- ; AX = taille d'un cylindre
- ; EAX = taille d'un cylindre (14 bits)
- xchg ch, cl
- ; CH = Nombre de secteurs (bits 0 à 5), Nombre de cylindres (bits 6 à 7)
- ; CL = Nombre de cylindres (bits 0 à 7)
- shr ch, 06 ; CH = partie haute du nombre de cylindres
- inc cx ; CX = partie basse du nombre de cylindres
- ; CX = nombre de cylindres (10 bits)
- movzx ecx, word ptr cx ; ECX = Nombre de cylindres (10 bits)
- mul ecx ; multiplie EAX (taille cylindre) par ECX (NB cylindre)
- ; la multiplication tient sur 14 + 10 = 24 bits
- ; donc EDX = 0
- ; EAX = capacité du disque en secteurs (limité à 1023 cylindres)
- mov dword ptr [TotalDiskSectors], eax
- ret
- ;--------------------------------------------------------------------------------------------------------
- ;--------------------------------------------------------------------------------------
- ; CheckInt13Ex
- ; Test si l'extension de l'int 13h (LBA) est présente ou pas
- ; si oui : Int13Ex est incrémenté
- ;
- ; adresse = 0AAh
- CheckInt13Ex:
- mov ah, 41h
- mov bx, 55AAh
- mov dl, [DiskNumber]
- int 13h
- ; test si l'extension de l'int 13h est présente (LBA)
- ; entrée :
- ; AH - 41h
- ; BX - 55AAh
- ; DL - Drive number
- ; sortie :
- ; Flag Carry =0 : Opération exécutée
- ; Flag Carry =1 : Erreur, dans ce cas AH=Code d'erreur (01h, Invalid Command)
- ; AH - Version of extensions = 30h
- ; AL - Internal use only
- ; BX - AA55h
- ; CX - bit 0 : Fixed disk access subset
- ; bit 1 : Drive locking and ejecting subset
- ; bit 2 : Enhanced disk drive support subset
- ; bit 3-15 : Reserved, must be 0
- ;
- ; ces extensions permettent d'utiliser des disques de grande capacité (> 1023 cylindres)
- ; si elles existent, CF = 0 et BX = 0xAA55
- ; le bit 0 de CX indique si les fonction étendue d'accès au disque dur sont présentes
- ; (fonctions 42h, 43h, 44h, 47h, 48h)
- jb fin ;erreur : fonction non présente
- cmp bx, 0AA55h
- jne fin
- test cl, 01 ; fonction étendues de lecture / écriture du disque présentes ?
- je fin
- inc byte ptr [Int13Ex]
- fin:
- ret
- ;--------------------------------------------------------------------------------------
- ;--------------------------------------------------------------------------------------
- ; LireSecteur
- ; charge NbSecteursALire secteurs du disque en mémoire à l'adresse pointee par ES:BX
- ; a partir de StartSector
- ;
- ; adresse = 0C7h
- LireSecteur:
- pushad
- push ds
- push es
- LireSecteur:
- mov eax, dword ptr [NbSecteursALire]
- add eax, [StartSector]
- cmp eax, [TotalDiskSectors]
- jb Int13Classique
- ;au moins un secteur à lire est situé après la limite des 8Go
- ;il n'est donc pas possible de le lire avec l'int 13h classique
- ;il faut utiliser l'int 13h étendue
- push ds
- push 0
- push eax
- push es
- push bx
- push 00010010h
- cmp byte ptr [Int13Ex], 00
- jne Int13Etendue
- call CheckInt13Ex
- cmp byte ptr [Int13Ex], 00
- je ErreurLecture
- Int13Etendue:
- mov ah, 42h
- mov dl, [DiskNumber]
- push ss
- pop ds
- mov si, sp
- ; DS:SI pointe sur le sommet de la pile qui contient les valeurs
- ; suivantes empilées juste avant :
- ; 4 octets : 00010010h
- ; 2 octets : BX = 0
- ; 2 octets : ES = 0D00h
- ; 4 octets : EAX = StartSector + NbSecteursALire
- ; 2 octets : 0
- ; 2 octets : DS = 07C0h
- ;
- ; il s'agit en fait d'une structure 'Device address packet' nécessaire
- ; à la fonction 42h de l'int 13 pour effectuer une lecture
- ; voici le détail de cette structure :
- ;
- ; DB : taille de la structure (au moins 16) => 10h
- ; DB : réservé (doit valoir 0) => 0
- ; DB : nbre de blocs a tranferer (127 max) => 1
- ; DB : réservé (doit valoir 0) => 0
- ; DD : adresse SEG:OFF du buffer => ES:BX (0D00h au début)
- ; DQ : adresse LBA de lecture (adresse linéaire) => EAX = StartSector + NbSecteursALire
- ; DQ : adresse lnéaire du buffer alternatif si aucun premier buffer n'est spécifié
- ; (en passant FFFF:FFFF comme adresse) => DS = 07C0h
- ;
- ;
- int 13 ; int 13 fonction 42h
- ; lecture étendue
- ; Entrée :
- ; AH - 42h
- ; DL - Drive number
- ; DS:SI - Disk address packet
- ; Sortie :
- ; Flag Carry =0 : Opération exécutée
- ; Flag Carry =1 : Erreur, dans ce cas AH=Code d'erreur
- pop eax
- pop bx
- pop es
- pop eax
- pop eax
- pop ds
- jmp LectureFaite
- Int13Classique: ; EAX = StartSector + NbSecteursALire et EAX < NbSecteurs
- xor edx, edx
- movzx ecx, word ptr [NbSecteurParPiste]
- div ecx ; divise (StartSector + NbSecteursALire) par NbSecteurParPiste
- ; EAX = quotient = Nombre de pistes
- inc dl ; EDX = reste =
- mov cl , dl ; CL = Nombre de pistes
- mov edx, eax ; EDX = StartSector + NbSecteursALire
- shr edx, 10h ; DX = partie haute de (StartSector + NbSecteursALire)
- ; AX = partie basse de (StartSector + NbSecteursALire)
- div word ptr [NbTetes] ; DX:AX divisé par NbTetes
- ; AX = quotient = NbCylindres (10 bits)
- ; DX = reste = NbSecteursRestant
- xchg dh, dl ; DH = NbSecteursRestant
- mov dl, [DiskNumber]
- mov ch, al ; CH = partie basse de NbCylindres
- shl ah, 06h ; AH = partie haute de NbCylindres
- or cl , ah ; CL = Nombre de pistes + partie haute de NbCylindres
- ; CX =
- mov ax, 0201h ; int 13 fonction 2 : lecture du disque dur
- int 13h ; AL = Nombre de secteurs à lire (1 - 128) => lire 1 secteur
- ; DL = Numéro de disque dur (80h ou 81h)
- ; DH = Numéro de tête de lecture/écriture
- ; CH = Numéro de cylindre
- ; CL = Numéro de secteur
- ; ES = Adresse de segment du buffer
- ; BX = Adresse d'offset du buffer
- LectureFaite:
- jb ErreurLecture
- mov ax, es
- add ax, 0020h
- mov es, ax ;incrémente ES de 32 octets => ES:BX pointe 512 octets plus loin
- inc word ptr [SecteursLus]
- dec word ptr [NbSecteursALire]
- jne LireSecteur
- pop es
- pop ds
- popad
- ret
- ErreurLecture:
- mov al, [MsgErrLecturePtr]
- call PrintString
- mov al, [MsgRebootPtr]
- call PrintString
- sti
- boucle2:
- jmp boucle2
- ;--------------------------------------------------------------------------------
- ;--------------------------------------------------------------------------------
- ; PrintString
- ; affiche uen chaine de caractere a l'ecran
- ; la chaine à afficher est pointee par DS:AL
- ;
- ; adresse = 0170h
- PrintString:
- mov ah, 01
- mov si, ax
- PrintChar:
- lodsb ;transfere 1 octet de DS:SI dans AL, puis inc SI
- cmp al, 00 ;si fin du message, quitter
- je fin2
- mov ah, 0E ;int 10h fonction 0Eh : Ecrire un caractère
- ;AL = Code ASCII du caractère
- ;BL = Couleur de premier plan du caractère
- mov bx, 0007
- int 10
- jmp PrintChar
- fin2:
- ret
- ;--------------------------------------------------------------------------------
- @MsgErrLecture: ;0183h
- MsgErreurLecture DB 0Dh, 0Ah, "Err. lecture disque", 0
-
- @MsgNTLDRManque: ;0199h
- MsgNTLDRManque DB 0Dh, 0Ah, "NTLDR manque", 0,
- @MsgNTLDRCompresse: ;01A8h
- MsgNTLDRCompresse DB 0Dh, 0Ah, "NTLDR est compressé", 0
- @MsgReboot
- MsgReboot DB 0Dh, 0Ah, "Entrez Ctrl+Alt+Suppr pour redémarrer", 0Dh, 0Ah, 0
- DB 0Dh, 0Ah
- DB 14 DUP(0)
- MsgErrLecturePtr DB @MsgErrLecture - 100h ; = 83h
- MsgNTLDRManquePtr DB @MsgNTLDRManque - 100h ; = 99h
- MsgNTLDRCompressePtr DB @MsgNTLDRCompresse - 100h ; = A8h
- MsgRebootPtr DB @MsgReboot - 100h ; = BEh
- DB 2 DUP(0)
- DW 55AAh
|
J'attends ton listing qui augmente les privilèges depuis un compte limité.
|
je confirme, on ne peut pas trouver ca dans la vraie vie
n'importe quel programmeur un peu habitué a l'assembleur verra q'il est impossibile de faire marcher ce "prog"
je ne sais pas en quoi tu es expert, mais en tout cas, pas en assembleur, dommage d'avoir detruit un mythe
je ne rentrerais pas dans le prog lui-meme, vu ce qui est presenté dans le listing et ses incoherences, on ne peut meme pas etre sur de son contenu
mais mettre un coup du decimal (int 13), puis qq lignes apres de l'hexa (int 13h), et oser mettre ca sur un forum, c'est montrer a tous, son incompetence
et je ne parles pas de la gestions des segments, genre on initialse Es et on utilise Ds quand aux directives d'assemblage, visiblement tu ne dois meme pas savoir ce que ca veut dire
bref, tu aurais mieux fait de ne rien mettre, au moins tu aurais pu beneficier du doute, là tu as perdu toute credibilité pour le reste, que dire??
tu ne vaut meme pas la peine qu'on debatte avec toi, je te repete, pense que je me degonfle, si ca peut satisfaire ton ego, c'est pas un pb
pour revenir au sujet, c'est a dire au premier post de ce topic (possibilité d'effacer un dd sous windows avec un prog en assembleur)
je maintients ce que j'ai deja dit
sous window98 et avant, tres facile de detruire un DD
sous ME: ??? connait pas
sous NT4: faisable (faille, voir back oriffice) quelque soit le type de compte
sous 2000: pas essayé mais je pense que c'est le plus sur
sous XP famillial; faisable
sous XP pro +sp1: faisable meme en user dans certains cas xp pro+sp2: ???
allez je me retire de ce topic
|