Proyecto Metamorph

Iniciado por [Zero], 24 Abril 2009, 23:31 PM

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

[Zero]

#10
Finalizado Creador BD (Delphi)

El programa cuanta con una base de datos en la que están instrucciones en en asm más o menos equivalentes pasadas a opcodes, para evitar estar compilando todo el rato programé algo en delphi, consta de 2 edit's, en uno meto la instruccion en assembly y en el otro la equivalente y me guarda en un fichero los opcodes, así me ahorro tiempo y errores humanos.

Lo del metodo xor y meepa, pues permite modificar cualquier byte del archivo sin romperlo, cuando postee el source o incluso la beta lo vereis mejor.

Ahora se me presentó un problema, para aplicar el metodo xor y meepa, necesitaba cambiar el entry point del programa hacia mi código, vale, programé una función en c que lo hace, pero al hacerlo, saltan como 4/5 antivirus, sólo cambiando el entry point de un exe en vb. Entonces se me ocurrió dejar el entry point como estaba y modificar los bytes a donde apunta éste por un salto a donde quiero que redireccione y ahí se restauran esos bytes y retorna, pero cual mi sorpresa al ver que no he arreglado nada, los av siguen detectándomelo, a ver si a alguien se le ocurre algo para solucionar eso, sinó cambiaré el entry point y esos 4/5 av saltarán con cualquier ejecutable en vb que se pase por ésta tool  :-\.

Edito: Solucionado gracias al gran Shaddy  :xD.

Saludos

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

[Zero]

#11
Bueno, si el anterior fue un gran progreso éste es realmente sorprendente  ;D. RedirectCalls terminado para ejecutables programados en C/C++ y ASM. Aún no funciona con exes en VB ni Delphi porque éstos llaman a las apis de una forma rara diferente, pero también funcionará con éstos. Qué hace ésta función? pues mueve todas las llamadas a las apis a los huecos del exe y en su lugar pone saltos hacia esos calls, aquí una captura del olly con el stub del SecureShade programado por Kizar en C:



¿Vale, y que consigues con eso?

Pues como muchos sabrán, muchos antivirus ponen firmas en éstos sitios porque son "difíciles" de modificar, sirve para ésto:

EL ANTES


File Info

Report generated: 2.5.2009 at 12.45.43 (GMT 1)
File size: 4 KB
MD5 Hash: 597E73FB20D376A13CF61800F815C126
SHA1 Hash: 5D36A65B697D5E94474D8AACD2A2E05DD11CB81F
Self-Extract Archive: Nothing found
Binder Detector:  Nothing found
Detection rate: 16 on 24

Detections

a-squared - BehavesLike.Win32.ProcessHijack!IK
Avira AntiVir - TR/Drop.Small.NDH.42
Avast - Win32:Poison-IX [trj]
AVG - Dropper.Generic.ACNF
BitDefender - Trojan.Dropper.Small.NDH
ClamAV - Nothing found!
Comodo - Backdoor.Win32.Poison.~ZU    
Dr.Web - BackDoor.Bifrost.740
Ewido - Backdoor.SdBot.hnn
F-PROT 6 - W32/Backdoor2.COYS
G DATA - Win32:Poison-IX [trj]   B
IkarusT3 - BehavesLike.Win32.ProcessHijack
Kaspersky - Nothing found!
McAfee - Nothing found! 
MHR (Malware Hash Registry) - Virus Found - detect rate 11%
NOD32 v3 - Win32/IRCBot.AJR 
Norman - Nothing found!
Panda - Nothing found!
Quick Heal - Trojan.Agent.ATV
Solo Antivirus - Nothing found!
Sophos - Sus/Behav-168
TrendMicro - Nothing found!
VBA32 - Win32.IRCBot.AJR   
Virus Buster - Nothing found!

Scan report generated by 
NoVirusThanks.org


Y EL DESPUÉS


File Info

Report generated: 2.5.2009 at 12.49.45 (GMT 1)
File size: 4 KB
MD5 Hash: 302CC836D99E9309F57D8CC12084A17E
SHA1 Hash: 5113DDDBF338830760E8A434AFAFBE813A2F7EE9
Self-Extract Archive: Nothing found
Binder Detector:  Nothing found
Detection rate: 5 on 24

Detections

a-squared - Heuristic.LOP
Avira AntiVir - Nothing found!
Avast - Win32:Poison-IX [trj]
AVG - Nothing found!
BitDefender - Nothing found!
ClamAV - Nothing found!
Comodo - Nothing found! 
Dr.Web - Nothing found!
Ewido - Nothing found!
F-PROT 6 - Nothing found!
G DATA - Win32:Poison-IX [trj]   B
IkarusT3 - Nothing found!
Kaspersky - Nothing found!
McAfee - virus or variant W32/NGVCK.d  
MHR (Malware Hash Registry) - Nothing found!
NOD32 v3 - Nothing found! 
Norman - Nothing found!
Panda - Nothing found!
Quick Heal - Nothing found!
Solo Antivirus - Nothing found!
Sophos - Sus/Behav-168
TrendMicro - Nothing found!
VBA32 - Nothing found!   
Virus Buster - Nothing found!

Scan report generated by 
NoVirusThanks.org


