Escribir en MBR

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

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

Eternal Idol

#20
Cita de: Vaagish en 23 Octubre 2013, 00:40 AM
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?

Cita de: Eternal Idol en 22 Octubre 2013, 10:13 AMVaagish: mira que lo que hay en la MBR es codigo de 16 bits ... no esperes que sea capaz de llamar a la API de Windows para ejecutar un programa tuyo ... CreateFile con OPEN_EXISTING como dice la documentacion es lo que tenes que hacer.

http://wiki.osdev.org/MBR_%28x86%29

Seria muy bueno que leyeras el enlace ese ...


Cita de: Vaagish en 23 Octubre 2013, 00:40 AM
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? :/

Si lees el tamaño del buffer sin restarle -1 podes leer un sector.

Y ya que estamos, con mi MBR.com en IDA, arrancamos con el enlace de arriba:

Typical MBR bootstrap code will do the following:
relocate itself away from the 0x7c00 physical address (using a memory copy, and usually a far jump)

seg000:0100                 public start
seg000:0100 start:
seg000:0100                 xor     ax, ax
seg000:0102                 mov     ss, ax
seg000:0104                 assume ss:seg000
seg000:0104                 mov     sp, 7C00h
seg000:0107                 mov     es, ax
seg000:0109                 assume es:seg000
seg000:0109                 mov     ds, ax
seg000:010B                 mov     si, 7C00h
seg000:010E                 mov     di, 600h
seg000:0111                 mov     cx, 200h
seg000:0114                 cld
seg000:0115                 rep movsb
seg000:0117                 push    ax
seg000:0118                 push    61Ch
seg000:011B                 retf

http://faydoc.tripod.com/cpu/movsb.htm
MOVSB    Move byte at address DS:SI to address ES:DI

61Ch es justamente el codigo que sigue a retf.

PD. Si, habria que ponerlo en 7C00 pero la verdad es que soy mas de WinDbg y no domino muy bien el IDA.
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

Gracias por tu tiempo Eternal! Voy a investigar mejor.. mi MBR.com sale malo.. algo estoy haciendo mal,, cuando llegue a casa veo que es..

Tnks again!

Eternal Idol

De nadas  ::)

Creo que solo le cambie esto:
#define BUFFERSIZE 512
ReadFile(hDevice, ReadBuffer, BUFFERSIZE, &dwBytesRead, NULL);
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

cpu2

Cita de: Eternal Idol en 22 Octubre 2013, 22:10 PM
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.

Pues es lo que pretendo en futuros codigos que escriba en ring0, nada de funciones ni de syscall, creare yo las funciones y las comunicaciones de hardware con in y out.

Cita de: x64Core en 22 Octubre 2013, 22:11 PM
@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.

Si, pero con ASM siempre puedes optimizar al maximo el codigo, y como no saber 100% lo que estas haciendo.

@Vaagish

Bueno creo que con la explicacion de EI es bastante. Del 0x0 - 0x1ff que sumando el ultimo byte son 512 bytes, se cargan en la direccion 0x7c00 si creas algo en ring0 y recorres esta direccion veras que es el mismo codigo que aparecen en los offset del 0x0 - 0x1ff.

Si quieres algun fragmento de la MBR de OpenBSD dimelo, es algo distinta, menos los dos ultimos bytes que seran igual que tu MBR, 0x55,0xaa.

Un saludo.

x64core

Cita de: cpu2 en 23 Octubre 2013, 02:24 AM
Pues es lo que pretendo en futuros codigos que escriba en ring0, nada de funciones ni de syscall, creare yo las funciones y las comunicaciones de hardware con in y out.

Si, pero con ASM siempre puedes optimizar al maximo el codigo, y como no saber 100% lo que estas haciendo.

Apuesto 95% de todas las ocasiones que uno programa si comparamos un codigo escrito en ensamblador por nosotros mismo con el de
uno generado por VC++ (ejemplo), el del compilador sera mucho más rapido y más en proyectos grandes donde se requiere de miles de lineas de ensamblador.
Toma en cuenta que el compilador variables locales y utiliza los registros tanto como se pueda, optimiza los jcc's, acceso de memoria,etc. Pero a pesar de eso me gustaria ver que grandes optimizaciones hay en tus programas escritos en ensamblador.

Y Quizas te referis a lo que uno lee acerca de escribir en ensamblador a como funcionan las cosas internamente pero eso no quiere decir
que escribir en C/C++ no sepas que es lo que estas haciendo.

