SRCs de YST.

Iniciado por YST, 2 Abril 2009, 09:07 AM

0 Miembros y 1 Visitante están viendo este tema.

YST

Hola , muchas veces yo eh necesitado poner una cantidad de bytes en 0 , para esto hice una función que haga esto por mi , espero que les sirva.

Código (asm) [Seleccionar]
proc Zerar,Puntero,Cantidad

    push ecx
    push ebx

              mov ecx,[Cantidad]
                 mov ebx,[Puntero]
                .bucle:

                mov byte[ebx+ecx],0
                loop .bucle
                mov byte[ebx],0
                pop ebx
                pop ecx
                ret
endp


Yo le enseñe a Kayser a usar objetos en ASM

Arkangel_0x7C5

#1
buen code, pero el loop es muy lento

mejor así:

Código (asm) [Seleccionar]


ZeroMem proc PMen:dword, SizeMen
push ebx
push ecx
push eax


mov ecx,[SizeMen]
mov ebx,4
mov eax,ecx
div ebx ;Comprueva si es multiplo de 4
cmp edx,0
je Mul4
sub ecx,edx
lea edx,[ecx+edx]
                                mov ebx,[PMen]
                                xor eax,eax

NoZero:
dec edx
mov byte ptr[ebx+edx],eax

cmp edx,ecx
jne NoZero
Mul4:
xor eax,eax
mov ebx,[PMen]

siguiente:
sub ecx,4
mov [ebx+ecx],eax ;Pone a cero hasta que ecx sea zero
jecxz zero
jmp siguiente
zero:

pop eax
pop ecx
pop ebx

ret

ZeroMem endp



saludos

Eternal Idol

Arcangel_0x7C5: ¿Y si SizeMen no es multiplo de 4? Digamos que es 5 ...

Igual supongo que ambos podrian usar rep movs ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Arkangel_0x7C5

pos lo canbias un poco, yo es que todo lo que necesito poner a cero es multiplo de 4. Porque no uso los 64bist, y para las cadenas ya le pongo yo el 0 final

Eternal Idol

Entonces no es mejor asi, el codigo original no produce una excepcion al pasarle un tamaño de 5.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Arkangel_0x7C5

alegrado, ya no produce una excepción

YST