De esos, a-squared me lo detecta por el cambio del entry point, mcafee se añade con un falso positivo los otros porque tienen otra firma.

Espero comentarios a ver que les parece  ;D. Ahora estoy trabajando para adaptarlo también a exes en VB y Delphi.

Saludos  ;)

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

Karcrack

Me encanta ;D Es una gran innovacion no tenerlo que hacerlo a mano.. ya que suele ser una tarea ardua...

El problema es si no hay espacios vacios (muy raro) pero bueno, para eso esta el Topo (o incluso podeis agregar un pequeño tool para eso :P)

Saludos ;)

[Zero]

Si, ésa es la limitación que tiene y que tendrá hasta la versión 1.0 final ya que tedría que reprogramar gran parte de lo que tengo, habrá que esperar a la 2.0 para añadir espacio libre a los ejecutables o en su defecto para los impacientes, agregarla a mano o con topo  :P.

Saludos

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

Arkangel_0x7C5

Cita de: Hacker_Zero en  2 Mayo 2009, 14:14 PM
Si, ésa es la limitación que tiene y que tendrá hasta la versión 1.0 final ya que tedría que reprogramar gran parte de lo que tengo, habrá que esperar a la 2.0 para añadir espacio libre a los ejecutables o en su defecto para los impacientes, agregarla a mano o con topo  :P.

Saludos
No seria difícil si lo haces al final de una sección. Puedo ayudarte en eso si quieres

Saludos

[Zero]

La verdad sería buena cualquier ayuda y más en C/C++ ya que soy el único que está programando en eso  :xD. Lo ideal sería agrandar la sección de código y nó la última, es más complicado pero así evitamos problemas (algunos antivirus saltan al ver 2 secciones de código  :¬¬). Ahora estoy viendo tambien que por ejemplo con delphi estará difícil, apenas hay huecos  :-(. Yo pensaba hacerlo para la 2.0 pero si hay ayuda las cosas se terminan antes  :).

Saludos

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

Arkangel_0x7C5

solo abria que mover las demas secciones y colocar en la cabecera la nueva direccion de las secciones. Cuando termine lo que estoy haciendo, que no creo que me lleve mucho lo ago. Saludos

PD: a mi para estas cosas me gusta usar asm porque no hay que estar haciendo casting de tipos.

YST

Muy buen proyecto ;) .

Como decia arkangel seria cosa de modificar el PE solamente para poner el espacio que necesites.

Saludos.


Yo le enseñe a Kayser a usar objetos en ASM

[Zero]

Bueno, me surgío un problema, en lo de alargar la sección de código, no veo que es lo que falla, los valores del pe se cambian bien, copio lo que hay despues para adelante y relleno de 0's la parte que alargué, no se si falla porque se me pasó cambiar algún valor o por que existe algún valor estático fuera del pe  :-\. Dejo el código que tengo para agrandar la sección de código, a ver si alguien ve donde puede estar el fallo:


HANDLE hFile=CreateFile(nFileName,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
if(hFile == INVALID_HANDLE_VALUE)
{
return NULL;
}

DWORD szFile=GetFileSize(hFile,0);
if(szFile == INVALID_FILE_SIZE)
{
return NULL;
}

szFile=szFile+0x200;

HANDLE hCFM=CreateFileMapping(hFile,0,PAGE_READWRITE,0,szFile,0);
if(hCFM==NULL)
{
return NULL;
}

CloseHandle(hFile);

LPSTR hMVOF=(LPSTR)malloc(szFile);
hMVOF=(LPSTR)MapViewOfFile(hCFM,FILE_MAP_ALL_ACCESS,0,0,0);
if(hMVOF==NULL)
{
return NULL;
}

CloseHandle(hCFM);

PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;

IDH=(PIMAGE_DOS_HEADER)&hMVOF[0];
INTH=(PIMAGE_NT_HEADERS)&hMVOF[IDH->e_lfanew];

DWORD ExecutableSection=GetExecutableSection(hMVOF);

ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ExecutableSection];

LPSTR Temp=(LPSTR)malloc(szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200));
CopyMemory(&Temp[0],&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200));

CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+0x200],&Temp[0],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200));

BYTE zero=0x00;

for(DWORD i=0;i<0x200;i++)
{
CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+i],&zero,1);
}

ISH->SizeOfRawData=ISH->SizeOfRawData+0x200;
ISH->Misc.VirtualSize=ISH->Misc.VirtualSize+0x200;
INTH->OptionalHeader.SizeOfImage=INTH->OptionalHeader.SizeOfImage+0x200;

for(i=0;i<=INTH->FileHeader.NumberOfSections;i++)
{
ExecutableSection=GetExecutableSection(hMVOF);
ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(ExecutableSection+1+i)];
ISH->PointerToRawData=ISH->PointerToRawData+0x200;
ISH->VirtualAddress=ISH->VirtualAddress+0x200;
}

return hMVOF;

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

Arkangel_0x7C5

una pregunta, ordenas los datos de las secciones. Esque el orden en el que estan en la cabecera no tiene porque ser el mismo que en el exe.


saludos
PD:Yo estabas haciendo ese code ahora en asm. ya casi esta. Lo pongo en un rato