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

#1841
ASM / Re: Modo protegido, dolor de cabeza
4 Marzo 2013, 01:57 AM
http://en.wikipedia.org/wiki/Protected_mode
http://wiki.osdev.org/Protected_Mode
http://www.rcollins.org/articles/pmbasics/tspec_a1_doc.html

http://wiki.osdev.org/Virtual_8086_Mode

Para salir de modo Usuario (o entrar a modo Kernel) podes usar o una interrupcion o alguna de las instrucciones de llamada rapida como sysenter/syscall.

Para ejecutar un PE verdadero tenes que implementar como minimo la NTDLL.dll y para cualquier cosa normal Kernel32.dll y otras. Tendrias que hacer un Loader como el de Windows que cargue las secciones en donde corresponda, que resuelva las funciones importadas ... y mil cosas mas realmente.

http://wiki.osdev.org/Main_Page
#1842
pusha y popa ponen y sacan todos los registros generales de la pila (por eso decia antes que los preservabas, antes y despues de la llamada tendran el mismo valor de esa manera).

http://css.csail.mit.edu/6.858/2010/readings/i386/PUSHA.htm
http://css.csail.mit.edu/6.858/2012/readings/i386/POPA.htm

¿Que pasa si usas push EBX y POP EBX? ¿Funciona? Si es asi es por lo que te explique antes. Por cierto cuando haces un call tambien se mueve la pila, para poner la direccion de retorno.

PD. Si queres informacion sobre otros temas te recomiendo Google y sino el sub/foro que corresponda asi no desviamos este hilo que esta practicamente resuelto.
#1843
De nada; y bueno, vaya uno saber, sin ver el codigo nada mas se puede adivinar pero si el problema era de memoria tiene sentido que funcionara una vez. Igual la clave esta en que puedas depurar en ensamblador instruccion por instruccion tu codigo, asi vas a ver siempre donde falla exactamente.
#1844
ESP = EXTENDED STACK POINTER. Es justamente el puntero a la pila (stack).

Por lo que pude entender el problema era que tu Kernel (asumo que esta escrito en C/C++) no contaba con lo que podia pasar en la funcion a la que llamabas por lo que si el compilador usaba algun registro (en este caso deberia ser EBX) para contener un puntero por ejemplo despues al hacer el call programa ese codigo lo cambiaba y entonces ... en fin ... ahora preservas los registros y funciona.


Si tenes ganas de probar podes ver que pasa si en lugar de usar inline assembly usas C:
((void (*)(void))programa)();

Comparando el codigo ensamblador de tu Kernel podras ver si usaba EBX y si el compilador decide cambiar las cosas de alguna manera  :silbar:
#1845
No son instrucciones, no es codigo, si te fijas es una sección de solo lectura ("Read Only" dice en el output de dumpbin).

Depura instruccion por instruccion hasta ver en cual falla exactamente y ahi mira los registros, la pila, etc..
#1846
¿Ejecuta el programa sin problemas una vez? Entonces esta claro que el problema es tu sistema y no los bytes posteriores al ret que nunca se llegan siquiera a ejecutar.
#1847
Que pedazo de ...  :-X
#1848
ASM / Re: Por que se habla tanto del 8086 ?
2 Marzo 2013, 11:46 AM
Si hablamos de PCs y compatibles si. Despues hay otros microprocesadores, otras arquitecturas y otros ensambladores, pero si se habla tanto de x86 es por ser la mas extendida por lejos.
#1850
Usando dumpbin del VC++ en test.o:



Dump of file test.o

File Type: COFF OBJECT

FILE HEADER VALUES
            14C machine (x86)
              5 number of sections
              0 time date stamp Thu Jan 01 01:00:00 1970
            178 file pointer to symbol table
              E number of symbols
              0 size of optional header
            104 characteristics
                  Line numbers stripped
                  32 bit word machine

SECTION HEADER #1
  .text name
      0 physical address
      0 virtual address
     18 size of raw data
     DC file pointer to raw data (000000DC to 000000F3)
    164 file pointer to relocation table
      0 file pointer to line numbers
      1 number of relocations
      0 number of line numbers
