2009-02-20 6 views
10

Soy un ingeniero eléctrico que recientemente descubrió la necesidad de modificar el código en el MBR. Básicamente, necesito la capacidad de ejecutar código en la unidad de disco duro antes, el sistema operativo se inicia y se hace cargo.Escribir código MBR

Entiendo completamente que esto deberá escribirse en Ensamblaje y teniendo en cuenta los 446 bytes más o menos de espacio de código en el MBR, solo espero llamar a otro código fuera del MBR. Mi pregunta es ¿cuál es la mejor manera de escribir en el MBR? Si quiero modificar el MBR de, por ejemplo, el disco HDD_1 ... ¿Es mejor esclavizar HDD_1 en otra máquina y luego escribir en él, o escribir en él directamente (fuera de las ventanas) en la máquina actual? Básicamente, creo que insertaré una llamada y dejaré el resto del MBR solo.

Cualquier sugerencia sería apreciada

Chris

soy muy consciente de que esto va a ser difícil. Mi PREGUNTA es, ¿cuál es la mejor manera de poner una instrucción en el MBR? No hace falta decir que Windows no permite el acceso directo al disco. ¿Cómo sugeriría que escriba instrucciones en el MBR? ¿Tal vez está arrancando un CD en vivo de * nix y está escribiendo en el MBR desde allí?

+0

Soy muy consciente de que esto va a ser difícil. Mi PREGUNTA es, ¿cuál es la mejor manera de poner una instrucción en el MBR? No hace falta decir que Windows no permite el acceso directo al disco. ¿Cómo sugeriría que escriba instrucciones en el MBR? –

Respuesta

9

El BIOS inicia la computadora desde el disco duro (o disquete) leyendo el primer sector (512 bytes) de cada dispositivo de arranque y comprobando un conjunto específico de bytes de firma. Si se encuentran esos bytes, el sector de 512 bytes se copia al ram (en una posición específica) y el BIOS salta para ejecutarlo.

Aparte de los bytes de la firma, 446 bytes en el sector están disponibles para su uso como su programa de arranque, ¡pero el programa de arranque debe ajustarse por completo en ese sector! Como 446 bytes no es muy grande, tendrá que realizar llamadas al BIOS para copiar otros sectores del disco duro (o disquete, o lo que sea) en ram para ejecutarlos.

Una vez que haya cargado lo suficiente en ram para ejecutar su programa, salte a él y listo.

Eso es como un sistema operativo, literalmente "se tira por ella es propio esfuerzo"

Ver http://en.wikipedia.org/wiki/Master_boot_record

Ahora, no hay ninguna razón que no podría escribir el código de arranque en C o C++ (o la mayoría cualquier otra cosa) excepto que con el ensamblaje, usted sabe exactamente qué código se generará y es fácil hacer llamadas al BIOS.

Le sugiero que escriba una unidad de disco de 512 bytes para copiar la copiadora que carga su programa desde el disco a ram, y luego salta a la dirección de inicio de su programa. Luego puede escribir su programa en el idioma que desee. Tenga en cuenta que cuando el código de arranque comienza a ejecutarse, esos 512 bytes son lo único que puede contar como en el ram. (Bueno, el BIOS está ahí, puedes hacer llamadas al BIOS. El BIOS también colocará cierta información del sistema en ciertos lugares en ram ...) Si quieres llamar a cualquier función que hayas escrito que esté fuera de ese sector, debes cárgalos en Ram tú mismo.

Además, la manera más fácil de probar su código probablemente será colocarlo en un disquete y arrancarlo.

Para responder a su pregunta original, podría guardar una copia de seguridad del MBR anterior en algún lugar, y su nuevo MBR podría cargar su función en RAM, ejecutarlo, cargar el MBR original y ejecutarlo, permitiendo que Windows continúe arrancando .

Además, Michael Burr tiene razón, hacer lo que quiere hacer va a ser una pesadilla.

En respuesta a su comentario acerca de cómo escribir esto en el disco duro, hay varios programas de "escritura en bruto" que pueden copiar a un sector en el disco. Además, puede arrancar desde un CD live de Linux y usar dd para escribir sus datos en el sector de su elección en el dispositivo de bloques de su elección. - Simple como pie esa parte.

2

me encontré con una pregunta similar que puede ayudar:

Modifying the MBR of Windows

Sin embargo, es posible que desee dar más detalles sobre lo que va a hacer. Como he descubierto, el código del bootloader puede ser bastante tedioso para trabajar con él. Además, ciertamente probaría esto con un disquete si es posible.

En cuanto a hacer esto todo desde Windows, estoy un poco despistado. Casi toda mi experiencia en programación hasta este punto ha sido en un entorno Unix.

5

