Autor
|
Tema: Escribir en MBR (Leído 16,328 veces)
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
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? Vaagish: 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%29Seria muy bueno que leyeras el enlace ese ... 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 movsbseg000:0117 push ax seg000:0118 push 61Chseg000:011B retf http://faydoc.tripod.com/cpu/movsb.htmMOVSB 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.
|
|
« Última modificación: 23 Octubre 2013, 09:14 am 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
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
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!
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
De nadas Creo que solo le cambie esto: #define BUFFERSIZE 512 ReadFile(hDevice, ReadBuffer, BUFFERSIZE, &dwBytesRead, NULL);
|
|
|
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
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
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. @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.
|
|
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.
|
|
|
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
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
@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.
|
|
|
En línea
|
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
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.. Si, 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? Se 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.. 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. 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...
|
|
« Última modificación: 23 Octubre 2013, 20:47 pm 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,298
|
11 Junio 2005, 13:24 pm
por p0w3r f1y
|
|
|
Escribir anónimos
« 1 2 »
Sugerencias y dudas sobre el Foro
|
Ertai
|
10
|
4,975
|
19 Junio 2005, 21:03 pm
por MinusFour
|
|
|
Escribir .ini
Programación Visual Basic
|
& eDu &
|
6
|
2,949
|
25 Mayo 2008, 01:29 am
por naderST
|
|
|
Escribir en /dev/mem
Programación C/C++
|
>FedeX<
|
6
|
3,973
|
10 Febrero 2011, 20:43 pm
por >FedeX<
|
|
|
Escribir CSS en PDF ? (resuelto)
PHP
|
Diabliyo
|
5
|
3,431
|
12 Abril 2014, 18:19 pm
por Diabliyo
|
|