-

Para saber el tamaño exacto de cada sector se parsea el MBR, asi como para obtener la informacion acerca de los cabezales,cilindros y demás informacion.
Aunque el tamaño es de 512 bytes por sector. Además, si se quiere cargar y depurar el MBR pues se puede usar IDA+bochs.
Ahi hay un proceso algo largo ya depuesta de saber como funciona simplemente se escribe el codigo del MBR el cual queres depurar.

Si se quiere depurar el proceso de arraque de un SO (MBR...etc), se puede usar IDA+GDB.
Se prepara la maquina virtual, se añade IDA al proceso de la maquina virtual, bp -> 0x7C00, a depurar.
Y el lo mismo si quieres depurar la BIOS/UEFI,VBR,IPL,etc

Eternal Idol

Cita de: cpu2 en 23 Octubre 2013, 02:24 AM
Pues es lo que pretendo en futuros codigos que escriba en ring0, nada de funciones ni de syscall, creare yo las funciones y las comunicaciones de hardware con in y out.

Cuidado con la sincronizacion si lo haces bajo un S.O. en funcionamiento.

Y vuelvo a coincidir con x64Core, parece haber grandes mitos con assembly y la realidad es que en la amplia mayoria de las veces ni siquiera es necesario.
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

cpu2

@x64Core

Creo que malinterpretaste mi mensaje, yo no dije que un programador de C/C++ no supiera lo que esta haciendo, solo dije que con ASM te obliga a saber que hacen las instrucciones y los cambios internos en la maquina nada mas, los lenguajes de alto nivel y los libros de estos no me gustan, simplemente es una opinion y gusto personal  nada mas.

Y sobre el compilador y que te gustaria ver esas grandes optimizaciones que escribo, no se si eso ultimo era una ironia...
Podriamos seguir hablando por privado para no desviar este hilo.

@EI

Quiero saber mas sobre la sincronizacion, un ejemplo seria cuando la ethernet a establecido mas de una conexion, yo podria tener ese problema por lo que veo.

Un saludo.

Vaagish

#27
Chicos, creo que pregunte por algo que todavía me faltaba mucho por investigar.. ustedes manejan los desensambladores, y el ensamblador bastante mejor que yo, creo que pise muy ondo con esta pregunta jeje, pero eso es bueno, aunque sea a golpes contra la pared voy a aprender..

CitarSi, pero con ASM siempre puedes optimizar al maximo el codigo, y como no saber 100% lo que estas haciendo.
Yo creo que en parte es así también, supongamos que tengo una aplicación en ASM, que yo se que NO puede fallar, entonces puedo omitir algunas cosas, sin comprometer la estabilidad del programa, claro.. y quizás ahorrar algunas instrucciones que el compilador no "debe" omitir,, me explico?

CitarSe prepara la maquina virtual, se añade IDA al proceso de la maquina virtual, bp -> 0x7C00, a depurar
Esa es muy buena, pero voy a tener que aprender a depurar mejor..  :silbar:

CitarSi quieres algun fragmento de la MBR de OpenBSD dimelo, es algo distinta, menos los dos ultimos bytes que seran igual que tu MBR, 0x55,0xaa.
Si, aunque sea para ir aprendiendo en general me sirve..  (0x55, 0xAA) "Valid bootsector" signature bytes ( Ajam, compatibilidad? )

EDITADO: Listo,, ahora si pude leer el mbr,, amigos, les presento al sector 0 de mi disco duro:

seg000:7C000000 seg000          segment byte public 'CODE' use16
seg000:7C000000                 assume cs:seg000
seg000:7C000000                 ;org 7C000000h
seg000:7C000000                 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
seg000:7C000000                 xor     ax, ax
seg000:7C000002                 mov     ss, ax
seg000:7C000004                 mov     sp, 7C00h
seg000:7C000007                 sti
seg000:7C000008                 push    ax
seg000:7C000009                 pop     es
seg000:7C00000A                 push    ax
seg000:7C00000B                 pop     ds
seg000:7C00000C                 cld
seg000:7C00000D                 mov     si, 7C1Bh
seg000:7C000010                 mov     di, 61Bh
seg000:7C000013                 push    ax
seg000:7C000014                 push    di
seg000:7C000015                 mov     cx, 1E5h
seg000:7C000018                 rep movsb
seg000:7C00001A                 retf

Ahora solo me falta aprender mucho...