2010-07-27 15 views
0

Avant d'entrer dans ma question, laissez-moi vous expliquer ce que je fais exactement.J'ai un Processus principal dire ProcessA, j'ai accroché ProcessA et également injecté dll (disons myDll.dll) dans l'espace de processus de ProcessA.Now à Un processus ProcessA déclenche un autre processus qui est ProcessB.Both processus A et B sont dans un espace de mémoire processus totalement différent.Je veux partager le myDll.dll (qui est inséré dans processA sapce) dans ProcessB (processSpace processB actuellement) .Can cela doit être fait en utilisant la méthode des tuyaux ou toute autre méthode appropriée. merci d'avance.Can pipeline peut être utilisé dans Dll partage dans un processus différent?

Répondre

1

Le code de la DLL sera automatiquement partagé par différents processus. Pour l'optimisation seulement, vous devriez choisir une bonne adresse de base de la DLL (voir http://msdn.microsoft.com/en-US/library/f7f5138s.aspx). Pour partager des données entre processus, vous pouvez par exemple utiliser des objets de mémoire partagée ou simplement placer certaines variables que vous devez partager dans une section que vous marquez comme partagée (voir http://support.microsoft.com/kb/100634 et http://msdn.microsoft.com/en-us/library/h90dkhs0.aspx pour plus de détails). Pour marquer la section « .SHAREDSECTIONNAME » Partagé en tant que vous pouvez utiliser

#pragma comment(linker, "/section:.SHAREDSECTIONNAME,RWS") 

Pour avoir aucun conflit en lecture/écriture de la mémoire partagée, vous devez utiliser un exactement comme dans l'événement nommé ou Mutex tous les autres cas de communication multiprocessus. Basé sur le commentaire: Si vous créez le processus fils vous-même, vous recevez le handle du processus fils avec tous les droits. Donc vous avez suffisamment de droites pour faire de l'infection DLL à l'égard de CreateRemoteThread API. Voici un code de travail en C qui commencent cmd.exe et injecter un MyTest.dll dans l'espace d'adressage:

#include <Windows.h> 

int main() 
{ 
    STARTUPINFO si = { sizeof(STARTUPINFO) }; 
    PROCESS_INFORMATION pi = {0}; 
    TCHAR szCommandLine[4096] = TEXT("CMD.EXE"); 
    BOOL bIsSuccess; 
    DWORD dwStatus; 
    LPCTSTR pszLibFile = TEXT("C:\\Oleg\\MyTest\\Release\\MyTest.dll"); 
    PTSTR pszLibFileRemote = NULL; 
    HANDLE hThread = NULL; 
    int cb; 
    HMODULE hModule = NULL; 

    bIsSuccess = CreateProcess (NULL, szCommandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); 

    // Calculate the number of bytes needed for the DLL's pathname 
    cb = (1 + lstrlen(pszLibFile)) * sizeof(TCHAR); 

    __try { 
     PTHREAD_START_ROUTINE pfnThreadRtn; 

     // Allocate space in the remote process for the pathname 
     pszLibFileRemote = (PTSTR) VirtualAllocEx (pi.hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); 
     if (pszLibFileRemote == NULL) __leave; // error 

     // Copy the DLL's pathname to the remote process's address space 
     if (!WriteProcessMemory (pi.hProcess, pszLibFileRemote, (PVOID) pszLibFile, cb, NULL)) __leave; 

     // Get the real address of LoadLibraryW in Kernel32.dll 
     // Real address of Kernel32.dll in dwProcessId and in our Process MUST be the same !!! 
     // Remote Process MUST have Kernel32.dll loaded (SMSSS.EXE and System havn't)!!! 
#ifdef UNICODE 
     pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress (GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); 
#else 
     pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress (GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA"); 
#endif 
     if (pfnThreadRtn == NULL) __leave; 

     // Create a remote thread that calls LoadLibraryW(DLLPathname) 
     hThread = CreateRemoteThread (pi.hProcess, NULL, 0, pfnThreadRtn, (LPVOID)pszLibFileRemote, 0, NULL); 
     if (hThread == NULL) __leave; 

     dwStatus = ResumeThread (pi.hThread); 

     // Wait for the remote thread to terminate 
     if (WaitForSingleObject (hThread, INFINITE) != WAIT_OBJECT_0) __leave; 

     GetExitCodeThread (hThread, (PDWORD)&hModule); 

     // hModule is the address in the destination process (CMD.EXE) 
     // of the injected DLL 
     // You can verify that it is really loaded for example with respect of 
     // Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) 
    } 
    __finally { 
     // Free the remote memory that contained the DLL's pathname 
     if (pszLibFileRemote != NULL) 
      bIsSuccess = VirtualFreeEx (pi.hProcess, pszLibFileRemote, 0, MEM_RELEASE); 

     if (hThread != NULL) 
      bIsSuccess = CloseHandle (hThread); 

     if (pi.hProcess != NULL) 
      bIsSuccess = CloseHandle (pi.hProcess); 

     if (pi.hThread != NULL) 
      bIsSuccess = CloseHandle (pi.hThread); 
    } 

    return 0; 
} 
+0

Je comprends que vous replied..the informations que vous avez posté semble être Kinda « partage des données entre dll's ", il était instructif et utile mais je me demandais s'il y a un moyen d'hériter d'une DLL (mydll.dll) IAT de processA à processB..Hence je ne veux plus charger mes hooks dans le processus B – kiddo

+0

Si vous faire une modification dans DLL mappée dans un processus (également dans IAT) une copie unique de la page correspondante sera créée et modifiée dans un seul processus. Mais si vous avez déjà injecté DLL dans le processus, pourquoi est-ce un problème? Vous devriez probablement décrire plus en détail ce que vous entendez par "Processus donne un coup de pied sur un autre processus qui est ProcessB". Avez-vous déjà implémenté l'injection de DLL dans les deux processus ou voulez-vous le faire? Que voulez-vous dire sous "J'ai accroché ProcessA"? – Oleg

+0

Je vais vous expliquer ce que je fais.J'ai un exe (Parent EXE) dans lequel j'ai empaqueté un autre EXE (enfant EXE) dedans (supposons que je l'ai fait en utilisant winzip comme logiciel) donc quand le parentExe est démarré (runned) il commence (exécute) l'exe d'enfant après l'extraction. Quand je dis "accroché" cela signifie que j'ai inséré une DLL dans le parent Exe .... Et c'est comment je voulais savoir s'il y avait un moyen d'hériter de l'IAT de cette DLL qui appartient à Parent Exe à son enfant. – kiddo