#6
Hola , luego de un buen rato programando , viendo manuales de el formato PE ( si gustan luego los posteo ) , termine la función GetAddressFunction quer permite obtener la dirección de cualquier función de una libreria , mediante el handle de la libreria (devuelto por LoadLibrary por ejemplo ) y el nombre de la función , esta función es muy util para  shellcode , la función comparar tanto como la función len no son mias las pase para que se pudieran ensamblar con FASM ya que las originales son de MASM ( http://www.asmcommunity.net/board/index.php?topic=2626.0 ) , espero que les sea de utilidad.
Código (ASM) [Seleccionar]
proc GetAddressFunction,LibHandle,Api
locals
DirPEHeader dd ?
PunteroPEHeader dd ?
RVAofExportDirectory   dd ?
NumberOfNames dd ?
AddressOfNames dd ?
AddressOfFunctions dd ?
endl
push ebx  edx  edi  ecx
mov eax,[LibHandle]
cmp eax,NULL
je .Error
push dword[eax + 03Ch]
pop  [DirPEHeader]
push [DirPEHeader]
pop [PunteroPEHeader]
add  [PunteroPEHeader],eax
mov ebx,[PunteroPEHeader]
cmp word[ebx],"PE"
jne .Error
push dword[ebx+078h]
pop [RVAofExportDirectory]
mov ebx, [RVAofExportDirectory]
add ebx,eax
push dword[ebx+018h]
pop [NumberOfNames]
mov edx,[NumberOfNames]
push dword[ebx+20h]
pop [AddressOfNames]
mov ebx, [AddressOfNames]
add ebx,eax
mov ecx,[NumberOfNames]
mov edi,0

push [LibHandle]
pop [AddressOfFunctions]
mov ebx,[RVAofExportDirectory]
add  eax ,ebx
push   dword[eax+1ch]
pop [AddressOfFunctions]
.encontrar:
  mov eax, 0x4
  mul edi
  mov ebx,eax
  add ebx,[AddressOfNames]
  add  ebx,[LibHandle]
  mov eax, [ebx]
  add eax, [LibHandle]
add edi,1
  stdcall comparar, [Api], eax
  cmp ecx,NULL
  je .Error
  cmp eax, 0
jne .encontrar
dec edi
rol edi,2
mov eax,edi
add eax, [AddressOfFunctions]
add eax,[LibHandle]
mov eax, dword[eax]
add eax,[LibHandle]
pop  ecx edi edx ebx
ret
.Error:
xor eax,eax   ; xor eax,eax = NULL
ret
ret
endp
proc comparar ,SRC,DST
push edi ecx esi
stdcall Len,[SRC]
inc eax
mov ecx,eax
mov esi,[SRC]
mov edi,[DST]
repz cmpsb
mov eax,1
jnz Next
dec eax
Next:
pop esi ecx edi
ret
endp

proc Len , SRC
push ecx edi
mov ecx,-1
mov edi,[SRC]
mov al,0
repnz scasb
mov eax,ecx
not eax
dec eax
pop edi ecx
ret
endp


Una forma de obtener el handle de la kernel32 ( fuente: hackhound.org ):
Código (ASM) [Seleccionar]

           mov   eax, [fs:30h]
    mov   eax, [eax + 0ch]
    mov   esi, [eax + 1ch]
    lodsd
    mov  eax, [eax + 08h]


Yo le enseñe a Kayser a usar objetos en ASM

YST

#7
Hola , basado en el source que hice para obtener la dirección de la función que uno desee de una libreria , hice un pequeño programa para listar todas las funciones de una libreria ( .dll ) , modificandolo un poco se podria hacer que este mismo programa cree .inc como el "kernel32.inc" que se encuentra en el fasm , que tiene todas (o casi todas ) las api's de la kernel32.dll , espero que les sirva de algo.
Código (ASM) [Seleccionar]
format pe console
espacio equ 13,10,0
include 'win32ax.inc'
.code
start:
invoke LoadLibrary,"user32.dll"
stdcall    ListarFunciones,eax
invoke ExitProcess,0
proc ListarFunciones,LibHandle
locals
DirPEHeader dd ?
PunteroPEHeader dd ?
RVAofExportDirectory   dd ?
NumberOfNames dd ?
AddressOfNames dd ?
endl
push ebx  edx  edi  ecx
mov eax,[LibHandle]
cmp eax,NULL
je .Error
push dword[eax + 03Ch]
pop  [DirPEHeader]
push [DirPEHeader]
pop [PunteroPEHeader]
add  [PunteroPEHeader],eax
mov ebx,[PunteroPEHeader]
cmp word[ebx],"PE"
jne .Error
push dword[ebx+078h]
pop [RVAofExportDirectory]
mov ebx, [RVAofExportDirectory]
add ebx,eax
push dword[ebx+018h]
pop [NumberOfNames]
mov edx,[NumberOfNames]
push dword[ebx+20h]
pop [AddressOfNames]
mov ebx,[NumberOfNames]
mov        edi, [AddressOfNames]
    add        edi,[LibHandle]
.bucle:
dec ebx
mov        eax, [edi + ebx * 4]
add eax,[LibHandle]
invoke printf,eax
  invoke printf,espacio
  cmp ebx,0
  jne .bucle
pop  ecx edi edx ebx
ret
.Error:
ret
endp
.end start


Yo le enseñe a Kayser a usar objetos en ASM

YST

#8
Cita de: Eternal Idol en 02 Abril 2009, 13:28
Arcangel_0x7C5: ¿Y si SizeMen no es multiplo de 4? Digamos que es 5 ...

Igual supongo que ambos podrian usar rep movs ...
Hola , Eternal Idol , podrias poner un ejemplo , por que entiendo o creo entender el funcionamiento de movsx (mosvb,movsw,etc.. ) y segun tengo entendido la cantidad de 0 tendria que ser igual a la cantidad que se quiera rellenar con estos , tal vez me estoy confundiendo ya que para ser sincero nunca eh usado mosvx , me encantaria ver un source que rellene usando mosvx . Arcangel_0x7C5  ahora leere tu codigo , aunque a simple vista me parece mas rapido mi source , seria interesante que me dijieras como sacas lo que se demora cada instrucción , ya que desconozco como tomarles el tiempo  ;)


