Autor
|
Tema: Escribir en MBR (Leído 16,402 veces)
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 875
|
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!
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
¿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. 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.
|
|
« Última modificación: 22 Octubre 2013, 22:06 pm por cpu2 »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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. 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. 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. 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).
|
|
« Última modificación: 22 Octubre 2013, 22:13 pm por Eternal Idol »
|
En línea
|
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
Desconectado
Mensajes: 1.908
|
@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.
|
|
|
En línea
|
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
#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 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‹ôÍaasOt2äŠ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 ?
|
|
« Última modificación: 22 Octubre 2013, 23:32 pm por Vaagish »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Igual que un editor hex primero (0x%.2X) pero deberia tener codigo de 16 bits directamente igual asi que buscate un desensamblador para continuar.
|
|
|
En línea
|
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
Desconectado
Mensajes: 875
|
El Ida sirve? Le puedo mandar "reensamblar" este txt?
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
¿No es mas rapido probar uno mismo? Como .com parece ir bien.
|
|
|
En línea
|
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
Desconectado
Mensajes: 875
|
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? :/
|
|
« Última modificación: 23 Octubre 2013, 00:47 am por Vaagish »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Escribir un .txt con vb
Programación Visual Basic
|
Xrage
|
7
|
9,321
|
11 Junio 2005, 13:24 pm
por p0w3r f1y
|
|
|
Escribir anónimos
« 1 2 »
Sugerencias y dudas sobre el Foro
|
Ertai
|
10
|
4,988
|
19 Junio 2005, 21:03 pm
por MinusFour
|
|
|
Escribir .ini
Programación Visual Basic
|
& eDu &
|
6
|
2,966
|
25 Mayo 2008, 01:29 am
por naderST
|
|
|
Escribir en /dev/mem
Programación C/C++
|
>FedeX<
|
6
|
3,980
|
10 Febrero 2011, 20:43 pm
por >FedeX<
|
|
|
Escribir CSS en PDF ? (resuelto)
PHP
|
Diabliyo
|
5
|
3,448
|
12 Abril 2014, 18:19 pm
por Diabliyo
|
|