Básicamente Figura Voy a insertar una llamada y dejar el resto del MBR solo

lo que se llamará por esta llamada a subrutina? El único código en la memoria en ese punto es lo que está en el MBR o ROM.

Por favor, piense cuidadosamente si realmente necesita esto o si no hay una mejor alternativa antes de dedicarle demasiado tiempo. código de terceros escriben en un MBR (que no sea el MBR que el cargador del sistema operativo pone allí) a menudo no es bien recibida por los usuarios debido a que:

  • antivirus menudo marcarlo código como sospechoso, porque es un virus técnica han utilizado para obtener el control de máquinas
  • los programas han utilizado la técnica de insertarse en un MBR y almacenar códigos y datos adicionales en sectores 'reservados' del disco (porque realmente no hay mucho que se pueda hacer y almacenar en un MBR) . Desafortunadamente, dado que no existe una forma buena y estándar de reservar estos sectores, esta técnica (a veces utilizada para la protección contra copias) puede dañar las estructuras de datos en el disco (es decir, todos los datos en la unidad se desprenden). Los usuarios realmente odian eso. Creo que en un momento dado Quicken usó un esquema de protección que hizo algo como esto y se enfrentó a una gran reacción violenta.

Si decide seguir por este camino, pise con cuidado y prepárese para los dolores de cabeza.

+0

De hecho, el código de virus del sector de arranque puede ser un buen punto de partida. De todos modos, es bastante inofensivo ya que tan pronto como Windows se hace cargo mata todo lo que se ejecuta en modo real (modo Real? Lo que no está protegido por debajo del límite de 640K) por lo que no hay que infectar la computadora. –

4

¿Por qué no hace falta decir que Windows no permite el acceso directo al disco? La página de MSDN para dice esto:

acceso directo al disco o para un volumen está restringido. Para obtener más información, ver "Los cambios en el sistema de archivos y a la pila de almacenamiento a restringen el acceso a disco directo y acceso directa de volumen en Windows Vista y en Windows Server 2008" en la Ayuda y Soporte Base de al http://support.microsoft.com/kb/942448 .

Windows Server 2003 y Windows XP/2000: el acceso directo al disco o a un volumen no está restringido en esta forma .

KB942448 explica las restricciones, y parece que permitir que un proceso con privilegios suficientes para escribir en el MBR o para un sector de inicio de partición.

1

Puede consultar GRUB. De ninguna manera soy un experto en el código MBR y ha pasado mucho tiempo desde que ejecuté un sistema operativo * nix, pero recuerdo que el gestor de arranque trabajó en etapas y cargó las etapas desde el disco antes de que comenzara el sistema operativo. Puede escribir su propia etapa para hacer el trabajo que necesita antes de cargar el sistema operativo y luego iniciar el sistema operativo. No estoy seguro de cuán práctica es esta opción, particularmente porque el código parece estar en medio de una reescritura porque la versión "heredada" no se podía mantener de acuerdo con la documentación.

20

Hay varias formas de escribir el sector de arranque de una unidad, y hay una referencia general utilicé cuando yo estaba experimentando con el desarrollo del sistema operativo homebrew: http://wiki.osdev.org/

yo personalmente solo arranque en Linux y el uso dd :

  1. de copia de seguridad primero

    dd if =/dev/sda de = ~/windows_bootloader.bin bs = 512 count = 1

  2. Desmontar el cargador de arranque

    ndisasm -b16 -o7C00h ~/windows_bootloader.bin> ~/windows_bootloader.asm

  3. Haga sus modificaciones y volver a montar

    nasm ~/bin windows_bootloader.asm -f ~/modified_bootloader .bin

  4. Sobrescribir el gestor de arranque

    dd if = ~/modified_bootloader.bin of =/dev/sda bs = 512 count = 1

Esto asume que 'sda' es el dispositivo de bloque correcto. Y tenga en cuenta que el paso 4 no solo copia el archivo en/dev/sda (lo cual podría, pero puede sobrescribir más que el primer sector si el binario de salida> 512 Bytes)

Obviamente está no va a querer depurar este enfoque en un sistema en vivo. Le ahorrará muchos dolores de cabeza usar algún tipo de emulador x86 como bochs, qemu o VMWare Server.

Sin embargo, como Michael Burr ha declarado, esto probablemente será una mala idea. La modificación del gestor de arranque de Windows probablemente te deje poco o ningún espacio para tu propio código.

+3

Upvoted para el enlace a wiki.osdev ... ¡Acabo de pasar una hora allí en vez de codificar! –

+0

¡Me encanta! Simple y fácil. – GTodorov

1

