como hacen los malware para executarse con inyeccion y sin DLL?

Iniciado por Belial & Grimoire, 29 Agosto 2011, 04:40 AM

0 Miembros y 1 Visitante están viendo este tema.

Belial & Grimoire

hola

como hacen lo malware para ejecutarse haciendo inyeccion sin dll?, porque estaba intenando hacer inyecciones y con DLL no tengo problemas pero sin dll no puedo ejecutar funciones a menos que sean invokadas por estructuras, pero como crear una conexion socket unicamente con apis y estructuras?

y e visto troyanos que dicen que se ejecutan sin DLL, pero no encuentro como hacerlo, alguien aqui conoce algo sobre esto?, lo que intentaba hacer era en lenguaje C, hacer una inyeccion sencilla a notepad.exe, e invokar apis es sencillo, pero no puedo inyectar alguna funcion para ejecutar cualquier cosa, a menos de que sea otra api

o alguien me puede explicar de que forma serviria hacer una inyeccion sin dll, para hacking... ya sea, troyanos, exploits, gusanos, etc... porque como les menciono la unica forma que se, es usando dll y se me hizo interesante hacer sin eso

espero alguien tenga alguna informacion o idea...

salu2
.                                 

Karman

hay un post en este foro del user [ZERO] (si mal no recuerdo) que explica como hacerlo, buscalo  :P

S2

Belial & Grimoire

#2
hola

si se como hacerlo, pero lo que no encuentro es en que puede ayudar si solo logro invocar apis, me dijo Eternal Idol que es imposible hacer algo como esto, y puse de referencia el tuto de E0N

CitarDWORD inyectada (datos *data)
{
MessageBoxA (0, data->mensaje, data->titulo, 0);
return 0;
}


Eso no funcionara nunca, el codigo a inyectar en tu programa usa la tabla de importacion para llamar a la API y esta no coincide (salvo por una casualidad) con la del programa inyectado.

se me habia ocurrido llamar a una funcion con CreateThread pero me aparece un error, solo puedo llamar desde esa funcion a una estructura


DWORD inyectada (datos *data)
{
data - >MessageBoxA (0, data->mensaje, data->titulo, 0);
return 0;
}


tambien intente reservar espacio para esa funcion, escribirla y llamarla con CreateThread, pero igual me sale un error

por lo que llego a ver esto lo puedo usar unicamente para abrir alguna aplicacion o DLL, por ejemplo que se autoinicie el programa, que abra espacio para inyeccion y que notepad abra la aplicacion o la DLL

pero seria igual a una inyeccion con DLL o que sobreescriba notepad agregando codigo... pero hay antivirus que checan el hash

la unica ventaja seria que mi aplicacion no abriria nada seria notepad y seria menos evidente que puede ser un malware

mmm, bueno mas que nada queria checar esto porque nunca me a gustado usar muchos archivos, porque supuestamente todo tiene que se sigiloso, asi puedo ver que fallos encuentro en mi computadora

sino pues continuare con inyeccion en DLL y vere si el metodo Meepa me puede ayudar en hacerlo menos evidente... aunque no logro hacer ese metodo en Win7 solo pude en WinXP

bueno, si algun tiene una opinion o una idea mas, se lo agradezco

salu2
.                                 

Karman

#3
no entendí muy bien lo que querés hacer (si es inyectar tu EXE a otro proceso y llamar a API's, etc, fijate el post que te comenté), si por otro lado, querés inyectar código a otro proceso y que use API's y/o que te inyecte/cargue a vos mismo (EXE o DLL) ya es más complejo, pero en resumidas cuentas los pasos serían los del ejemplo de EON (pero con más API's), si no es ninguno de los dos pues trata de explicarte mejor porque no te entiendo  :P

acá tenes otro ejemplo de más o menos lo mismo: http://foro.elhacker.net/programacion_cc/inyeccion_dll-t169870.0.html

S2

Belial & Grimoire

entonces todo lo tengo que hacer asi verdad?

struct iDat
{
sCreateMutex pCreateMutex;
};

//////////////////////

DWORD Resident(iDat *base)
{
//creamos el mutex "Resident" para marcar el proceso como
//inyectado
base->pCreateMutex(NULL, 0, base->Mutex);
}

////////////////////////////////

dat.pCreateMutex = (sCreateMutex)GetAdres("KERNEL32.DLL", "CreateMutexA");


y si por ejemplo quisiera iniciar un socket?

tendria que llamar la api de socket, darle los parametros a la estructura iDat y ejecutarlo desde la funcion Resident?

porque bueno, logro hacer todo esto que coloque... y si lo entiendo, pero tendria que hacer todo lo que necesite con estructuras, por ejemplo

pipe, socket, etc...?

y funciones extras como Send y Recv o conect, etc?, donde las colocaria?, eso es lo que no entiendo, como o donde colocar todo lo demas que necesite?

espero darme a entender, las apis se como usarlas y donde van, pero los demas parametros no se donde colocarlos

otro ejemplo

aqui podria usar un for( ; ; ) ? y si puedo donde o como lo hago funcionar desde la inyeccion?, porque se que no puedo hacer esto

DWORD Resident(iDat *base)
{
base->pCreateMutex(NULL, 0, base->Mutex);
for(i = 0; i<2, i++);
};


espero esto pueda hacer mas facil enteder mi duda, soy malo explicando jaja

salu2 y gracias
.                                 

Karman

#5
Cita de: Belial & Grimoire en 30 Agosto 2011, 20:00 PMy si por ejemplo quisiera iniciar un socket?

tendria que llamar la api de socket, darle los parametros a la estructura iDat y ejecutarlo desde la funcion Resident?

porque bueno, logro hacer todo esto que coloque... y si lo entiendo, pero tendria que hacer todo lo que necesite con estructuras, por ejemplo

pipe, socket, etc...?

y funciones extras como Send y Recv o conect, etc?, donde las colocaria?, eso es lo que no entiendo, como o donde colocar todo lo demas que necesite?

espero darme a entender, las apis se como usarlas y donde van, pero los demas parametros no se donde colocarlos

y si, ese es el problema de usar ese método (por eso te comenté primero lo de inyección del executable donde solo tenes que preocuparte de "inyectarlo bien"), el tema de los parámetros tendrías que hacer algo así:

typedef struct funciones{
 PVOID func1;//no necesariamente PVOID, solo para ejemplo
 PVOID CreateFile;
 PVOID recv;
 //...
 PVOID funcN;
};

typedef struct datos{
 HANDLE hFile;
 SOCKET s;
 CHAR nombre[XX];
 PVOID buffer[512];//etc...
};

struct me{
 funciones f;
 datos d;
};

void X(struct me *yo){
 yo->d.hFile=yo->f.CreateFile(yo->d.nombre/*...*/);
 //....
 yo->f.recv(yo->d.s,yo->d.buffer,512,0);
}


e incluso podrías tener varias funciones (aunque tendrías que hacer una especie de "relocado")

typedef struct mefunc{
 PVOID init;
 PVOID dosomething;
}

struct me{
 mefunc m;
 funciones f;
 datos d;
};

void init(){
 return;
}

//...
me.m.init=init;
//...
me.m.init+=-mebaseaddres+inyectionaddress;
//...


donde baseaddress sería la dirección de la primera función (suponiendo que estén en orden secuncial) e inyectionaddress la dirección que te devuelve virtualalloc (en la víctima)...

Cita de: Belial & Grimoire en 30 Agosto 2011, 20:00 PMotro ejemplo

aqui podria usar un for( ; ; ) ? y si puedo donde o como lo hago funcionar desde la inyeccion?, porque se que no puedo hacer esto

DWORD Resident(iDat *base)
{
base->pCreateMutex(NULL, 0, base->Mutex);
for(i = 0; i<2, i++);
};


espero esto pueda hacer mas facil enteder mi duda, soy malo explicando jaja

puedes usar cualquier * instrucción del lenguaje sin problemas, el probema es con las llamadas intermodulares (funciones en otros espacios de memoria [dll's])

S2

El * es porque "en teoría" no deberías tener problemas dado que esas instrucciones son traducidas como saltos relativos (en el caso de C++ new y delete obviamente no van a estar disponibles).

Belial & Grimoire

Uff. Creo tendre que repasar mis libros y repasar usos de estructuras jeje

Creo esta vez usaren bastantes... bueno no importa mientras aprenda mas es mejor

Gracias por la ayuda y la paciencia
.                                 

[Zero]

En el caso que te comentó Eternal Idol, que no te funcionaría porque la IAT no estaría con los datos adecuados, "simplemente" la rellenas a mano y listo. Otro problema sería la dirección base del ejecutable, te dejo el link al post que mencionó Karman:
http://foro.elhacker.net/analisis_y_diseno_de_malware/ejecucion_de_archivos_desde_memoria_base_relocation-t264564.0.html

También te dejo otra forma mucho más simple, que escribí hace no mucho:
http://h-sec.org/inyectando-ejecutable-memoria-dummysection

Con esta última, no podrías inyectar en el proceso que quieras, solo en el "contenedor", así que no sirve para algunas cosas.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Belial & Grimoire

que bien mas informacion...

ahora entiendo porque me dijo que a menos de que la tabla coincida podria funcionar, bueno... gracias [Zero] ahorita mismo veo los links

salu2
.                                 

Arkangel_0x7C5

yo lo que ago es inyectar 2 codigos: shellcode(Es independiente de la address_base)+struc(contiene argumentos para el exe, la direccion de el exe+puntero a GetprocAddress, LoadLibrary, VirtualProtec)+exe_con_seccion_reloc

luego solo hay que conocer las diferentes secciones del PE.
http://h-sec.org/formato-pe-windows-espanol

Asi tu exe no tiene porque saber nada de las inyecciones

PD:hay problemas con la carga dinamica de msvcrt.dll y sus distintas versiones