como encontrar offsets de MFT para cambiar los bytes en decimales?

Iniciado por Belial & Grimoire, 30 Enero 2014, 09:12 AM

0 Miembros y 1 Visitante están viendo este tema.

Belial & Grimoire

hola

pues ya logre avanzar con un programa que estoy intentando hacer, despues de re-leer, hice un pequeño avance, pero tengo un problema a ver que opinan

segun MSDN hay dos maneras de analizar la unidad C, ya sea

"\\.\C:", "\\.\C:\" o "\\\\.\\PhysicalDrive0"

En visual basic algunos programadores hacen esto

"\\.\" & Mid(Drive, 1, 2)

donde Drive es "C:\"

supuestamente deberia quedar asi... "\\.\C:"... pero al colocarlo de esa forma en el programa ya no funciona, de igual forma en C tampoco funciona

en C la unica forma que me funciona es usando "\\\\.\\PhysicalDrive0", pero tengo la duda de si funcionara o no, supuestamente si me esta funcionando, porque recibo datos, pero no se si haya alguna diferencia o porque razon en VB solo funcione si utilizan Mid, por que si hay alguna, entonces el programa falla desde el principio pero no me he dado cuenta, y me gustaria saber que opinan o si podrian compilar mi codigo y decirme si a ustedes le funciona "\\.\C:" o si es normal y solo les funciono PhysicalDrive0, mas abajo colocare mi codigo

ahora tengo otro problema, necesito la informacion de los clusters, hay estructuras que puedo usar para saber esto pero no hay para algunas cosas que necesito, pero segun un codigo de VB que analice, se pueden conseguir 3 datos que necesito analizando los datos recibidos con ReadFile

Aqui dejo una tabla de los datos que mencionare


Offset    Size    Description
0x0000    3    Jump to the boot loader routine
0x0003    8    System Id: "NTFS    "
0x000B    2    Bytes per sector
0x000D    1    Sectors per cluster
0x000E    7    Unused
0x0015    1    Media descriptor (a)
0x0016    2    Unused
0x0018    2    Sectors per track
0x001A    2    Number of heads
0x001C    8    Unused
0x0024    4    Usually 80 00 80 00 (b)
0x0028    8    Number of sectors in the volume
0x0030    8    LCN of VCN 0 of the $MFT
0x0038    8    LCN of VCN 0 of the $MFTMirr
0x0040    4    Clusters per MFT Record (c)
0x0044    4    Clusters per Index Record (c)
0x0048    8    Volume serial number


los valores que necesito son el offset 0x0B 0x0D y 0x30

el codigo de VB usa una funcion llamaba bitconverter, que busca un offset y los valores los cambia a decimal

el offset Bytepersector lo puedo sacar con una estructura, tambien tengo entendido que en NTFS un cluster tiene 512 bytes, y eso son 8 sectores, y me faltaria encontrar LCN of VCN 0 of the $MFT

Supuestamente al leer los datos de la unidad, se puede saber eso unicamente llendo al offset y tomando los valores dependiendo del tamaño, y en la tabla esta el tamaño de cada offset

Pero mi problema es que no logro encontrar el offset para tomar el valor hexadecimal y convertirlo en decimal, aqui es donde tambien incluyo el problema anterior, no se si no los encuentro porque CreateFile no abre la unidad C: o es porque no estoy interpretando bien los datos

El resultado los compare con un codigo fuente de https://code.google.com/p/datarecover/ y obtengo el mismo resultado al ejecutar el programa, los dos me dan los mismo hexadecimales, aunque yo lo programe diferente

En VB me arroja este resultado Bitconverter donde busca los offset y convierte en decimal los bytes

512
8
786432

Pero leyendo los datos que me arroja buffer, no logro encontrar esa informacion

Me gustaria saber si alguien aqui podria ayudarme a encontrar la manera de saber donde se encuentran esos offset y como debo buscarlos para despues cambiar de hexadecimal a decimal

espero me puedan ayudar

salu2



#include <Windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>

#define zwpath L"\\\\.\\PhysicalDrive0"

int main(int argc, char *argv[]){

HANDLE hDevice;
OVERLAPPED overlapped;
BYTE buff[1024] = {0};
DWORD numerobyte = 0;
UINT32 ret;
ZeroMemory(&overlapped, sizeof(OVERLAPPED));

hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);

if(hDevice != INVALID_HANDLE_VALUE){

ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);


}else
{
return NULL;
}

if(ret == 0){


ret = WaitForSingleObject(hDevice,INFINITE );

switch (ret)
{
case WAIT_OBJECT_0:break;
case WAIT_TIMEOUT:break;
default:
break;
}
}
else
{
return NULL;
}

CloseHandle(hDevice);


for (int n=0; n<sizeof(buff); ++n)  
   {  
       printf("0x%02X ", buff[n]);  
   }

getchar();
}
.                                 

Belial & Grimoire

bueno ya resolvi el primer problema y parte del segundo, ya solo me queda saber como conseguir LCN of VCN 0 of the $MFT

segun una tabla algo asi debia salirme

0x30 LONGLONG 0x0400000000000000
   

sin embargo, en 0x30 me sale

0x00000C0000000000   :huh:
.                                 

x64core

Primero que nada hay que aclarar que es lo que quieres leer, la información de la estructura es del NTFS y lo que estas haciendo es leyendo solo el Master Boot Record.

Belial & Grimoire

.