Escribir en MBR

Iniciado por Vaagish, 19 Octubre 2013, 23:12 PM

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

Eternal Idol

No tiene ninguna similitud en realidad, es simplemente un enfoque errado al asunto. Si, obviamente que el driver del disco sera llamado para tus IRPs (lee sobre esto, es algo basico en WDM y te va a servir para entender un poco mas el asunto). Un modulo de modo Kernel trabaja al mismo nivel de privilegios que el S.O. y puede ejecutar rutinas no relacionadas con un dispositivo.

Despues de CreateFile podes usar WriteFile para escribir, aca lo que tenes que aprender primero es la API de Windows ...

¿Queres ver una MBR? Hace un programa con CreateFile y ReadFile  :silbar:
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Genial! Capto.. voy a probar leer el mbr entonces, seria un buen comienzo para después escribirle.. (igual me queda la duda en que dirección, pero supongo me falta entender como funciona para eso..)
El IRP según leí, es una estructura que encapsula un "I/O request packet",, necesario para la comunicación de drivers (entre drivers solamente??)
Bueno, voy a poner manos a la obra! Tnks!

cpu2

#12
Cita de: Eternal Idol en 22 Octubre 2013, 10:13 AM
¿Vos probaste esto? No te olvides que toda la memoria que manejas directamente es virtual (esa que mencionas es una direccion fisica) y no estas trabajando en modo Real sino en modo protegido o largo. Mas alla de esto que es elemental la BIOS lee de un disco la MBR poniendola en MEMORIA RAM, modificar esa memoria no afecta a los datos del disco ...

Me explique fatal, no escribi nunca tampoco tengo la necesidad de hacer algo asi, pero si la e leido en ring0 sin ningun tipo de funcion. Supongo que tambien se podra escribir en esas direcciones, pero lo que tu me dices es que luego se perderan los datos ya que es una direccion virtual.

Cita de: Vaagish en 22 Octubre 2013, 21:04 PM
Por lo que vengo entendiendo, para comunicarse con el disco, lo hace de igual manera que se comunica una aplicación con un driver, no? O es que en realidad estoy llamando a algún driver?
Una duda que tengo con los drivers es si siempre es necesario "hablar" de un dispositivo,, o sea,, los drivers solo sirven para la comunicación con hardware, o puedo ejecutar en un driver una rutina cualquiera? (Hacer alguna cuenta, inyectar algo, etc..)

Creo que si, porque no podrias escribir una rutina strlen o lo que sea, en un controlador. Algunos codigos que e leido son funciones que luego se comunican con los puertos I/O.

Un saludo.

Eternal Idol

#13
Cita de: Vaagish en 22 Octubre 2013, 21:48 PM
Genial! Capto.. voy a probar leer el mbr entonces, seria un buen comienzo para después escribirle.. (igual me queda la duda en que dirección, pero supongo me falta entender como funciona para eso..)
El IRP según leí, es una estructura que encapsula un "I/O request packet",, necesario para la comunicación de drivers (entre drivers solamente??)
Bueno, voy a poner manos a la obra! Tnks!

Mas que una direccion es un offset donde queres leer y escribir, pensalo como un disco o archivo, no como memoria RAM. Por cierto, tenes que trabajar por sectores a ese nivel.

Cita de: cpu2 en 22 Octubre 2013, 22:03 PM
Me explique fatal, no escribi nunca tampoco tengo la necesidad de hacer algo asi, pero si la e leido en ring0 sin ningun tipo de funcion. Supongo que tambien se podra escribir en esas direcciones, pero lo que tu me dices es que luego se perderan los datos ya que es una direccion virtual.

No, no se pierden por ser una direccion virtual, en este caso la que vos mencionas es una direccion fisica. El punto es que no esta mappeado a RAM el disco sino que la BIOS accedio a el en durante el boot, leyo ese sector y lo escribio en memoria. ¿Podes escribir en esa memoria? Si. ¿Tendra algun efecto en el disco? No, en lo absoulto. Si podes escribir en el disco como lo hace la BIOS (con ins y outs) pero no tiene sentido, para eso esta el S.O. y los drivers, para abstraer el hardware.

