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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: [1]
1  Programación / ASM / Re: Funciones en FASM en: 10 Julio 2011, 18:10 pm
Muy buen post. Yo también tengo una función para pasar de Hex a ASCII:

Código:
proc Conversor_ASCII2 uses ebx esi edi, datos
   mov   ecx, 3                   ;Pongo el contador a 3

   mov   eax, [datos]          ;Pongo en EAX el número a convertir
   mov   ebx, 0ah               ;Se tendrá que dividir entre 10 = 0Ah
.repetir:
   div   bl                           ;AL = Resultado, AH =resto = número que importa.
   mov   [Buffer+ecx], ah   ;Guardo aquí el resultado (AH).
   add   [Buffer+ecx],30h   ;Le sumamos 30 para que quede el código en ascii
   and   eax, 0ffh               ;Hacemos un filtro para dejar sólo AL (el resto)

   dec   ecx                       ;Restamos 1 al contador
   cmp   ecx, 0                  ;Lo comparamos con 0
   jl    .fuera                     ;Si es inferior se sale

jmp .repetir                     ;Repetimos la operación, solo que ECX ahora vale menos.

.fuera:
   mov   eax, dword [Buffer]   ;Ponemos en EAX el resultado.
   ret                                    ;Devolvemos el flujo del programa donde fue llamado
endp

La variable buffer la tengo definida asi:
Buffer   db 1

y para usar la función:
stdcall Conversor_ASCII2 , eax

donde EAX es el valor Hex a pasar. La función retorna en EAX el número en ASCII.

Ya os habreis dado cuenta que esta función está pensada para números de 4 dígitos solamente, el motivo es que la uso para visualizar las coordenadas del ratón asi como otros datos que no requieren números grandes.

   Se podría modificar para usar números más grandes, solamente que el valor no se devolvería en EAX sino en [Buffer].

2  Programación / ASM / Re: posición del ratón en: 9 Julio 2011, 13:11 pm
Ya sabia yo que tenía que ser un error de comprensión. No me di cuenta de lo de las coordenadas de pantalla / ventana. La próxima vez estaré má atento.

Gracias de nuevo  ;-)
3  Programación / ASM / Re: posición del ratón en: 8 Julio 2011, 20:54 pm
Muchísimas gracias _Enko. No soy capaz de ver el problema pues realmente lo que pasa es que las coordenadas no son las que deberían.

Con el modo "normal", el que has escrito tú, funciona correctamente. Si alguien sabe el motivo, lo que hice mal, agradecería su comentario pues es así como mejor se aprende.

Gracias de nuevo _Enko
4  Programación / ASM / Re: posición del ratón en: 8 Julio 2011, 20:13 pm
Me imaginaba esa contestación. Conocía lo del lparam y comprendo el código que has usado; lo miraré a ver si así va mejor.

Use el GetCursorPos por comodidad, pues se supone que te da las coordenadas del cursor de todas formas.
5  Programación / ASM / posición del ratón en: 8 Julio 2011, 18:46 pm
No he encontrado un tema que lo explique así que hago mi pregunta:

Estoy usando FASM y programando en Windows modo gráfico.

Quiero leer la posición del ratón y comprobar si se encuentra dentro de un area al hacer click. He echo esto:

Definición de las variables
Código:
   punto             POINT
   cPosx1            dd ?
   cPosy1            dd ?
   cPosx2            dd ?
   cPosy2            dd ?
   posicionx1        dd ?
   posicionx2        dd ?
   posiciony1        dd ?
   posiciony2        dd ?

