Cacher un process au TaskManager

garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 - 30 avril 2004 à 15:45
daetips Messages postés 142 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 10 novembre 2007 - 16 mai 2005 à 22:28
Salut,
je suis en train de faire une source pour masquer un processus au TaskManager (NT, 2000 ou XP) càd la fenêtre du Ctrl+Alt+Suppr

Le problème c'est que pour une raison que j'ignore ça fait planter le taskmanager dès que j'essaie de lire un item de la listview (en revanche je peux utiliser itemcount, etc...)

Voilà le code actuel:

#include "stdafx.h"
#include "commctrl.h" // Pour les fonctions ListView_...

static char hiddenProcess[32]; // Nom du process à masquer
static const char* progName = "HideProcess.exe"; // Nom du programme (à masquer aussi)

/**
 * Recherche le nom du processus dans la ListView et supprime l'item associé
 */
void RetireProcessItem(const HWND hList)
{
    int nItem;
    static LV_FINDINFO findinfo;
    findinfo.flags = LVFI_STRING;

// Supprime l'item de "HideProcess.exe"
    findinfo.psz = progName;
nItem = ListView_FindItem(hList, -1, &findinfo);
ListView_DeleteItem(hList, nItem);

// Supprime l'item de du processus à masquer
    findinfo.psz = hiddenProcess;
nItem = ListView_FindItem(hList, -1, &findinfo);
ListView_DeleteItem(hList, nItem);
}

/**
 * Recherche de la ListView de la fenêtre Ctrl+Alt+Suppr
 */
BOOL CALLBACK OnEnumWindows(          
HWND hwnd,
    LPARAM lParam
)
{
char caption  [16];
char className[16];

// On cherche une fenêtre du même type que la celle de Ctrl+Alt+Suppr
::GetClassName(hwnd, className, sizeof(className));
if (strcmp(className, "#32770") == 0)
{
// On récupère le petit-fils
hwnd = ::GetWindow(hwnd, GW_CHILD);
hwnd = ::GetWindow(hwnd, GW_CHILD);

// On regarde si c'est bien l'objet (ListView) qu'on cherche
::GetWindowText(hwnd, caption,	 sizeof(className));
::GetClassName (hwnd, className, sizeof(className));
if ( strcmp(className, "SysListView32") 0 && strcmp(caption, "Processus") 0 )
{
// On a trouvé la listview
RetireProcessItem(hwnd);

// La recherche est terminée
return FALSE;
}
}

// On poursuit la recherche
return TRUE;
}

/**
 * Fonction appelée à intervalle régulier qui lance la recherche de la ListView
 */
VOID CALLBACK OnTimer( 
    HWND hwnd,        // handle to window for timer messages 
    UINT message,     // WM_TIMER message 
    UINT idTimer,     // timer identifier 
    DWORD dwTime)     // current system time 
{
// On lance la recherche
::EnumWindows(OnEnumWindows, 0);
};

/**
 * Point d'entrée
 */ 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
MSG msg;

// L'argument est copié dans la variable statique hiddenProcess
strcpy(hiddenProcess, lpCmdLine);

// On cherche la liste des processus toutes les 100 ms
::SetTimer(0, 1, 100, OnTimer);

while (GetMessage(&msg, NULL, 0, 0)) 
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// Arrête le timer
::KillTimer(0, 1);

return msg.wParam;
}


Le pb se situe dans RetireProcessItem au niveau de ListView_FindItem. Mais je le répète toutes les fonctions accédant au texte des items font planter le taskmanager.

Quelqu'un sait-il pourquoi ? Ou comment empecher ce plantage ?

Merci

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac

1 réponse

daetips Messages postés 142 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 10 novembre 2007
16 mai 2005 à 22:28
C normal que t'es pas acces a la mémoire de l'autre processus.
avec ce cde, fait une dll et injecte la dans le taskmanager.
la tu aura acces a la mémoire de taskmanager, tu pourra alord supprimer l'item

Daetips
0
Rejoignez-nous