Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eternal Idol

#1611
ASM / Re: Escribir en MBR
23 Octubre 2013, 09:13 AM
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.
#1612
ASM / Re: Escribir en MBR
23 Octubre 2013, 01:37 AM
De nadas  ::)

Creo que solo le cambie esto:
#define BUFFERSIZE 512
ReadFile(hDevice, ReadBuffer, BUFFERSIZE, &dwBytesRead, NULL);
#1613
ASM / Re: Escribir en MBR
23 Octubre 2013, 00:46 AM
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.
#1614
ASM / Re: Escribir en MBR
23 Octubre 2013, 00:34 AM
¿No es mas rapido probar uno mismo? Como .com parece ir bien.
#1615
ASM / Re: Escribir en MBR
22 Octubre 2013, 23:47 PM
Igual que un editor hex primero (0x%.2X) pero deberia tener codigo de 16 bits directamente igual asi que buscate un desensamblador para continuar.
#1616
ASM / Re: Escribir en MBR
22 Octubre 2013, 22:10 PM
Cita de: Vaagish en 22 Octubre 2013, 21:48 PM
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.

Cita de: cpu2 en 22 Octubre 2013, 22:03 PM
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.

Cita de: cpu2 en 22 Octubre 2013, 22:03 PMCreo 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).
#1617
ASM / Re: Escribir en MBR
22 Octubre 2013, 21:23 PM
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  :silbar:
#1618
Programación C/C++ / Re: mciSendString
22 Octubre 2013, 17:45 PM
Lee la referencia de la API en la MSDN primero:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757161%28v=vs.85%29.aspx

Si el valor de retorno es diferente de 0 quiere decir que hubo un error (seria una buena idea que le asignaras el valor a una variable cosa que ahora no haces), entonces llama a mciGetErrorString para que te de una cadena descriptiva del mismo.

Tambien podes ver cual es el error por su valor:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757153%28v=vs.85%29.aspx
#1619
http tortuga, https perfecto.
#1620
ASM / Re: Escribir en MBR
22 Octubre 2013, 10:13 AM
Cita de: cpu2 en 22 Octubre 2013, 00:55 AM
Tambien tienes la opcion en ASM de usar la direccion 0x7c00, en ring0 claro.

Cualquier cosa de estas que hagas en ring0, podrias compartirla si quieres.

¿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 ...

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%29