La edición del MBR es perfectamente posible desde Windows (XP). Para esto se usa el editor hexadecimal HxD, puede literalmente copiar y pegar un archivo hexadecimal sobre el MBR, incluso en su unidad de sistema activa (¡con precaución! :)) http://mh-nexus.de/en/hxd/

Como punto de partida, obtendría el MBR de los cuales la fuente está disponible, por ejemplo, Grub. (Deje que grub haga el booteo a Windows) Con esto, tiene un buen punto de partida para hacer los cambios en su MBR. Editar el MBR no debería ser demasiado difícil, ya que este pequeño software es bastante básico. Sin embargo, algunas habilidades de ensamblador de 16 bits (DOS) son necesarias.Otra forma es dejar que grub ejecute algo de carga adicional y no cambie el MBR, pero estoy 100% seguro de que esto es posible; por favor refiérase a los manuales de Grub.

2

Creo que su mejor manera es con Linux, tiene nasm para compilar, dd para copiar cluster (lo que significa MBR también), e incluso un menú del gestor de arranque (lilo por ejemplo) si no quiere perder con tus particiones reales

Tuve que hacer mi propia secuencia de arranque el año pasado. Básicamente, tenía esto:

LILO boot menu: 
    -> WindowsXP 
    -> linux 

que quería hacer algo por separado en un MBR, sin afectar a instalar el real, así que creé una nueva partición (pequeño) y añadí que a la lista de LILO (omitiendo detalles aquí) , lo que dio esto:

LILO boot menu: 
    -> WindowsXP 
    -> linux 
    -> TESTMBR 

de esa manera, ya que cada partición tiene su propio MBR, así, que podría poner cualquier código whacky quería allí sin el riesgo de bloquear a mí mismo (que es un poco molesto para fijar)

para cambiar realmente que MBR Hice esto:

  1. copia de seguridad real MBR, por ejemplo dd if=/dev/sda3 of=/home/you/mbr−backup count=1
  2. Edición de código en un archivo: boot.asm
  3. compilar con nasm: nasm boot.asm -o boot.bin -f bin corregir errores si
  4. Copie el MBR recién creado en la unidad: dd if=boot.bin of=/dev/sda3
  5. Reinicie.
  6. Elija TESTMBR en el menú.
  7. Vea cómo funciona.

Claro, puedes hacerlo directamente en el MBR del disco en lugar del MBR de la partición como hice aquí, pero para mi caso fue más práctico.

Con respecto al salto de código real de MBR, necesitará usar la interrupción INT 13,42, que carga cualquier clúster en un disco. Para el propósito de mi prueba solo tuve que mostrar su contenido, pero puedo mirar más de cerca si quieres.

Espero que pueda ayudar, perdón por la larga respuesta.

2

Si puede hacer que un disquete, un CD o un dispositivo de memoria se inicie en un símbolo del sistema de MS y tenga una versión correspondiente de MS debug, puede leer y escribir en el MBR como se muestra a continuación. Una máquina que ejecute win95 o win98 debería poder crear un disquete de arranque para usted. Simplemente copie la depuración desde el directorio de Windows \ command al disquete.

depuración interna: utilice el comando r para cambiar los valores de registro. establece ax a 0201 para lectura, o 0301 para escritura. establece es: bx a la dirección de inicio de la memoria (búfer) que desea utilizar. 0000: 7C00 podría funcionar, ya que generalmente es el área en la que se lee el siguiente sector en el proceso de arranque. configure cx a 0001 para leer/escribir un sector de 512 bytes. establece dx a 0080 para el primer disco duro físico.

utiliza el "a" comando para montar la una línea de código: INT 13h

uso el comando "p" para proceder. Los datos serán leídos o escritos, según su elección de AX.

Puede leer en la memoria, "n" para nombrar un archivo, "w" para escribir el archivo, y luego editar una copia del mbr en algún otro programa. Una vez completo, use "n" y "L" de depuración para nombrar y cargar el archivo MBR editado, y llame a int 13h utilizando ax = 0301h para escribir la imagen en el sector correcto.

2

¿Estás seguro de que necesitas escribir el MBR? En un disco con particiones, también puede modificar el VBR de la partición (Volume Boot Record). Eso puede ser más fácil/más seguro, ya que no necesita tocar el MBR y su máquina todavía podrá arrancar desde otras particiones (y sistema operativo), incluso si destruye totalmente su partición de prueba.

0

Windows tiene una utilidad no documentada "depuración" que permite: 1) cargar cualquier sector (incluido mbr) de disco duro a ram. 2) vea ese código como binario o ensamblador. 3) Arme un código en ram.4) escriba ese código en cualquier sector (también mbr). Para iniciar esta utilidad, escriba debug at command promt, presione enter. La solicitud cambia a "-". Luego escribe "ayuda". obtienes información sobre cómo usarlo,

Cuestiones relacionadas