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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Problema al pasar cadenas a los campos de un struct en FASM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema al pasar cadenas a los campos de un struct en FASM  (Leído 4,714 veces)
Swicher

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Problema al pasar cadenas a los campos de un struct en FASM
« en: 31 Enero 2013, 09:36 am »

Hola a todos, estoy convirtiendo este código en Python en una librería en Assembler y esto es lo que tengo hasta ahora:

Código
  1. format PE GUI 4.0 DLL
  2. entry DllEntryPoint
  3.  
  4. include 'win32a.inc'
  5.  
  6. section '.code' code readable executable
  7.  
  8. struct SHELLEXECUTEINFO
  9.    cbSize dd ?
  10.    fMask dd ?
  11.    hwnd dd ?
  12.    lpVerb dd ?
  13.    lpFile dd ?
  14.    lpParameters dd ?
  15.    lpDirectory dd ?
  16.    nShow dd ?
  17.    hInstApp  dd ?
  18.    lpIDList  dd ?
  19.    lpClass dd ?
  20.    hKeyClass  dd ?
  21.    dwHotKey dd ?
  22.    hIconOrMonitor  dd ?
  23.    hProcess  dd ?
  24. ends
  25.  
  26. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
  27.        mov     eax,TRUE
  28.        ret
  29. endp
  30.  
  31. proc ShowProp filepath
  32.    mov [sei.cbSize], sizeof.SHELLEXECUTEINFO
  33.    mov [sei.fMask], SEE_MASK_NOCLOSEPROCESS or SEE_MASK_INVOKEIDLIST
  34.    mov [sei.lpVerb], prop
  35.    mov ecx, [filepath]
  36.    mov [sei.lpFile], ecx
  37.    mov [sei.nShow], 1
  38.    invoke ShellExecuteEx, sei
  39.    ret
  40. endp
  41.  
  42. section '.data' data readable writeable
  43.  
  44. SEE_MASK_NOCLOSEPROCESS = 0x00000040
  45. SEE_MASK_INVOKEIDLIST = 0x0000000C
  46. prop db "properties",0
  47. sei SHELLEXECUTEINFO
  48.  
  49. section '.idata' import data readable writeable
  50.  
  51. library shell32,'SHELL32.DLL'
  52. import shell32,ShellExecuteEx,'ShellExecuteEx'
  53.  
  54. section '.edata' export data readable
  55.  
  56.  export 'ShowProperties.dll', ShowProp, 'ShowProp'
  57.  
  58. section '.reloc' fixups data discardable

pero el mismo no compila. Al hacer unas pruebas (esto es, comentar lineas hasta que no me aparecieran mas errores) descubri que el problema esta en las lineas 41 y 42 al intentar asignar cadenas a los campos lpVerb y lpFile del struct SHELLEXECUTEINFO y sin importar como lo haga, el compilador siempre muestra algun error. ¿Que estoy haciendo mal? Por cierto, estos son los errores que me aparecen:
LineaModificaciónError que aparece
41mov[sei.lpVerb],propinvalid use of symbol.
41mov [sei.lpVerb], "properties"value out of range.
42mov [sei.lpFile], filepathinvalid value.
37 y 42proc ShowProp filepath* y mov [sei.lpFile], filepath (con y sin * al final)extra characters on line. (en endp)

Edit varios días después: Ya arregle ese problema que aparecía al ejecutar la función (eso de "access violation writing ..."). Abajo explico como lo logre.


« Última modificación: 8 Febrero 2013, 03:40 am por Swicher » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema al pasar cadenas a los campos de un struct en FASM
« Respuesta #1 en: 31 Enero 2013, 10:47 am »

La estructura esta mal definida, los punteros a cadena no son db, no es un byte, sino que son dd que es el tamaño de un puntero en x86 (4 bytes).

Creo que con esto solventas el error que queda pero probalo:
Código
  1. mov ecx, [filepath]
  2. mov [sei.lpFile], ecx


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
Swicher

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: Problema al pasar cadenas a los campos de un struct en FASM
« Respuesta #2 en: 31 Enero 2013, 13:19 pm »

Gracias Eternal Idol, logre compilar el código con las correcciones que mencionaste (ya sospechaba yo que el problema era alguna simpleza como esa ya que para hacer la estructura me base en lo que decía el manual de FASM y creía que las cadenas en las estructuras se asignaban de forma diferente a los números).
Por cierto, cuando importo la librería con Python y llamo a la función ShowProp (todo mediante ctypes) me aparece el error "WindowsError: exception: access violation writing 0x010E200F" y la única forma de arreglarlo que encontré fue agregándole el flag "writeable" a la sección ".code" y en este caso la función se ejecuta correctamente aunque también aparece "WindowsError: exception: access violation writing 0x00000001" (ciertamente es algo raro, pero bueno, quizás después le agregue mas código para ver que error produce con GetLastError o pruebe a importar la DDL en otro programa).
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Problema al pasar cadenas a los campos de un struct en FASM
« Respuesta #3 en: 31 Enero 2013, 13:29 pm »

Primero depuralo con WinDbg usando un programa propio y cuando funcione probalo con Python  ;)
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
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: Problema al pasar cadenas a los campos de un struct en FASM
« Respuesta #4 en: 31 Enero 2013, 15:28 pm »

Recuerda que no puedes mover información de una variable a otra con mov, ejemplo erroneo:

Código
  1. mov [var1],[var2]
  2.  

Ejemplo correcto:

Código
  1. mov eax,[var2]
  2. mov [var1],eax

ó:

Código
  1. push [var2]
  2. pop [var1]

saludos!
En línea

Un byte a la izquierda.
Swicher

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: Problema al pasar cadenas a los campos de un struct en FASM
« Respuesta #5 en: 8 Febrero 2013, 03:49 am »

Después de varias pruebas y errores descubrí que para que la función se ejecutara sin problemas solamente tenia que crear una instancia (no se si en ASM se le dice de otro modo) de SHELLEXECUTEINFO en la sección .data en lugar de hacerlo mientras se ejecuta ShowProp.
Primero depuralo con WinDbg usando un programa propio y cuando funcione probalo con Python  ;)
Curiosamente estuve depurando la librería con OllyDbg mediante este truco pero hasta que no hice lo de cambiar de lugar la instancia de SHELLEXECUTEINFO, el programa solo reconocía la función "DllEntryPoint" (o sea, es como que si Showprop no existiera).
Para terminar, actualizo el código del primer post por si a alguien mas le llega a resultar útil (cualquier mejora u optimización es bienvenida).
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Duda] Pasar struct por referencia
Programación C/C++
jaxoR 9 5,960 Último mensaje 27 Agosto 2014, 02:50 am
por rir3760
pasar datos a una struct
Programación C/C++
flony 6 4,481 Último mensaje 30 Enero 2015, 16:57 pm
por flony
Problema con OllyDbg y ejecutables en FASM
Ingeniería Inversa
fary 3 2,325 Último mensaje 13 Diciembre 2015, 01:48 am
por fary
[FASM] Problema con matrices
ASM
Yuki 5 4,225 Último mensaje 14 Abril 2016, 06:55 am
por Yuki
Cadenas en FASM
ASM
Yuki 3 3,803 Último mensaje 6 Mayo 2016, 10:28 am
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines