Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: W0lFy en 30 Junio 2009, 09:06 am



Título: Empezando con ASM
Publicado por: W0lFy en 30 Junio 2009, 09:06 am
Buenas, estoy empezando con el tipico MessageBox de Hola mundo,

hasta ahora lo que tengo es:

include "c:\include\win32ax.inc'

.data

cuerpo db "Este es el Cuerpo",0
titulo db "Este es el titulo",0

.code

start:
push MB_OK
push titulo
push cuerpo
push 0
call [MessageBox]




.end start


Bueno este codigo me imprime la tipica ventana con OK con titulo y cuerpo, existe alguna manera de poder cambiar la variable cuerpo? por ejemplo

si yo tengo esta variable definida

cuerpo db "Este es el Cuerpo",0

ahora quiero que cuerpo sea:

cuerpo="Este es el 56 cuerpo",0
supongo que es accediendo a la direccion de la memoria de cuerpo y sumarle tantos caracteres *4 como queramos , creo que es asi pero no se como modificar esa direccion exacta, igual estoy confundido, me podrían ayudar?Es indispensable para mi aprendizaje, Gracias!! Un saludo!


Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 09:41 am
En este caso no podrias excepto que no te importara sobreescribir la memoria que le sigue (en este caso titulo) debido a que no reservaste suficiente espacio para la nueva cadena. Lo que podes hacer sin problema es esto:

Código
  1. mov [cuerpo], 'H'
  2. mov [cuerpo+1], 'o'
  3. mov [cuerpo+2], 'l'
  4. mov [cuerpo+3], 'a'
  5. mov [cuerpo+4], 0

Por cierto pone un ret o un ExitProcess despues del MessageBox (y cerra con comillas - " - el include).


Título: Re: Empezando con ASM
Publicado por: W0lFy en 30 Junio 2009, 09:47 am
Gracias Eternal voy a probar, jeje los errores de despues no te preocupes, que son porque copie rapidamente, Gracias!


Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 09:54 am
De nadas  ::)


Título: Re: Empezando con ASM
Publicado por: W0lFy en 30 Junio 2009, 10:12 am
Tengo otra duda:

Si yo tengo esta variable:

cuerpo db    'Hola Mundo',0

y quiero modifi car el 5 caracter de la variable digamos que yo lo modificaria asi:

mov [cuerpo+4], 0x61   ; por ejemplo

pero y si quiero pasarle un valor numerico que tengo almacenado en uan variable?

por ejemplo si  eax= 0x0000005

quiero hacer un mov[cuerpo+4], eax   ; y que el resultado obtenido sea este:
cuerpo= 'Hola4Mundo',0


despues me gustaria saber como puedo reservar memoria para poder poner un string a mi antojo. Un saludo!


Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 12:05 pm
Para que un digito se convierta en caracter tenes que sumarle el codigo ASCII de 0 (48), este es un ejemplo basado en el otro:

Código
  1. mov [cuerpo], 'H'
  2. mov [cuerpo+1], 'o'
  3. mov [cuerpo+2], 'l'
  4. mov [cuerpo+3], 'a'
  5. mov eax, 5
  6. add eax, '0'
  7. mov [cuerpo+4], al
  8. mov [cuerpo+5], 0

Para reservar memoria en tiempo de ensamblaje (?) podes hacer esto:

Código
  1. .data
  2. una_cadena db 128 dup(0)

El resultado es 128 bytes en la sección de datos cuyo valor es 0.


Título: Re: Empezando con ASM
Publicado por: YST en 30 Junio 2009, 14:36 pm
Código
  1. include 'win32ax.inc'
  2. .data
  3. cuerpo db    'Hola Mundo',0
  4. Datos db 99 dup (0) ; Reservamos 99 bytes
  5. .code
  6. start:
  7. xor eax,eax
  8. mov eax,4
  9. or al,"0"
  10. mov byte[cuerpo+4],al
  11. invoke MessageBox,0,cuerpo,0,0
  12. invoke ExitProcess,0
  13. .end start                                      

Hay tienes un ejemplo de lo que querias hacer :P


Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 14:58 pm
¿Para que la introducir Datos al codigo? En fin, todo sea por la redundancia.


Título: Re: Empezando con ASM
Publicado por: YST en 30 Junio 2009, 17:34 pm
¿Para que la introducir Datos al codigo? En fin, todo sea por la redundancia.

No entiendo muy bien lo que dices.

Si es por lo de

Código
  1. Datos db 99 dup (0)

era para mostrarle como se hacia , aunque no tiene importancia en el codigo en si :P


Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 17:42 pm
Si, me referia a eso exactamente, era redundante.


Título: Re: Empezando con ASM
Publicado por: Yurix en 30 Junio 2009, 19:58 pm
-------
si yo tengo esta variable definida
cuerpo db "Este es el Cuerpo",0

ahora quiero que cuerpo sea:
cuerpo="Este es el 56 cuerpo",0
-------

Que bueno que tocas este tema ya que igual que tu también lo tengo en mente , es cierto que si no reservas espacio en memoria para la string no puedes hacer nada .

Eternal dijo:
En este caso no podrías excepto que no te importara sobrescribir la memoria que le sigue (en este caso titulo) debido a que no reservaste suficiente espacio para la nueva cadena.

--- en estos momentos tengo en mente una forma para hacer ajustes en caso de que no reservemos memoria para nuestras strings , y que no consuma espacio en memoria innecesario , es decir , no reservar espacio de antemano , esperen el código que ya viene en camino , se los prometo .

Saludos







Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 20:18 pm
Para eso esta la memoria dinamica, se puede usar HeapAlloc/HeapFree por ejemplo.


Título: Re: Empezando con ASM
Publicado por: YST en 30 Junio 2009, 20:33 pm
Algo a si quieres ?
Código
  1. include 'win32ax.inc'
  2. .data
  3. cuerpo db    'Este es el Cuerpo',0
  4. .code
  5. start:
  6. invoke lstrlen,cuerpo
  7. add eax,3
  8. invoke GlobalAlloc,GPTR, eax
  9. mov ebx ,eax
  10. mov byte[cuerpo+10],0
  11. invoke lstrcpy,ebx,cuerpo
  12. invoke lstrcat,ebx," 56 Cuerpo"
  13. invoke MessageBox,0,ebx,0,0
  14. invoke GlobalFree,ebx
  15. invoke ExitProcess,0
  16. .end start              


Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 21:14 pm
Global and Local Functions (http://msdn.microsoft.com/en-us/library/aa366596(VS.85).aspx)

The global and local functions are supported for porting from 16-bit code, or for maintaining source code compatibility with 16-bit Windows. Starting with 32-bit Windows, the global and local functions are implemented as wrapper functions that call the corresponding heap functions using a handle to the process's default heap. Therefore, the global and local functions have greater overhead than other memory management functions.

The heap functions provide more features and control than the global and local functions. New applications should use the heap functions unless documentation specifically states that a global or local function should be used. For example, some Windows functions allocate memory that must be freed with LocalFree, and the global functions are still used with Dynamic Data Exchange (DDE), the clipboard functions, and OLE data objects. For a complete list of global and local functions, see the table in Memory Management Functions.

Windows memory management does not provide a separate local heap and global heap, as 16-bit Windows does. As a result, the global and local families of functions are equivalent and choosing between them is a matter of personal preference. Note that the change from a 16-bit segmented memory model to a 32-bit virtual memory model has made some of the related global and local functions and their options unnecessary or meaningless. For example, there are no longer near and far pointers, because both local and global allocations return 32-bit virtual addresses.

Memory objects allocated by GlobalAlloc and LocalAlloc are in private, committed pages with read/write access that cannot be accessed by other processes. Memory allocated by using GlobalAlloc with GMEM_DDESHARE is not actually shared globally as it is in 16-bit Windows. This value has no effect and is available only for compatibility. Applications requiring shared memory for other purposes must use file-mapping objects. Multiple processes can map a view of the same file-mapping object to provide named shared memory. For more information, see File Mapping.

PD. YST: te falto un reservar un byte para el cero terminador de cadena.


Título: Re: Empezando con ASM
Publicado por: YST en 30 Junio 2009, 21:27 pm
PD. YST: te falto un reservar un byte para el cero terminador de cadena.

Adonde ? :xD El add eax,3 es 2 byte por el 56 y uno por el caracter nulo :P


Título: Re: Empezando con ASM
Publicado por: Eternal Idol en 30 Junio 2009, 21:36 pm
Al final, por supuesto, si queres usa App Verifier para comprobarlo.

"Este es el Cuerpo" = 17 caracteres
17+3=20, 19 caracteres + 0 terminador.

strcpy "Este es el" 10 caracteres
strcat " 56 Cuerpo" 10 caracteres

No solo agregas 56 sino un espacio justo despues del numero.


Título: Re: Empezando con ASM
Publicado por: YST en 30 Junio 2009, 21:46 pm
Verdad me comi un byte :xD

Código
  1. include 'win32ax.inc'
  2. .data
  3. cuerpo db    'Este es el Cuerpo',0
  4. .code
  5. start:
  6. invoke lstrlen,cuerpo
  7. add eax,4
  8. invoke GlobalAlloc,GPTR, eax
  9. mov ebx ,eax
  10. mov byte[cuerpo+11],0
  11. invoke lstrcpy,ebx,cuerpo
  12. invoke lstrcat,ebx,"56 Cuerpo"
  13. invoke MessageBox,0,ebx,0,0
  14. invoke GlobalFree,ebx
  15. invoke ExitProcess,0
  16. .end start