Autor
|
Tema: SRCs de YST. (Leído 39,792 veces)
|
YST
Desconectado
Mensajes: 965
I'm you
|
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
|
|
« Última modificación: 31 Mayo 2009, 03:46 am por YST »
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 361
|
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
|
|
« Última modificación: 2 Abril 2009, 14:37 pm por Arcangel_0x7C5 »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
Arcangel_0x7C5: ¿Y si SizeMen no es multiplo de 4? Digamos que es 5 ...
Igual supongo que ambos podrian usar rep movs ...
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 361
|
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
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
Entonces no es mejor asi, el codigo original no produce una excepcion al pasarle un tamaño de 5.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 361
|
alegrado, ya no produce una excepción
|
|
|
En línea
|
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
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]
|
|
« Última modificación: 31 Mayo 2009, 03:47 am por YST »
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
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
|
|
« Última modificación: 31 Mayo 2009, 03:47 am por YST »
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
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
|
|
« Última modificación: 31 Mayo 2009, 03:48 am por YST »
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
Lo modifique y ahora crea imports para fasm a partir de cualquier libreria 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
|
|
« Última modificación: 31 Mayo 2009, 03:49 am por YST »
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
|
|