sábado, 5 de febrero de 2011

[MASM] Busca offsets

Bueno, hace unos días empecé a aprender ASM y aquí está mi primera aplicacion (sintaxis MASM).

Lo que hace es buscar el offset de una función específica en una DLL. Solo hay que modificar "libreria" y "funcion" en .data.

;Busca offsets - by xassiz
.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




Ahora versión para linea de comandos:
;Busca offsets cli - by xassiz
.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


C:\Users\Pablo\Desktop>bOffsets msvcrt.dll system
7545B16F
C:\Users\Pablo\Desktop>bOffsets msvcrt.dll printf
7541C5B9
C:\Users\Pablo\Desktop>

Espero que os sirva xD

bytes!

2 comentarios:

Está muy interesante, pero me queda una duda, ¿ sería posible utilizar el mismo método en los archivos .elf ?

Saludos

No creo, aquí se utilizan funciones de MSDN (como LoadLibrary y GetProcAddress).

Abría que usar algo como dlopen() y dlsym().

Saludos!

Publicar un comentario