Luego mediante el mensaje WM_LBUTTONDOWN hago lo siguiente
Código:
  _mouse_click:
   invoke GetCursorPos, punto   ;Comprobamos las coordenadas del cursor
                                              ;y lo guardamos en la estructura punto
   mov    eax, [cPosx1]     ;Punto izquierdo del area
   cmp    [punto.x], eax    ;Compara "X" del cursor con punto izquierdo del area
   jl     _final                    ;si es inferior no sigue.

   mov    eax, [cPosx2]    ;Punto derecho del area
   cmp    [punto.x], eax    ;Compara "X" del cursor con punto derecho del area
   ja     _final                   ;si es superior no sigue.

   mov    eax, [cPosy1]    ;Punto superior del area
   cmp    [punto.y], eax    ;Compara "Y" del cursor con punto superior del area
    jl     _final                   ;si es inferior no sigue.

   mov    eax, [cPosy2]    ;Punto inferior del area
   cmp    [punto.y], eax   ;Compara "Y" del cursor con punto inferior del area
   ja     _final                  ;si es superior no sigue.

En principio la comprobación está bien; sin envargo cuando hago click con el ratón, las coordenadas siempre son inferiores a las del area, aunque haga click dentro del area.

El area está dibujada mediante un procedimiento y por lo tanto lo veo y puedo hacer click dentro del mismo, pero las coordenadas devueltas siempre son inferiores a las del area y no tengo ni idea del motivo.  :-[

Aquí os dejo el código entero excepto donde hay gráficos para que podais copiar-pegar y ejecutarlo si quereis:
Código:
format PE GUI
entry comienzo

include 'win32a.inc'

cdxPos          EQU 128
cdyPos          EQU 128
cdxTamano       EQU 800
cdyTamano       EQU 600

cdColFondo      EQU 002h
cdIcono         EQU IDI_APPLICATION
cdCursor        EQU IDC_ARROW
cdTipoBar       EQU 0; WS_EX_CLIENTEDGE :Borde alrededor de la ventana.
cdTipoBoton     EQU WS_VISIBLE + WS_DLGFRAME

id_Muralla_H    EQU 100
id_Muralla_VI   EQU 101
id_Muralla_VD   EQU 102
id_Muralla_EI   EQU 103
id_Muralla_ED   EQU 104

;++++++++++++++++++++++++++++++++++++++++++++++++
;++ Sección de datos                           ++
;++++++++++++++++++++++++++++++++++++++++++++++++
section '.data' data readable writeable
   NombreClase       db 'VentanaSimple', 0
   Titulo            db 'Editor de ciudad v.0.0', 0
   ErrorRegistro     db 'Error al Registrar', 0
   ErrorCrear        db 'Error al Crear', 0
   CommandLine       dd ?

   wc                WNDCLASS 0, WindowProc, 0, 0, 0, 0, 0, cdColFondo, 0, NombreClase
   msg               MSG
   punto             POINT

   ps                PAINTSTRUCT
   rect              RECT

   Posx              dd ?
   Posy              dd ?
   Posy2             dd ?
   Posy3             dd ?
   Posy4             dd ?
   Posy5             dd ?

   hMuralla_H        rd 1
   hMuralla_VI       rd 1
   hMuralla_VD       rd 1
   hMuralla_EI       rd 1
   hMuralla_ED       rd 1
   id_Elegido        rd 1

   hPen              dd ?
   hPenOld           dd ?
   cPosx1            dd ?
   cPosy1            dd ?
   cPosx2            dd ?
   cPosy2            dd ?
   posicionx1        dd ?
   posicionx2        dd ?
   posiciony1        dd ?
   posiciony2        dd ?

   hdc               rd 1
   hMemDC            rd 1

;++++++++++++++++++++++++++++++++++++++++++++++++
;++ Sección ejecutable                         ++
;++++++++++++++++++++++++++++++++++++++++++++++++

section '.text' code readable executable
comienzo:
   invoke GetModuleHandle, 0
   mov    [wc.hInstance], eax
   invoke GetCommandLine
   mov    [CommandLine], eax
   invoke LoadCursor, 0, cdCursor
   mov    [wc.hCursor], eax
   invoke LoadIcon, 0, cdIcono
   mov    [wc.hIcon], eax
   invoke RegisterClass, wc
   test   eax, eax
   jne    _principal
   invoke MessageBox, 0, ErrorRegistro, 0, MB_OK + MB_ICONERROR

  _principal:
   stdcall WinMain, [wc.hInstance], 0, [CommandLine], SW_SHOWNORMAL

   invoke  ExitProcess, 0

;++++++++++++++++++++++++++++++++++++++++++++++++
;++ Procedimiento principal del programa       ++
;++++++++++++++++++++++++++++++++++++++++++++++++

proc WinMain uses ebx esi edi, hInst, hPrevInst, CmdLine, CmdShow
   invoke CreateWindowEx,\
          cdTipoBar,\
          NombreClase,\
          Titulo,\
          cdTipoBoton,\
          cdxPos,\
          cdyPos,\
          cdxTamano,\
          cdyTamano,\
          0,\
          0,\
          [hInst],\
          0
   test   eax, eax
   jne    _msg_loop
   invoke MessageBox, 0, ErrorCrear, 0, MB_OK + MB_ICONERROR

  _msg_loop:
   invoke GetMessage, msg, 0, 0, 0
   cmp    eax, 1
   jb     _end_loop
   jne    _msg_loop
   invoke TranslateMessage, msg
   invoke DispatchMessage, msg
  jmp _msg_loop
  _end_loop:
   ret
endp

;++++++++++++++++++++++++++++++++++++++++++++++++
;++ Procedimiento de los mensajes principal    ++
;++++++++++++++++++++++++++++++++++++++++++++++++
proc WindowProc uses ebx esi edi, hwnd, wmsg, wparam, lparam
   cmp    [wmsg], WM_CREATE
   je     _crear
   cmp    [wmsg], WM_PAINT
   je     _pintar
   cmp    [wmsg], WM_KEYDOWN
   je     _tecla
   cmp    [wmsg], WM_LBUTTONDOWN
   je     _mouse_click
   cmp    [wmsg], WM_DESTROY
   je     _destruye

  _defecto:
   invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
   jmp    _final
  _crear:
;Aquí vendria la carga de los gráficos

mov    [hMuralla_ED], eax

   mov    [Posx], 750d
   mov    [Posy], 2d
   mov    [Posy2], 45d
   mov    [Posy3], 88d
   mov    [Posy4], 131d
   mov    [Posy5], 174d

   mov    [cPosx1], 749d
   mov    [cPosy1], 1d
   mov    [cPosx2],  790d
   mov    [cPosy2], 43d

   jmp    _final

  _mouse_click:
   invoke GetCursorPos, punto
   mov    eax, [cPosx1]
   cmp    [punto.x], eax
   jl     _final
   mov    eax, [cPosx2]
   cmp    [punto.x], eax
   ja     _final
   mov    eax, [cPosy1]
   cmp    [punto.y], eax
   jl     _final
   mov    eax, [cPosy2]
   cmp    [punto.y], eax
   ja     _final

   invoke InvalidateRect, [hwnd], NULL, TRUE

  jmp _final

  _tecla:
   cmp    [wparam], VK_DOWN
   jne    .otra
   cmp    [cPosy1], 0ADh   ;Mira si es el último recuadro y si lo es no sigue sumando
   je     _final
   add    [cPosy1], 43d
   add    [cPosy2], 43d
   jmp    .pintando
   .otra:
   cmp    [wparam], VK_UP
   jne    _final
   cmp    [cPosy1], 1d
   je     _final
   sub    [cPosy1], 43d
   sub    [cPosy2], 43d

   .pintando:
   invoke InvalidateRect, [hwnd], NULL, TRUE

  jmp _final

  _pintar:

   invoke BeginPaint, [hwnd], ps
          mov    [hdc], eax
          invoke CreateCompatibleDC, [hdc]
          mov    [hMemDC], eax

          invoke GetClientRect, [hwnd], rect
;Aquí vendrían los gráficos

          stdcall Dibuja_Lineas, [cPosx1], [cPosx2], [cPosy1], [cPosy2],0000FF00h

          invoke DeleteDC, [hMemDC]
   invoke EndPaint, [hwnd], ps
   jmp    _final

  _destruye:
   invoke PostQuitMessage, 0
  _final:
   ret
endp

proc Dibuja_Lineas uses ebx esi edi, posicionx1, posicionx2, posiciony1, posiciony2, color
   invoke CreatePen, PS_SOLID, 1, [color]
   mov    [hPen], eax
   invoke SelectObject, [hdc], [hPen]
   mov    [hPenOld], eax
   invoke MoveToEx, [ps.hdc], [posicionx1], [posiciony1], 0
   invoke LineTo, [ps.hdc], [posicionx2], [posiciony1]
   invoke LineTo, [ps.hdc], [posicionx2], [posiciony2]
   invoke LineTo, [ps.hdc], [posicionx1], [posiciony2]
   invoke LineTo, [ps.hdc], [posicionx1], [posiciony1]
   ret
endp

;++++++++++++++++++++++++++++++++++++++++++++++++
;++ Sección de datos importación               ++
;++++++++++++++++++++++++++++++++++++++++++++++++
section '.idata' import data readable
library kernel32, 'kernel32.dll',\
        user32, 'user32.dll',\
        gdi32, 'gdi32.dll'

include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\gdi32.inc'

;++++++++++++++++++++++++++++++++++++++++++++++++
;++ Sección de recursos                        ++
;++++++++++++++++++++++++++++++++++++++++++++++++

;Aquí vendrían los gráficos


Puedes usar las teclas del cursor ARRIBA y ABAJO, para mover el area. Se que aunque funcionase no haría nada, pero eso es porque al no funcionar no lo he echo  :huh:
6  Programación / ASM / Re: Mov edi, edi en: 16 Enero 2011, 12:14 pm
     Gracias por responder tan rápido. Lo de la pila lo digo porque esa era la duda. Todo viene a que no me di cuenta que añade a la pila datos, creo que necesito gafas  :rolleyes:.
 
     Ahora que estaba escribiendo aquí el contenido de la pila ya lo he visto, vaya que fallo. Este es el contenido de la pila, ahora ya lo entiendo  :P:

     Antes del mov edi, edi:

6FFB0    0401014    Call to MessageBoxA from 2.0040100E
6FFB4    0000000    hOwner = 0
6FFB8    0402000    Text = "Hola"
6FFBC    040200C   Title = "Titulo"
6FFC0    00000000  Style = MB_OK | MB_APPLMODAL
6FFC4    7C817077  Return to kernel32.7C817077
6FFC8    7C920228  ntdll.7C920228

     Después de ejecutar dicha linea:
6FFB0    0401014 Return to 2.0401014 from user32.MessageBoxA
6FFB4    0000000
     Añade estas 2 lineas.


   
7  Programación / ASM / Re: Mov edi, edi en: 16 Enero 2011, 10:02 am
     Gracias por las respuestas.

     Creo que lo entiendo. En realidad mov edi, edi no sirve para nada, según entendí, mi inglés tampoco es para tirar flores, lo que ocurre es que si hay un 'hook' sustituye esa linea y las 5 anteriores en las que no hay código, solamente NOP, por un salto a otra función que es la encargada de realizar la lectura de la pila o lo que sea.

     Si no entendí mal, el HotPaching lo que hace es sustituir o actualizar código binario sin necesidad de reiniciar. El echo de poner mov edi, edi y no dos nop es porque resulta más rápido leer una instrucción de 2 bytes que no 2 nop, de modo que si no se necesita realizar el hotpaching es más rápido de esa manera.

     Me queda una duda. ¿Es posible mirar a donde salta y lo que hace?.
8  Programación / ASM / Mov edi, edi en: 15 Enero 2011, 21:26 pm
Hola que tal?, soy nuevo en esto del ensamblador y al mirar que hacia la libreria user32.dll cuando le llamas a MessageBox usando OllyDbg, me encontré con este código:
.  Mov edi, edi

Cuando lo ejecuto carga los datos que puse en la pila. ¿Acaso mov no se limita a mover los datos de un argumento a otro?.
   Si alguien me pudiera explicar el porqué de esa instrucción y su funcionamiento, gracias.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines