Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: xassiz~ en 5 Febrero 2011, 22:36 pm



Título: [MASM] Busca offsets
Publicado por: xassiz~ en 5 Febrero 2011, 22:36 pm
Bueno, os dejo mi primera aplicación en ASM (MASM32).

Busca el offset de una función específica en una DLL. Solo hay que modificar "libreria" y "funcion" en .data (tengo que aprender a hacerlo pasando parámetros por línea de comandos).

Código
  1. ;Busca offsets - by pablomi
  2. .386
  3. .model flat, stdcall
  4. option casemap :none
  5.  
  6. include \masm32\include\masm32rt.inc
  7. includelib \masm32\lib\kernel32.lib
  8. includelib \masm32\lib\user32.lib
  9. includelib \masm32\lib\masm32.lib
  10.  
  11. Main PROTO
  12.  
  13. .data
  14.    libreria db "msvcrt.dll",0
  15.    funcion db "printf",0
  16.    error db "No se encontro el proceso.",0
  17.  
  18. .code
  19. codigo:
  20.    invoke Main
  21.    invoke ExitProcess, 0
  22.  
  23. Main PROC
  24.    LOCAL resultado:DWORD
  25.  
  26.    invoke LoadLibrary, addr libreria
  27.    invoke GetProcAddress, eax, addr funcion
  28.    mov resultado, eax
  29.    cmp resultado, NULL
  30.    je Error
  31.    invoke StdOut, uhex$(resultado)
  32.    ret
  33. Error:
  34.    invoke StdOut, addr error
  35.    ret
  36. Main ENDP
  37.  
  38. end codigo

Espero críticas, sugerencias o lo que sea :xD


Título: Re: [MASM] Busca offsets
Publicado por: YST en 5 Febrero 2011, 23:11 pm

Una critica al ojó no mas es en vez de esto


Código
  1.  
  2. Main PROC
  3.    LOCAL resultado:DWORD
  4.  
  5.    invoke LoadLibrary, addr libreria
  6.    invoke GetProcAddress, eax, addr funcion
  7.    mov resultado, eax
  8.    cmp resultado, NULL
  9.    je Error
  10.    invoke StdOut, uhex$(resultado)
  11.    ret
  12. Error:
  13.    invoke StdOut, addr error
  14.    ret
  15. Main ENDP


pone esto


Código
  1.  
  2. Main PROC
  3.    LOCAL resultado:DWORD
  4.  
  5.    invoke LoadLibrary, addr libreria
  6.    invoke GetProcAddress, eax, addr funcion
  7.  
  8.    cmp eax, NULL
  9.    je Error
  10.  
  11.    mov resultado, eax ;Si no quieres usar la variable  imprime directamente eax  
  12.  
  13.   invoke StdOut, uhex$(resultado)
  14.    ret
  15. Error:
  16.    invoke StdOut, addr error
  17.    ret
  18. Main ENDP


Título: Re: [MASM] Busca offsets
Publicado por: xassiz~ en 6 Febrero 2011, 00:30 am
Pensé que después de hacer cmp eax perdería su valor del invoke.

También me comentaron que en vez de:
Código
  1. cmp resultado, NULL
pusiera:
Código
  1. or eax, eax
ya que los registros son más rápidos que las variables, y según Intel or es más rápido que cmp.


Saludos!


Título: Re: [MASM] Busca offsets
Publicado por: YST en 6 Febrero 2011, 05:41 am
Pensé que después de hacer cmp eax perdería su valor del invoke.

También me comentaron que en vez de:
Código
  1. cmp resultado, NULL
pusiera:
Código
  1. or eax, eax
ya que los registros son más rápidos que las variables, y según Intel or es más rápido que cmp.


Saludos!

Claro , pero or te modifica eax xD


Título: Re: [MASM] Busca offsets
Publicado por: Space.Medafighter.X en 11 Febrero 2011, 18:58 pm
Claro , pero or te modifica eax xD

No si el destino es igual a la fuente. El API GetProcAddress como bien sabemos, si la función falla, devuelve EAX = 0, entonces, en caso de ser 0, el valor no se vería afectado, pero si EAX tiene un valor X y se hace un OR EAX,EAX no estas modificando el valor de EAX. En otras palabras, se puede usar un OR para saber si el valor no es igual a 0 sin que afecte en absoluto.

Por lo tanto,

Código:
Main PROC
    LOCAL resultado:DWORD
 
    invoke LoadLibrary, addr libreria
    invoke GetProcAddress, eax, addr funcion
 
    or eax,eax
    je Error
 
    mov resultado, eax ;Si no quieres usar la variable  imprime directamente eax   
 
   invoke StdOut, uhex$([b]eax[/b])
    ret
Error:
    invoke StdOut, addr error
    ret
Main ENDP

Es correcto, obviando que no lo sería si necesitaramos usar la dirección del API en un código más grande.

Otra alternativa "no-destructiva" a OR es TEST, aunque en este caso no es necesaria, y una "destructiva", además de OR es AND para este caso.

Pasando al tema del código, puedes remover ese stack frame que creas con el macro "PROC", que ni se para que lo usas xD.


Título: Re: [MASM] Busca offsets
Publicado por: xassiz~ en 12 Febrero 2011, 00:53 am
Versión por argumentos, agradecimientos a Space.Medafighter.X  :rolleyes:

Código
  1. ;Busca offsets cli - by pablomi
  2. .386
  3. .model flat, stdcall
  4. option casemap :none
  5.  
  6. include \masm32\include\masm32rt.inc
  7. includelib \masm32\lib\kernel32.lib
  8. includelib \masm32\lib\user32.lib
  9. includelib \masm32\lib\masm32.lib
  10.  
  11. .data
  12.    error db "No se encontro la funcion.",0
  13. .data?
  14.    libreriaTMP dd ?
  15.    libreria db 256 dup(?)
  16.    funcionTMP dd ?
  17.    funcion db 256 dup(?)
  18.    argc dd ?
  19.  
  20.  
  21. .code
  22. codigo:
  23.    invoke GetCommandLineW
  24.    invoke CommandLineToArgvW, eax, addr argc
  25.    or eax, eax
  26.    cmp dword ptr argc, 3
  27.    jb @f
  28.    mov ebx, dword ptr[eax+4]
  29.    mov dword ptr libreriaTMP, ebx
  30.    mov ebx, dword ptr[eax+8]
  31.    mov dword ptr funcionTMP, ebx
  32.    invoke WideCharToMultiByte,CP_ACP,0,dword ptr libreriaTMP,-1,addr libreria,256d,0,0
  33.    invoke WideCharToMultiByte,CP_ACP,0,dword ptr funcionTMP,-1,addr funcion,256d,0,0
  34.    invoke LoadLibrary, addr libreria
  35.    invoke GetProcAddress, eax, addr funcion
  36.    or eax, eax
  37.    je Error
  38.    invoke StdOut, uhex$(eax)
  39.    invoke ExitProcess, 0
  40. Error:
  41.    invoke StdOut, addr error
  42.    @@: invoke ExitProcess, 0
  43. end codigo
  44.  
Citar
C:\Users\Pablo\Desktop>bOffsets msvcrt.dll system
7545B16F
C:\Users\Pablo\Desktop>bOffsets msvcrt.dll printf
7541C5B9
C:\Users\Pablo\Desktop>

Saludos!