60300020 flags
        Code
        4 byte align
        Execute Read

RAW DATA #1
 00000000: 55 89 E5 83 EC 10 C7 45 FC 00 00 00 00 31 C0 8B  U.å.ì.ÇEü....1À.
 00000010: 5D FC CD 80 C9 C3 90 90                          ]üÍ.ÉÃ..

RELOCATIONS #1
                                               Symbol    Symbol
Offset    Type              Applied To         Index     Name
--------  ----------------  -----------------  --------  ------
00000009  DIR32                      00000000         A  .rdata

SECTION HEADER #2
  .data name
      0 physical address
      0 virtual address
      0 size of raw data
      0 file pointer to raw data
      0 file pointer to relocation table
      0 file pointer to line numbers
      0 number of relocations
      0 number of line numbers
C0300040 flags
        Initialized Data
        4 byte align
        Read Write

SECTION HEADER #3
   .bss name
      0 physical address
      0 virtual address
      0 size of raw data
      0 file pointer to raw data
      0 file pointer to relocation table
      0 file pointer to line numbers
      0 number of relocations
      0 number of line numbers
C0300080 flags
        Uninitialized Data
        4 byte align
        Read Write

SECTION HEADER #4
 .rdata name
      0 physical address
      0 virtual address
     38 size of raw data
     F4 file pointer to raw data (000000F4 to 0000012B)
      0 file pointer to relocation table
      0 file pointer to line numbers
      0 number of relocations
      0 number of line numbers
40300040 flags
        Initialized Data
        4 byte align
        Read Only

RAW DATA #4
 00000000: 48 6F 6C 61 20 6D 75 6E 64 6F 20 64 65 73 64 65  Hola mundo desde
 00000010: 20 47 43 43 20 28 49 6E 74 65 6C 20 53 79 6E 74   GCC (Intel Synt
 00000020: 61 78 2C 20 70 72 6F 67 72 61 6D 61 2E 65 78 65  ax, programa.exe
 00000030: 29 20 76 32 21 00 00 00                          ) v2!...

SECTION HEADER #5
     /4 name (.eh_frame)
      0 physical address
      0 virtual address
     38 size of raw data
    12C file pointer to raw data (0000012C to 00000163)
    16E file pointer to relocation table
      0 file pointer to line numbers
      1 number of relocations
      0 number of line numbers
40300040 flags
        Initialized Data
        4 byte align
        Read Only

RAW DATA #5
 00000000: 14 00 00 00 00 00 00 00 01 7A 52 00 01 7C 08 01  .........zR..|..
 00000010: 1B 0C 04 04 88 01 00 00 1C 00 00 00 1C 00 00 00  ................
 00000020: 04 00 00 00 16 00 00 00 00 41 0E 08 85 02 42 0D  .........A....B.
 00000030: 05 52 C5 0C 04 04 00 00                          .RÅ.....


RELOCATIONS #5
                                               Symbol    Symbol
Offset    Type              Applied To         Index     Name
--------  ----------------  -----------------  --------  ------
00000020  REL32                      00000004         4  .text

COFF SYMBOL TABLE
000 00000000 DEBUG  notype       Filename     | .file
   test.c
002 00000000 SECT1  notype ()    External     | _inicio
   tag index 00000000 size 00000000 lines 00000000 next function 00000000
004 00000000 SECT1  notype       Static       | .text
   Section length   16, #relocs    1, #linenums    0, checksum        0
006 00000000 SECT2  notype       Static       | .data
   Section length    0, #relocs    0, #linenums    0, checksum        0
008 00000000 SECT3  notype       Static       | .bss
   Section length    0, #relocs    0, #linenums    0, checksum        0
00A 00000000 SECT4  notype       Static       | .rdata
   Section length   36, #relocs    0, #linenums    0, checksum        0
00C 00000000 SECT5  notype       Static       | .eh_frame
   Section length   38, #relocs    1, #linenums    0, checksum        0

String Table Size = 0x18 bytes

 Summary

          0 .bss
          0 .data
         38 .eh_frame
         38 .rdata
         18 .text



Idem en el test:

Dump of file test

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
            14C machine (x86)
              3 number of sections
       5130DE02 time date stamp Fri Mar 01 17:57:38 2013
            A00 file pointer to symbol table
             27 number of symbols
             E0 size of optional header
            307 characteristics
                  Relocations stripped
                  Executable
                  Line numbers stripped
                  32 bit word machine
                  Debug information stripped

OPTIONAL HEADER VALUES
            10B magic # (PE32)
           2.22 linker version
            200 size of code
            400 size of initialized data
              0 size of uninitialized data
       FFC10000 entry point (100010000)
       FFC10000 base of code
              0 base of data
         400000 image base (00400000 to 100011FFF)
           1000 section alignment
            200 file alignment
           4.00 operating system version
           1.00 image version
           4.00 subsystem version
              0 Win32 version
       FFC12000 size of image
            200 size of headers
           F21E checksum
              3 subsystem (Windows CUI)
              0 DLL characteristics
         200000 size of stack reserve
           1000 size of stack commit
         100000 size of heap reserve
           1000 size of heap commit
              0 loader flags
             10 number of directories
              0 [       0] RVA [size] of Export Directory
              0 [       0] RVA [size] of Import Directory
              0 [       0] RVA [size] of Resource Directory
              0 [       0] RVA [size] of Exception Directory
              0 [       0] RVA [size] of Certificates Directory
              0 [       0] RVA [size] of Base Relocation Directory
              0 [       0] RVA [size] of Debug Directory
              0 [       0] RVA [size] of Architecture Directory
              0 [       0] RVA [size] of Global Pointer Directory
              0 [       0] RVA [size] of Thread Storage Directory
              0 [       0] RVA [size] of Load Configuration Directory
              0 [       0] RVA [size] of Bound Import Directory
              0 [       0] RVA [size] of Import Address Table Directory
              0 [       0] RVA [size] of Delay Import Directory
              0 [       0] RVA [size] of COM Descriptor Directory
              0 [       0] RVA [size] of Reserved Directory


SECTION HEADER #1
  .text name
     18 virtual size
FFC10000 virtual address (100010000 to 100010017)
    200 size of raw data
    200 file pointer to raw data (00000200 to 000003FF)
      0 file pointer to relocation table
      0 file pointer to line numbers
      0 number of relocations
      0 number of line numbers
60300020 flags
        Code
        RESERVED - UNKNOWN
        RESERVED - UNKNOWN
        Execute Read

RAW DATA #1
 100010000: 55 89 E5 83 EC 10 C7 45 FC 18 00 01 00 31 C0 8B U.å.ì.ÇEü....1À.
 100010010: 5D FC CD 80 C9 C3 90 90                         ]üÍ.ÉÃ..

SECTION HEADER #2
 .rdata name
     38 virtual size
FFC10018 virtual address (100010018 to 10001004F)
    200 size of raw data
    418 file pointer to raw data (00000418 to 00000617)
      0 file pointer to relocation table
      0 file pointer to line numbers
      0 number of relocations
      0 number of line numbers
40300040 flags
        Initialized Data
        RESERVED - UNKNOWN
        RESERVED - UNKNOWN
        Read Only

RAW DATA #2
 100010018: 48 6F 6C 61 20 6D 75 6E 64 6F 20 64 65 73 64 65 Hola mundo desde
 100010028: 20 47 43 43 20 28 49 6E 74 65 6C 20 53 79 6E 74  GCC (Intel Synt
 100010038: 61 78 2C 20 70 72 6F 67 72 61 6D 61 2E 65 78 65 ax, programa.exe
 100010048: 29 20 76 32 21 00 00 00                         ) v2!...

SECTION HEADER #3
.eh_fram name
     38 virtual size
FFC11000 virtual address (100011000 to 100011037)
    200 size of raw data
    800 file pointer to raw data (00000800 to 000009FF)
      0 file pointer to relocation table
      0 file pointer to line numbers
      0 number of relocations
      0 number of line numbers
40300040 flags
        Initialized Data
        RESERVED - UNKNOWN
        RESERVED - UNKNOWN
        Read Only

