elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  que tan malo es programar usando WinMain@16 con nasm en windows?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: que tan malo es programar usando WinMain@16 con nasm en windows?  (Leído 5,209 veces)
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
que tan malo es programar usando WinMain@16 con nasm en windows?
« en: 2 Julio 2012, 02:24 am »

hola

Habra algun problema si programo en ASM con WinMain@16, lo que pasa es que logre hacer un printf, pero lo hice con WinMain, pero no se si eso esta mal, porque pueda pesar mas bytes, se toman cosas extras de gcc o algo que lo haga menos eficiente?

tambien como decidi usar Nasm porque la mayor parte del tiempo uso linux, y virtualizo windows entonces se me hace mas sencillo mejor nasm

pero bueno, ya me explicaron en fasm como importar, pero en nasm, ¿como importo las DLL y las apis?, en google encontre un ejemplo pero no me sirvio y de alli ya no vi mas formas

y una pregunta

si yo hago esto

Código
  1. push ebp
  2. mov ebp, esp
  3. sub esp, 10

bueno, tengo entendido que de esta forma, meto en la base lo que haya en el stack, pero cuando se usan funciones, esp vuelve a su estado normal? o eso no pasa?

por ejemplo

Código
  1.  
  2. push ebp
  3. mov ebp, esp
  4. sub esp, 12
  5.  
  6. ........................... ; codigo
  7.  
  8. funcion:
  9.  
  10. mov eax, [esp + 0x08]

si hago esto, ebp sigue valiendo lo mismo y estoy tomando el parametro que meti en el DWORD 8 de los 12 que tome de esp?, o al hacer un nueva funcion, esp regresa a como estaba y estoy tomando el segundo parametro despues de RET?

salu2


En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: que tan malo es programar usando WinMain@16 con nasm en windows?
« Respuesta #1 en: 2 Julio 2012, 12:13 pm »

hay poca gente que usa nasm, y en tu ejemplo en realidad lo más recomendable para acceder a las variables locales
o a los parametros es usar ebp, no esp porque con una alteracion de la pila ya perder la cuenta que llevabas en la pila
ademas para eso se hace el marco de la pila al principio y se restaura al final.

y no se pero no entiendo eso de

Código:
funcion:
mov eax, [esp + 0x08]

por lo de la etiqueta, no se si es por ponerle un nombre o porque de verdad así crees que se hace una funcion, tambien depende
de la convencion de llamada de la funcion, si es para una API son stdcall solo las llamas y la pila queda intacta al retorno, así como
estaba antes de llamar a la funcion


En línea

zu-zu

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: que tan malo es programar usando WinMain@16 con nasm en windows?
« Respuesta #2 en: 2 Julio 2012, 23:21 pm »

También sería recomendable que uses el macro PROC de NASM, que permite tanto la creación del stack frame como la definición de variables locales.

En un stack frame tanto las variables locales como los parámetros de la función deben ser apuntados por el registro EBP en vez de ESP, ya que cualquier instrucción como push/pop podría alterar la dirección de memoria apuntada por el registro ESP. Recuerda que tanto EBP como ESP no volverán a recuperar su valor previo mágicamente, por lo que tienes dos alternativas (LEAVE y MOV ESP, EBP/POP EBP).

Código:
push 0
push 1
call fnExample
ret

fnExample:
push ebp
mov ebp, esp
sub esp, 8 ; LOCAL DWORD, DWORD

mov dword ptr[ebp-0x04], 0 ; LOCAL 1 = 0
mov dword ptr[ebp-0x08], 1 ; LOCAL 2 = 1

mov eax, dword ptr[ebp+0x08] ; EAX = Parámetro 1 = 1
mov eax, dword ptr[ebp+0x0C] ; EAX = Parámetro 2 = 0

leave
retn 2*4 ; Número de parámetros*sizeof.DWORD

