assembly - Escribir código MBR
(11)
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.
Entiendo completamente que esto tendrá que estar escrito en ensamblado y dados 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 sera 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í?
Básicamente, creo que insertaré una llamada y dejaré el resto del MBR solo
¿Cómo se llamará esta llamada de 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. El código de terceros escrito en un MBR (que no sea el MBR que coloca el cargador del sistema operativo) a menudo no es bien recibido por los usuarios porque:
- los programas antivirus a menudo lo marcan como código sospechoso, porque es una técnica que los virus han usado para obtener el control de las 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 uno pueda hacer y almacenar en un MBR). Desafortunadamente, dado que no existe una forma buena y estándar de reservar esos 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.
Entonces, si decide continuar en este camino, pise con cuidado y prepárese para dolores de cabeza.
¿Por qué no hace falta decir que Windows no permite el acceso directo al disco? La página de MSDN para CreateFile () dice esto:
El acceso directo al disco o a un volumen está restringido. Para obtener más información, consulte "Cambios en el sistema de archivos y la pila de almacenamiento para restringir el acceso directo al disco y el acceso directo al volumen en Windows Vista y en Windows Server 2008" en la Base de conocimiento de Ayuda y soporte en 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 de esta manera.
KB942448 explica las restricciones, y parecen permitir un proceso con suficientes privilegios para escribir en el MBR o en un sector de inicio de partición.
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 firma, 446 bytes en el sector están disponibles para que los use como su programa de arranque, ¡pero el programa de arranque debe ajustarse por completo a 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 hayas cargado lo suficiente en ram para ejecutar tu programa, salta a él y listo.
Así es como un sistema operativo literalmente "se jala por sí mismo"
Ver http://en.wikipedia.org/wiki/Master_boot_record
Ahora, no hay ninguna razón por la que no pueda escribir el código de inicio en C o C ++ (o en 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 del disco en 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 forma más fácil de probar el código probablemente será colocarlo en un disquete y arrancarlo.
Para responder a su pregunta original, podría conservar una copia de seguridad del MBR anterior en algún lugar, y su nuevo MBR podría cargar su función en RAM, ejecutarla, luego cargar el MBR original y ejecutarlo, permitiendo que Windows continúe arrancando.
Además, Michael Burr tiene razón, lograr lo que quieres hacer va a ser una pesadilla.
En respuesta a su comentario sobre cómo escribir esto en el disco duro, existen 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.
Hay varias formas de escribir en el sector de arranque de un disco, y hay una referencia general que utilicé cuando estaba experimentando con el desarrollo del sistema operativo homebrew: http://wiki.osdev.org/
Yo personalmente arranque solo en Linux y uso dd:
Respaldo primero
dd if = / dev / sda de = ~ / windows_bootloader.bin bs = 512 count = 1
Desmontar el gestor de arranque
ndisasm -b16 -o7C00h ~ / windows_bootloader.bin> ~ / windows_bootloader.asm
Haz tus modificaciones y vuelve a armar
nasm ~ / windows_bootloader.asm -f bin ~ / modified_bootloader.bin
Sobrescribir el gestor de arranque
dd if = ~ / modified_bootloader.bin of = / dev / sda bs = 512 count = 1
Esto supone que tu ''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 entonces podría sobrescribir más que el primer sector si el binario de salida> 512 Bytes)
Obviamente, no vas 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 ha dicho Michael Burr, esta será probablemente 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.
Podrías mirar a 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.
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 (¡use con precaución! :)) http://mh-nexus.de/en/hxd/
Como punto de partida, se obtendría el MBR del que está disponible la fuente, 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.
Creo que tu mejor forma es con linux, tiene nasm
para compilar, dd
para copiar en clúster (lo que también significa MBR) e incluso un menú de cargador de arranque ( lilo
por ejemplo) si no quieres jugar con tus particiones reales .
Tuve que hacer mi propia secuencia de arranque el año pasado. Básicamente, tuve esto:
LILO boot menu:
-> WindowsXP
-> linux
Quería hacer algo por separado en un MBR, sin afectar la instalación real, así que creé una nueva partición (pequeña) y la agregué a la lista LILO (omitiendo detalles aquí), que dio esto:
LILO boot menu:
-> WindowsXP
-> linux
-> TESTMBR
De esa forma, dado que cada partición tiene su propio MBR, podría poner cualquier código malicioso que quisiera allí sin el riesgo de bloquearme (lo cual es un poco molesto de arreglar).
Para cambiar realmente ese MBR, hice esto:
- Copia de seguridad MBR real, por ejemplo,
dd if=/dev/sda3 of=/home/you/mbr−backup count=1
- Editar código en un archivo: boot.asm
- Compilar con nasm:
nasm boot.asm -o boot.bin -f bin
corrigiendo si hay errores - Copie el MBR recién creado en la unidad:
dd if=boot.bin of=/dev/sda3
- Reiniciar.
- Elija TESTMBR en el menú.
- Ver cómo va.
Claro, puedes hacerlo directamente en el MBR del disco en lugar del MBR de la partición, como hice aquí, pero en mi caso fue más práctico.
Con respecto al salto de código real de MBR, necesitarás 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.
Si puede hacer que un disquete, un CD o un dispositivo de memoria se inicien en el símbolo del sistema de MS y tengan 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: use el comando r para cambiar los valores de registro. establezca ax en 0201 para lectura, o 0301 para escritura. establecer es: bx a la dirección de inicio de la memoria (buffer) 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 en 0080 para el primer disco duro físico.
utilice el comando "a" para ensamblar una línea de código: INT 13h
use el comando "p" para continuar. 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.
¿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.
Windows tiene una "depuración" de utilidad no documentada 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,
Encontré una pregunta similar que puede ayudar:
Sin embargo, es posible que desee elaborar sobre lo que planea 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 todo esto desde Windows, estoy un poco despistado. Casi toda mi experiencia en programación hasta este punto ha sido en un entorno Unix.