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).
;Busca offsets - by pablomi
.386
.model flat, stdcall
option casemap :none
include \masm32\include\masm32rt.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
Main PROTO
.data
libreria db "msvcrt.dll",0
funcion db "printf",0
error db "No se encontro el proceso.",0
.code
codigo:
invoke Main
invoke ExitProcess, 0
Main PROC
LOCAL resultado:DWORD
invoke LoadLibrary, addr libreria
invoke GetProcAddress, eax, addr funcion
mov resultado, eax
cmp resultado, NULL
je Error
invoke StdOut, uhex$(resultado)
ret
Error:
invoke StdOut, addr error
ret
Main ENDP
end codigo
Espero críticas, sugerencias o lo que sea :xD
Una critica al ojó no mas es en vez de esto
Main PROC
LOCAL resultado:DWORD
invoke LoadLibrary, addr libreria
invoke GetProcAddress, eax, addr funcion
mov resultado, eax
cmp resultado, NULL
je Error
invoke StdOut, uhex$(resultado)
ret
Error:
invoke StdOut, addr error
ret
Main ENDP
pone esto
Main PROC
LOCAL resultado:DWORD
invoke LoadLibrary, addr libreria
invoke GetProcAddress, eax, addr funcion
cmp eax, NULL
je Error
mov resultado, eax ;Si no quieres usar la variable imprime directamente eax
invoke StdOut, uhex$(resultado)
ret
Error:
invoke StdOut, addr error
ret
Main ENDP
Pensé que después de hacer cmp eax perdería su valor del invoke.
También me comentaron que en vez de:
cmp resultado, NULL
pusiera:
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!
Cita de: pablomi 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:
cmp resultado, NULL
pusiera:
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
Cita de: YST en 6 Febrero 2011, 05:41 AM
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,
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.
Versión por argumentos, agradecimientos a Space.Medafighter.X :rolleyes:
;Busca offsets cli - by pablomi
.386
.model flat, stdcall
option casemap :none
include \masm32\include\masm32rt.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
.data
error db "No se encontro la funcion.",0
.data?
libreriaTMP dd ?
libreria db 256 dup(?)
funcionTMP dd ?
funcion db 256 dup(?)
argc dd ?
.code
codigo:
invoke GetCommandLineW
invoke CommandLineToArgvW, eax, addr argc
or eax, eax
cmp dword ptr argc, 3
jb @f
mov ebx, dword ptr[eax+4]
mov dword ptr libreriaTMP, ebx
mov ebx, dword ptr[eax+8]
mov dword ptr funcionTMP, ebx
invoke WideCharToMultiByte,CP_ACP,0,dword ptr libreriaTMP,-1,addr libreria,256d,0,0
invoke WideCharToMultiByte,CP_ACP,0,dword ptr funcionTMP,-1,addr funcion,256d,0,0
invoke LoadLibrary, addr libreria
invoke GetProcAddress, eax, addr funcion
or eax, eax
je Error
invoke StdOut, uhex$(eax)
invoke ExitProcess, 0
Error:
invoke StdOut, addr error
@@: invoke ExitProcess, 0
end codigo
CitarC:\Users\Pablo\Desktop>bOffsets msvcrt.dll system
7545B16F
C:\Users\Pablo\Desktop>bOffsets msvcrt.dll printf
7541C5B9
C:\Users\Pablo\Desktop>
Saludos!