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


 


Tema destacado: [AIO elhacker.NET 2013] Compilación herramientas análisis y desinfección malware


+  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 1,066 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 »

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 por Swicher » En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.217


La mano invisible del mercado me robo la billetera


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

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 »

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
Moderador
***
Desconectado Desconectado

Mensajes: 5.217


La mano invisible del mercado me robo la billetera


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

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
mDrinky


Desconectado Desconectado

Mensajes: 439



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

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

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 »

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
[c++] Dudas con struct's y cadenas
Programación C/C++
JorgeEMX 5 977 Último mensaje 22 Marzo 2007, 19:33
por pepel
problema al pasar una struct de C++
Programación Visual Basic
el_c0c0 0 1,364 Último mensaje 31 Marzo 2009, 00:34
por el_c0c0
Problema para pasar un codigo de MASM a FASM
ASM
ZoNike 4 2,668 Último mensaje 2 Noviembre 2009, 02:17
por YST
Problema con struct
Programación C/C++
Luchoz95 6 487 Último mensaje 27 Marzo 2013, 01:37
por durasno
[Duda] Pasar struct por referencia
Programación C/C++
wiD^ 9 665 Último mensaje 27 Agosto 2014, 02:50
por rir3760
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines