PDA

Visualizza la versione completa : C, win: Stampa contenuto MBR


WBNormal
04-03-2005, 02:58
Questo programma per Windows stampa il contenuto del MBR.
I valori perņ sono stampati disordinatamente, alcuni sono rappresentati con 2 caratteri e altri con 8. Il valore massimo che puņ contenere un byte č 11111111 che in esadecimale č FF, quindi due caratteri dovrebbero essere sufficenti per rappresentare ogni valore.
Inoltre non va a capo ogni 16 byte e questo rende difficile la ricerca di un byte controllando prima la posizione in uno schema tabellizzato dell'mbr. Qualcuno puņ dargli una sistemata? vorrei un output ordinato e funzionale per la ricerca.
Grazie. CIAO



#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void stampa_in_hex(void *, int);
BOOL ReadSect(BYTE,int,DWORD,void*);
int main(int argc, char *argv[])
{
char string[513];
ReadSect(0,1,0,string);
stampa_in_hex(string,513);
system("PAUSE");
return EXIT_SUCCESS;
}

void stampa_in_hex(void *stringINPUT, int stringSIZE)
{
int i;
for(i =0; i < stringSIZE; i++)
printf("%02x ", ((char *)stringINPUT)[i]);
printf("\n");
}

BOOL ReadSect(BYTE disk, int nsects,DWORD lsects,void* data)
{
HANDLE hDevice;
DWORD dummy;
hDevice = CreateFile("////.//PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
if(!hDevice)
return FALSE;
SetFilePointer(hDevice, (lsects*512), NULL, FILE_BEGIN);
if(!ReadFile(hDevice, data, (512*nsects), &dummy, NULL))
return FALSE;
CloseHandle(hDevice);
return TRUE;
}

C:\>gcc -o main main.c

C:\>main
3d 47 ffffff97 fffffff9 ffffffa4 ffffffea 6d fffffff7 27 4d ffffff97 fffffff9 00 00 00 00 3
7 4d ffffff97 fffffff9 45 4d ffffff97 fffffff9 ffffff98 ffffffb1 fffffff8 ffffff80 ffffffe0
37 33 ffffff81 78 fffffff8 08 ffffff81 ffffffe0 37 33 ffffff81 40 06 3d 00 00 01 00 00 40
06 3d 00 40 06 3d 00 ffffffa8 fffffff0 1d ffffffe1 78 fffffff8 08 01 00 00 00 00 60 ffffffe
a 6d fffffff7 57 1e ffffff97 fffffff9 ffffffff ffffffff ffffffff ffffffff 57 1e ffffff97 ff
fffff9 58 38 ffffff97 fffffff9 ffffffff ffffffff ffffffff ffffffff 00 00 00 00 38 00 00 00
23 00 00 00 23 00 00 00 5c 00 6d 00 61 00 69 00 00 fffffff0 fffffffd 7f 45 00 58 00 45 00 0
0 00 20 12 40 00 00 00 00 00 41 ffffffeb ffffffe5 77 1b 00 00 00 78 01 3d 00 78 37 3d 00 78
01 3d 00 ffffff88 37 3d 00 78 01 3d 00 78 01 3d 00 78 01 3d 00 78 01 3d 00 00 00 00 00 58
fffffff8 08 ffffff81 70 37 3d 00 1c ffffffeb 6d fffffff7 ffffff80 37 3d 00 60 37 3d 00 08 0
0 00 00 04 ffffffff 22 00 00 00 00 00 ffffffb3 16 fffffff4 77 60 37 3d 00 71 16 fffffff4 77
ffffffe8 06 3d 00 ffffff8d 16 fffffff4 77 00 00 00 00 68 37 3d 00 10 23 24 00 68 37 3d 00
0b 00 00 00 78 37 3d 00 50 37 3d 00 ffffff93 46 4f ffffff80 00 00 00 00 68 01 3d 00 00 00 0
0 00 68 01 3d 00 00 00 00 00 60 37 3d 00 48 07 00 00 70 37 3d 00 48 37 3d 00 ffffff84 fffff
feb 6d fffffff7 34 04 00 00 60 37 3d 00 78 01 3d 00 70 37 3d 00 78 01 3d 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 10 00 00 00 02 00 00 00 10 00 00 00 18 00 00 0
0 10 00 00 00 ffffffd5 27 fffffff4 00 02 00 00 00 10 00 00 00 78 37 3d 00 00 00 3d 00 04 ff
fffffd 22 00 02 24 01 00 00 00 3d 00 48 fffffffe 22 00 10 55 fffffff6 77 3c ffffffff 22 00
02 24 fffffff7 77 fffffff8 54 fffffff6 77 ffffffff ffffffff ffffffff ffffffff ffffff8d 16 f
ffffff4 77 2e ffffffab ffffffbf 77 00 00 3d 00 00 00 00 00 33 ffffffab ffffffbf 77 00 00 00
00 59 37 3d 00 10 23 24 00 ffffffb0 3e ffffffc0 77 ffffffe0 ffffffff 22 00 ffffffb0 3e fff
fffc0 77 48 20 ffffffbe 77 18 ffffffff 22 00 19 ffffffac ffffffbf 77 ffffffe0 ffffffff 22 0
0 ffffffb0 3e ffffffc0 77 30 20 ffffffbe 77 ffffffff ffffffff ffffffff ffffffff 33 ffffffab
ffffffbf 77 48 ffffff93 ffffffc0 77 68 37 3d 00 50 37 3d 00 08 00 00 00 55
Premere un tasto per continuare . . .

WBNormal
05-03-2005, 03:13
Ho risolto qualcosa
Sono riuscito a fare stampare su ogni riga 16 valori a due cifre in esadecimale.
Ho inserito i valori in una tabella ma non mi tornano alcuni conti, come la dimensione di una partizione che mi sembra ecessiva.
La rappresentazione di un record della tabella delle partizioni č in questo documento, ho numerato ogni singolo bit, e byte. ho speceificato gli indirizzi in esadecimale e il contetnuto dei bytes sia in esadecimale che binario.

http://wbn.ath.cx/PartitionTable-Rec1.pdf

Il codice che ho corretto č questo.


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

void stampa_in_hex(void *,int);
BOOL ReadSect(BYTE,int,DWORD,void*);
int main(int argc, char *argv[])
{
char string[512];
ReadSect(0,1,0,string);
stampa_in_hex(string,512);
system("PAUSE");
return 0;
}

void stampa_in_hex(void *stringINPUT, int stringSIZE){
int i;
int riga = 0;
for(i =0; i < stringSIZE; i++){
printf("%02x ", ((char *)stringINPUT)[i]& 0xFF);
riga = riga + 1;
if (riga==16){
printf("\n");
riga=0;
}
}
printf("\n");
}


BOOL ReadSect(BYTE disk, int nsects,DWORD lsects,void* data){
HANDLE hDevice;
DWORD dummy;
hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,
OPEN_EXISTING, 0, NULL);
if(!hDevice)
return FALSE;

SetFilePointer(hDevice, (lsects*512), NULL, FILE_BEGIN);
if(!ReadFile(hDevice, data, (512*nsects), &dummy, NULL))
return FALSE;

CloseHandle(hDevice);
return TRUE;
}

Loading