Cita de: cpu2 en 22 Octubre 2013, 22:03 PMCreo que si, porque no podrias escribir una rutina strlen o lo que sea, en un controlador. . Algunos codigos que e leido son funciones que luego se comunican con los puertos I/O.

Si podes perfectamente, hasta el Kernel exporta strlen, aunque normalmente se trabaja en Unicode. No todos los modulos de modo Kernel son drivers (controladores de hardware), el ejemplo clasico es un filtro o un sistema de archivos (el NTFS no trabaja a nivel de sectores, para eso estara por debajo el driver de disco).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

@cpu2: He vistov varios post tuyos refiendote a ASM como el unico capaz de hacerlo,  C/C++ se puede hacer el 95-98% de todo
lo que ASM puede hacer en cuanto a escribir codigo. Cuando se habla de este tipo de asuntos, no importa el lenguaje en el se haga,
este tema puede estar en la sección C/C++, Delphi, etc.
aunque generalmente se pone cuando se supone que el lenguaje que se esta usando es ASM como en este caso o a menos que te estes
refiriendo a modo real, aunque a pesar de eso, se podria tener un tema en la sección C/C++ acerca de modo real si tu compilador es capaz
de generar codigo para modo real. Simplemente estoy aclarando.
Además, Para escribir desde modo kernel se mapea la direccion fisica y se escribe.

Vaagish

#15
Código (cpp) [Seleccionar]

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <iostream>
using namespace std;

#define wszDrive L"\\\\.\\PhysicalDrive0"
#define BUFFERSIZE 8192

int wmain(int argc, wchar_t *argv[]){

HANDLE hDevice = INVALID_HANDLE_VALUE;
DWORD  dwBytesRead = 0;
   char   ReadBuffer[BUFFERSIZE] = {0};
FILE *File;

hDevice = CreateFileW(wszDrive, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if (hDevice == INVALID_HANDLE_VALUE){
return (FALSE);
}

ReadFile(hDevice, ReadBuffer, BUFFERSIZE-1, &dwBytesRead, NULL);

File = fopen("c://MBR.txt","w");
for(int i=0; i<=BUFFERSIZE-1; i++){
fprintf(File, "%c", ReadBuffer[i]);
}

fclose(File);
return 0;
}


MBR.txt
Citar
3ÀŽÐ¼ |ûPPü¾|¿PW¹åó¤Ë½¾±8n |   uƒÅâôÍ‹õƒÆIt8,tö µ´‹ð¬< tü» ´ÍëòˆNèF s*þF€~ t €~ t ¶uÒ€FƒFƒV
è! s ¶뼁>þ}Uªt €~ tÈ ·ë©‹üW‹õË¿ ŠV ´Ír#ŠÁ$?˜ŠÞŠüC÷ã‹Ñ†Ö±ÒîB÷â9V
w#r9Fs¸» |‹N‹V ÍsQOtN2äŠV ÍëäŠV `»ªU´AÍr6ûUªu0öÁt+a`j j ÿv
ÿvj h |jj´B‹ôÍaasOt 2äŠV ÍëÖaùÃTabla de partici¢n no v lida Error al cargar el sistema operativo Falta el sistema operativo

Bueno, algo estoy leyendo.. podria representarlo de una forma mas clara esto ?

Eternal Idol

Igual que un editor hex primero (0x%.2X) pero deberia tener codigo de 16 bits directamente igual asi que buscate un desensamblador para continuar.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

El Ida sirve? Le puedo mandar "reensamblar" este txt?

Eternal Idol

¿No es mas rapido probar uno mismo? Como .com parece ir bien.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

#19
Si, pero hay algo que no estoy entendiendo, al fprintf le pongo este formato: "0x%.2X", eso me da un montón de hexadecimales,, y eso lo paso por el IDA (por ejemplo), para reensamblar el código, y así ver que hace el MBR en ensamblador, pero todo esto, es en 16 bits?

Y otra cosa,, si pongo el buffer de lectura como tamaño máximo 512 bytes, no lee nada.. no se supone estoy en el offset 0 del disco, donde hay código maquina? y son unos 446 bytes? :/