Lo de las imports imagino que debe depender del linker, aunque, ¿podrías ser más específico con el problema que tienes con las DLL?
« Última modificación: 2 Julio 2012, 23:29 pm por zu-zu » En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: que tan malo es programar usando WinMain@16 con nasm en windows?
« Respuesta #3 en: 3 Julio 2012, 05:17 am »

bueno de mi primera pregunta lo que sucede es que hice esto, se me hace mas facil compilar nasm con gcc usando WinMain, pero no se que tan bueno sea

Código
  1. [BITS 32]
  2.  
  3. section .data
  4. mundo db 'Hola mundo!',0
  5. section .text
  6.  
  7. extern _printf
  8. extern _ExitProcess@4
  9. global _WinMain@16
  10.  
  11. _WinMain@16:
  12.    push mundo
  13.    call _printf
  14.  
  15.    push 0
  16.    call _ExitProcess@4
  17. ret 16

bueno, ya instale MASM32, hay alguno cambios, quise hacer un MessageBox y despues de 20 mensajes de error, no sabia que se tenia que poner offset a las cadenas,  :P

y con lo segundo

es que me surgio la duda de que si yo hago esto

Código
  1. push ebp
  2. mov ebp, esp
  3. sub esp, 12

y despues necesitara hacer algo con un funcion, por ejemplo, si meto datos en ebp, quedaria algo asi


Código:
ebp-0x0C -> parametro 1
ebp-0x08 -> parametro 2

pero si hiciera una funcion nueva, y luego usara esp + 0x08, estaria usando el parametro de ebp-0x08 ó estaria usando el parametro de ebp+0x08, por ejemplo

Código
  1. push ebp
  2. mov ebp, esp
  3. sub esp, 12
  4.  
  5. ebp-0x0C -> parametro 1
  6. ebp-0x08 -> parametro 2
  7. -----------------------------
  8. ebp+0x08 -> parametro 1
  9. ebp+0x0C -> parametro 2
  10.  
  11. call funcion
  12.  
  13.  
  14. funcion:
  15.  
  16. mov eax, [esp+ 0x08] --> estaria usando el parametro 2 - ebp-0x08?
  17.  
  18. ---------------------------------------
  19.  
  20. mov eax, [esp+ 0x08] --> estaria usando el parametro 1 - ebp+0x08?
  21.  

Cual estaria usando, el parametro 1 de ebp+0x08 o el prametro 2 de ebp-0x08, o ninguna de las 2?

espero sea mas entendible, pero no encuentre otra forma de explicarlo, sino pues nimodo, ya vere como investigo, gracias por las respuestas

salu2  ;D
En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: que tan malo es programar usando WinMain@16 con nasm en windows?
« Respuesta #4 en: 3 Julio 2012, 08:27 am »

hago cuenta y caso que sabes como deberia ser y respondiendo a tu pregunta, tú pila quedaria así despues de tu "call funcion":

Código:
ebp->ebp old
        local1
        local2
        local3
esp->return to caller
        free
        free
        ....

ahora sumamos 8 como dices a esp y estariamos accediendo a local2, simple
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
necesito ayuda para programar en perl por primera vez usando linux
Scripting
4rkn63l 1 4,294 Último mensaje 13 Mayo 2008, 15:04 pm
por ^Tifa^
Eso es bug del hypervisor o del NASM....
ASM
ño_ño 1 3,083 Último mensaje 15 Julio 2010, 03:58 am
por ño_ño
NASM en Linux
ASM
Stroncio 5 6,387 Último mensaje 28 Enero 2011, 02:01 am
por Stroncio
error usando linux 64bits en codigo de nasm
ASM
Belial & Grimoire 1 2,763 Último mensaje 14 Julio 2013, 03:16 am
por xv0
Programar keylogger usando mapvirtualkey en QT
Programación General
Borito30 0 1,791 Último mensaje 1 Noviembre 2016, 12:44 pm
por Borito30
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines