Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: HelloWorldCodigo en 23 Agosto 2015, 23:28 PM

Título: (Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit
Publicado por: HelloWorldCodigo en 23 Agosto 2015, 23:28 PM
Hola a todos y a todas. El problema que tengo es que al ensamblar un código con NASM con la etiqueta -fwin32 no puede ser ejecutado según Windows a 64 bits. No he probado la aplicación en modo 32 bits (no tengo ningún ordenador de 32 bits), así que no sé si es problema del código.

Código (asm) [Seleccionar]
STD_OUTPUT_HANDLE   equ -11
STD_INPUT_HANDLE    equ -10
NULL                equ 0

global start
extern ExitProcess, GetStdHandle, WriteConsoleA, ReadConsoleInputA

section .data    ;message we want to display on console
msg                 db "Press a key to continue...", 13, 10, 0
msg.len             equ $ - msg
consoleInHandle     dd 1

section .bss     ;buffers declaration
buffer_out          resd 2
buffer_in           resb 32

section .text
   start:       ;starting point of our program
       push    STD_OUTPUT_HANDLE
       call    GetStdHandle   ;call to get a handle to the
       push    NULL           ;specified mode (input, output...)
       push    buffer_out
       push    msg.len
       push    msg
       push    eax            ;contains the GetStdHandle result
       call    WriteConsoleA  ;call to print our msg in console

   read:
       push    STD_INPUT_HANDLE
       call    GetStdHandle        ;new call to get input handle
       push    NULL
       push    1
       push    buffer_in
       push    eax
       call    ReadConsoleInputA   ;call to detect user input
                                   ;this function will wait til
   exit:                           ;it detects enough keypresses
       push    NULL                ;(in this case, 1)
       call    ExitProcess


Este es el comando que he usado:
nasm -fwin32 main.asm -o main.exe
Título: Re: (Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit
Publicado por: MCKSys Argentina en 23 Agosto 2015, 23:37 PM
Hola!

No responderé a tu pregunta principal, pues no manejo bien nasm.

Pero para ésto:

Cita de: HelloWorldCodigo en 23 Agosto 2015, 23:28 PM
... No he probado la aplicación en modo 32 bits (no tengo ningún ordenador de 32 bits), así que no sé si es problema del código...

puedes usar una máquina virtual. VirtualBox es gratis y fácil de usar. Si vas a hacer desarrollos, te conviene tener al menos 1 VM por cada target que quieras.

Saludos!
Título: Re: (Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit
Publicado por: Eternal Idol en 23 Agosto 2015, 23:47 PM
Windows de 64 bits ejecuta programas de 32 bits. El problema es que no estas generando ningun programa en lo absoluto ... apenas llegaste al codigo objeto, necesitas enlazar.
Título: Re: (Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit
Publicado por: HelloWorldCodigo en 23 Agosto 2015, 23:53 PM
¿Y cómo puedo enlazar? Se supone que no necesito usar C Standard
Título: Re: (Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit
Publicado por: Eternal Idol en 24 Agosto 2015, 00:02 AM
Con un enlazador, yo uso el de Microsoft (link.exe). Hay que aprender a buscar:
http://forum.codecall.net/topic/65222-intro-to-win32-assembly-using-nasm-part-1/

Si queres que te ayuden mejor usa MASM como casi todo el mundo que programa en assembly para Windows.

PD. El cuarto y ultimo parametro de ReadConsoleInputA no puede ser nulo, tiene que ser un puntero a DWORD.
Título: Re: (Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit
Publicado por: HelloWorldCodigo en 24 Agosto 2015, 00:05 AM
He intentado esto encontrado en la web, pero nasm me da un error:

Código (asm) [Seleccionar]
extern GetStdHandle
extern WriteConsoleA
extern ReadConsoleInputA
extern ExitProcess

import GetStdHandle kernel32.dll
import ExitProcess kernel32.dll
import WriteConsoleA kernel32.dll
import ReadConsoleInputA kernel32.dll


El error junto al comando son los siguientes:
nasm -fwin32 main.asm -o main.exe
main.asm:10: error: parser: instruction expected
main.asm:11: error: symbol `import' redefined
main.asm:11: error: parser: instruction expected
main.asm:12: error: symbol `import' redefined
main.asm:12: error: parser: instruction expected
main.asm:13: error: symbol `import' redefined
main.asm:13: error: parser: instruction expected

También he probado este comando y me sale el mismo error:
nasm main.asm -o main.exe
Título: Re: (Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit
Publicado por: Eternal Idol en 24 Agosto 2015, 00:20 AM
Si vas a seguir copiando y pegando codigo sin entender nada hasta lograrlo hacelo pero no preguntes a cada paso que des por favor, ya lo estas haciendo en otros lados ademas.

Con el codigo original, que te va a dar una excepcion a menos que arregles la llamada a ReadConsoleInputA, baja el golink (http://www.godevtool.com/):
GoLink.exe /console /entry:start main.obj kernel32.dll


http://therobpoint.blogspot.com/2012/11/asm-how-to-use-windows-api-in-nasm.html