RAW DATA #3
 100011000: 14 00 00 00 00 00 00 00 01 7A 52 00 01 7C 08 01 .........zR..|..
 100011010: 1B 0C 04 04 88 01 00 00 1C 00 00 00 1C 00 00 00 ................
 100011020: E0 EF FF FF 16 00 00 00 00 41 0E 08 85 02 42 0D àïÿÿ.....A....B.
 100011030: 05 52 C5 0C 04 04 00 00                         .RÅ.....


COFF SYMBOL TABLE
000 0000000A DEBUG  notype       Filename     | .file
   test.c
002 00000000 SECT1  notype ()    External     | _inicio
   tag index 00000000 size 00000000 lines 00000000 next function 00000000
004 00000000 SECT1  notype       Static       | .text
   Section length   16, #relocs    1, #linenums    0, checksum        0
006 00000000 SECT2  notype       Static       | .rdata
   Section length   36, #relocs    0, #linenums    0, checksum        0
008 00000000 SECT3  notype       Static       | .eh_frame
   Section length   38, #relocs    1, #linenums    0, checksum        0
00A 00000000 SECT2  notype       External     | rdata
00B 00000000 SECT2  notype       External     | rdata_end
00C 00000000 ABS    notype       External     | __dll_characteristics__
00D 00001000 ABS    notype       External     | __size_of_stack_commit__
00E 00200000 ABS    notype       External     | __size_of_stack_reserve__
00F 00000004 ABS    notype       External     | __major_subsystem_version__
010 00000018 SECT1  notype       External     | text_end
011 00001000 ABS    notype       External     | __size_of_heap_commit__
012 00000000 ABS    notype       External     | __dll__
013 00000000 ABS    notype       External     | __minor_os_version__
014 00400000 ABS    notype       External     | __image_base__
015 00001000 ABS    notype       External     | __section_alignment__
016 00011038 ABS    notype       External     | end
017 00000038 SECT3  notype       External     | bss_end
018 00000038 SECT3  notype       External     | bss
019 00000200 ABS    notype       External     | __file_alignment__
01A 00000038 SECT3  notype       External     | data
01B 00000004 ABS    notype       External     | __major_os_version__
01C 00100000 ABS    notype       External     | __size_of_heap_reserve__
01D 00400000 ABS    notype       External     | ___ImageBase
01E 00000003 ABS    notype       External     | __subsystem__
01F 00000000 SECT2  notype       External     | rodata_end
020 00000001 ABS    notype       External     | __major_image_version__
021 00000000 ABS    notype       External     | __loader_flags__
022 00000000 SECT1  notype       External     | code
023 00000000 ABS    notype       External     | __minor_subsystem_version__
024 00000000 ABS    notype       External     | __minor_image_version__
025 00000000 SECT2  notype       External     | rodata
026 00000038 SECT3  notype       External     | data_end

String Table Size = 0x195 bytes

 Summary

       1000 .eh_fram
       1000 .rdata
       1000 .text




De cualquier manera no se como eso pueda afectar, antes esta el codigo (y la sección .rdata tambien) y este termina con un ret por lo cual deberia devolver el control al Kernel ... no me gusta adivinar y sin tener el resto del sistema es lo unico que podemos hacer. ¿Seguro ves el mensaje en pantalla antes de la excepcion? ¿Seguro cargaste el programa.exe en 0x10000, no? Si _inicio no es 0x10000 es facil que se genere una excepcion al acceder a cualquier parte ... la cadena tiene que estar en la direccion de memoria 0x10018 para que funcione ...

_inicio:
 00000000: 55                 push        ebp
 00000001: 89 E5              mov         ebp,esp
 00000003: 83 EC 10           sub         esp,10h
 00000006: C7 45 FC 00 00 00  mov         dword ptr [ebp-4],offset .rdata
           00
 0000000D: 31 C0              xor         eax,eax
 0000000F: 8B 5D FC           mov         ebx,dword ptr [ebp-4]
 00000012: CD 80              int         80h
 00000014: C9                 leave
 00000015: C3                 ret
 00000016: 90                 nop
 00000017: 90                 nop

PD. Esta no es una pregunta sobre C/C++ sino sobre un compilador en particular, nadie mejor que el desarrollador del mismo para responderte con precision.