Autor
|
Tema: Analisis de stub.dll con Java (Leído 7,706 veces)
|
rub'n
Desconectado
Mensajes: 1.217
(e -> λ("live now")); tatuar -> λ("α");
|
Buenas que tal? alguna sugerencia de como podria decompilar este stub.dll ? no esta ofuscado se carga desde
para luego cifrar las clases que contiene con DES y crear un server, quiero saber su funcionamiento bueno si alguien me da una sugerencia pues bien, otra cosa no posee runPE, No pareciera estar con JNA O JNI. La imagen de abajo no me muestra nada ojo uso este soft solo para motivos de exploración. https://drive.google.com/open?id=1JpTcaZ9NDUG3I1lnQSY4CxMzKLhfuP0v
|
|
« Última modificación: 5 Febrero 2019, 20:31 pm por rub'n »
|
En línea
|
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
|
|
|
fary
|
¿De donde sacaste este Stub? ¿Es de algún cripter? ¿En que lenguaje esta creado?
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
rub'n
Desconectado
Mensajes: 1.217
(e -> λ("live now")); tatuar -> λ("α");
|
¿De donde sacaste este Stub? ¿Es de algún cripter? ¿En que lenguaje esta creado?
Como esta jefe gracias por la pronta respuesta, pues casi me infectan con Unrecom RAT ese stub esta en su source, que se usa para crear el server en runtime se cifran esas clases que contiene con RSA y AES, el caso de arriba el cifrado DES lo usa una version anterior a este Unrecom segun el source se parece bastante. Esta ofuscado el cliente con allatori demo 4.7 pero el stub es otra cosa se cifra desde el propio cliente aparte
|
|
« Última modificación: 16 Enero 2018, 16:03 pm por rub'n »
|
En línea
|
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
|
|
|
fary
|
Pero... si mal no recuero JAVA no compila sus archivos quizás baste con renombrar el Stub.dll a la extensión que tenga java y abrirlo con el editor de JAVA....
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
rub'n
Desconectado
Mensajes: 1.217
(e -> λ("live now")); tatuar -> λ("α");
|
Pero... si mal no recuero JAVA no compila sus archivos quizás baste con renombrar el Stub.dll a la extensión que tenga java y abrirlo con el editor de JAVA.... Aun nada ni con extensión .java ni .class wtf el .class al querer decompilar javap -c stub.class arroja error y el .java igual, bueno ese stub.dll salen codificados de manera extraña, pero viendo bien en una de esas palabras al final del archivo salen nombres de algunas clases, clases que como mencione arriba, son usadas para generar el server, y que analizando el server o sea, descomprimiendo el .jar, aparacen dichas clases cifradas
|
|
« Última modificación: 19 Enero 2018, 17:22 pm por rub'n »
|
En línea
|
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
|
|
|
fary
|
Entonces sigue depurando a partir de la línea donde se carga:
Y mira que hace con el archivo, quizás te de mas información acerca de su extensión o de como esta cifrado. saludos.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
rub'n
Desconectado
Mensajes: 1.217
(e -> λ("live now")); tatuar -> λ("α");
|
Entonces sigue depurando a partir de la línea donde se carga:
Y mira que hace con el archivo, quizás te de mas información acerca de su extensión o de como esta cifrado. saludos. Hola Fary que estés bien dog, sabes que en unos de esos días logre solucionar, pues resulta que el stub.dll en realidad es un .jar(pero no funciona con solo renombrarlo a .jar y ya), algún método se uso para comprimir los bytecode dentro de una .dll, lo desconozco pero si se que hay la forma, el codigo para extraer el stub.dll es el siguiente, lo que hace es leerlo completamente y guardarlo en un .jarpublic class CrearJar implements ShowData { private static final Path STUB_PATH = Paths.get("src/main/resources/stub.dll"); private static final Path DESTINO_STUB = Paths.get("src/main/resources/clasesStub.jar"); public CrearJar() { init(); } /** * lee el path donde esta el stub.dll y volca el contenido en un .jar */ private void init() { while((jarEntry = jarInputStream.getNextJarEntry()) != null) { if(predicate(jarEntry)) { getLogger().info(jarEntry.getName()); jarOutputStream.putNextEntry(jarEntry); jarOutputStream.write(readAllBytes(jarInputStream)); jarOutputStream.flush(); } } getLogger().severe(ex.getMessage(),ex); } } /** * Validar el jarEntry * @param jarEntry que se le hara el test * @return boolean true si son solo clases, y que no sean directorios, ni tengan $ */ private boolean predicate (final JarEntry jarEntry ) { final Predicate<JarEntry> predicate = p -> !jarEntry.isDirectory() && jarEntry.getName().endsWith(".class") && !jarEntry.getName().contains("$"), || jarEntry.getName().contains("_"); return predicate.test(jarEntry); } /** * * @return all bytes from stub */ final byte[] bytesread = new byte[1024]; int dataRead; while((dataRead = input.read(bytesread)) != -1) { baos.write(bytesread,0,dataRead); } return baos.toByteArray(); getLogger().severe(null,ex); } return new byte[0]; }
Salida linea 23 del método init()19:08:06.783 [main] INFO CrearJar - Desinstala.class 19:08:06.783 [main] INFO CrearJar - Principal.class 19:08:06.783 [main] INFO CrearJar - extra/ClassLoaderMod.class 19:08:06.783 [main] INFO CrearJar - extra/Constante.class 19:08:06.783 [main] INFO CrearJar - extra/Constantes.class 19:08:06.783 [main] INFO CrearJar - extra/RegistryUtils.class 19:08:06.799 [main] INFO CrearJar - opciones/Archivo.class 19:08:06.799 [main] INFO CrearJar - opciones/DesUAC.class 19:08:06.799 [main] INFO CrearJar - opciones/EnviarFile.class 19:08:06.799 [main] INFO CrearJar - opciones/Informacion.class 19:08:06.799 [main] INFO CrearJar - opciones/Instalador.class 19:08:06.799 [main] INFO CrearJar - opciones/Interface_.class 19:08:06.799 [main] INFO CrearJar - opciones/Kille.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion1.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion10.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion12.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion13.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion14.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion2.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion5.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion6.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion7.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion7b.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion8.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion9.class 19:08:06.799 [main] INFO CrearJar - opciones/Opcion9b.class 19:08:06.799 [main] INFO CrearJar - opciones/OrdenCaptura.class 19:08:06.799 [main] INFO CrearJar - opciones/PassAll.class 19:08:06.799 [main] INFO CrearJar - opciones/Pina.class 19:08:06.799 [main] INFO CrearJar - opciones/WebBot.class 19:08:06.799 [main] INFO CrearJar - opciones/a.class 19:08:06.799 [main] INFO CrearJar - opciones/interfaceInfo.class 19:08:06.799 [main] INFO CrearJar - opciones/passFilezilla.class 19:08:06.799 [main] INFO CrearJar - opciones/passIDM.class 19:08:06.799 [main] INFO CrearJar - opciones/passNoip.class
Aquí esta la main class, el servidor lee el password contenido en un .xml, para descifrar los bytecodes en runtime y cargarlos en memoria por medio del custom classloader, se ven otras versiones de arabes donde esa contraseña esta alojada en un json Clase que descifra contenida solo en el servidor, la linea 19, en el método init() se le setea un dos es decir Cipher.DECRYPT_MODEpackage extra; import java.io.ByteArrayOutputStream; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; public class Constante { public Constante() { } public static byte[] Constantino (String contrasena, byte[] input ) { try { SecretKeyFactory skf = SecretKeyFactory. getInstance(new String(new char[]{'D', 'E', 'S'})); DESKeySpec kspec = new DESKeySpec(contrasena.getBytes()); SecretKey ks = skf.generateSecret(kspec); Cipher c = Cipher. getInstance(new String(new char[]{'D', 'E', 'S'})); c.init(2, ks); byte[] tmp = c.update(input, 0, input.length); out.write(tmp); tmp = c.doFinal(); out.write(tmp); out.close(); return out.toByteArray(); return null; } } }
Update Try/catch con BufferedOutputStream
|
|
« Última modificación: 8 Junio 2019, 21:56 pm por rub'n »
|
En línea
|
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
|
|
|
fary
|
Enhorabuena rub'n!!! Me alegro de que pudieses resolverlo saludos!!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
colcrt
Desconectado
Mensajes: 87
|
rub'n muy interesante, una pregunta como hace para detectar ese tipo de malware??
|
|
|
En línea
|
|
|
|
rub'n
Desconectado
Mensajes: 1.217
(e -> λ("live now")); tatuar -> λ("α");
|
rub'n muy interesante, una pregunta como hace para detectar ese tipo de malware??
Pues obviamente por el código, siempre y cuando no este ofuscado, cifrado etc, incluso ofuscado algunas veces puedes llegar a interpretar, pero no es lo ideal,
A parte debes conocer el lenguaje de dicho malware, te ayudara mas rápido a su entendimiento.
|
|
|
En línea
|
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Ayuda] Stub.dll Indetectar
Dudas Generales
|
NyxKazuya
|
3
|
5,626
|
2 Marzo 2011, 06:26 am
por SuperDraco
|
|
|
Acerca de DOS stub
ASM
|
x64core
|
7
|
4,376
|
2 Junio 2012, 00:21 am
por H1tchclock
|
|
|
[?] Indetectar Stub + Dudas
Análisis y Diseño de Malware
|
MeCraniDOS
|
5
|
5,162
|
18 Noviembre 2012, 12:57 pm
por Danyfirex
|
|
|
que es un stub viene con el crypter
Análisis y Diseño de Malware
|
full159
|
2
|
4,139
|
19 Agosto 2014, 06:03 am
por Mr.Virus
|
|
|
Stub en VB 6
Programación Visual Basic
|
Rama_04
|
1
|
2,298
|
29 Diciembre 2014, 20:10 pm
por mhcruz
|
|