Yo le enseñe a Kayser a usar objetos en ASM

YST

#9
Lo modifique y ahora crea imports para fasm a partir de cualquier libreria  ;D

Código (ASM) [Seleccionar]

format pe console
espacio equ 13,10,0
include 'win32ax.inc'
.code
start:

stdcall CrearImport,"user32.dll","user32.inc"
invoke ExitProcess,0
proc CrearImport,NombreLIB,NombreImport
locals
DirPEHeader dd ?
PunteroPEHeader dd ?
RVAofExportDirectory   dd ?
NumberOfNames dd ?
AddressOfNames dd ?
Funcion dd ?
HFile dd ?
Nosirve dd ?
Largo dd ?
LibHandle dd ?
endl
push ebx  edx  edi  ecx
    invoke LoadLibrary, [NombreLIB]
    mov [LibHandle],eax
cmp eax,NULL
je .Error
push dword[eax + 03Ch]
pop  [DirPEHeader]
push [DirPEHeader]
pop [PunteroPEHeader]
add  [PunteroPEHeader],eax
mov ebx,[PunteroPEHeader]
cmp word[ebx],"PE"
jne .Error
push dword[ebx+078h]
pop [RVAofExportDirectory]
mov ebx, [RVAofExportDirectory]
add ebx,eax
push dword[ebx+018h]
pop [NumberOfNames]
mov edx,[NumberOfNames]
push dword[ebx+20h]
pop [AddressOfNames]
mov ebx,[NumberOfNames]
mov        edi, [AddressOfNames]
    add        edi,[LibHandle]



               invoke CreateFileA, [NombreImport], GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0
                mov [HFile], eax
                invoke lstrlen,"import "
            invoke WriteFile, [HFile], "import ",eax,addr Nosirve, NULL
                 invoke lstrlen,[NombreLIB]
                 sub eax,4
                invoke WriteFile, [HFile], [NombreLIB],eax,addr Nosirve, NULL
                invoke WriteFile,[HFile] , ",\",2,addr Nosirve, NULL
                             invoke WriteFile, [HFile], espacio,2,addr Nosirve, NULL

.bucle:
dec ebx
mov        eax, [edi + ebx * 4]
add eax,[LibHandle]
mov [Funcion],eax
        invoke lstrlen, [Funcion]
                invoke WriteFile, [HFile], [Funcion],eax,addr Nosirve, NULL
                invoke WriteFile, [HFile],",",1,addr Nosirve, NULL

                              invoke WriteFile, [HFile],"'",1,addr Nosirve, NULL
                                      invoke lstrlen, [Funcion]
                invoke WriteFile, [HFile], [Funcion],eax,addr Nosirve, NULL
                .if ebx = 0
                      invoke WriteFile, [HFile],"'",1,addr Nosirve, NULL
                .else
                  invoke WriteFile, [HFile],"',\",3,addr Nosirve, NULL
              invoke WriteFile, [HFile], espacio,2,addr Nosirve, NULL
              .endif
  cmp ebx,0
  jne .bucle
            invoke CloseHandle, [HFile]
pop  ecx edi edx ebx
ret
.Error:
ret
endp
.end start


Yo le enseñe a Kayser a usar objetos en ASM