管道可以用于不同进程中的Dll共享吗?

管道可以用于不同进程中的Dll共享吗?,dll,winapi,process,hook,Dll,Winapi,Process,Hook,在我开始我的问题之前,让我解释一下我到底在做什么。我有一个主进程,比如ProcessA,我钩住了ProcessA,还注入了dll(比如myDll.dll)进入ProcessA的进程空间。现在ProcessA在一个点上启动另一个进程,即ProcessB。进程A和B都位于完全不同的进程内存空间。我想在ProcessB(实际上是ProcessB的进程空间)中共享myDll.dll(插入ProcessA sapce中)。可采用管线法或任何其他合适的方法进行。 提前感谢。DLL的代码将由不同的进程自动共享

在我开始我的问题之前,让我解释一下我到底在做什么。我有一个主进程,比如ProcessA,我钩住了ProcessA,还注入了dll(比如myDll.dll)进入ProcessA的进程空间。现在ProcessA在一个点上启动另一个进程,即ProcessB。进程A和B都位于完全不同的进程内存空间。我想在ProcessB(实际上是ProcessB的进程空间)中共享myDll.dll(插入ProcessA sapce中)。可采用管线法或任何其他合适的方法进行。
提前感谢。

DLL的代码将由不同的进程自动共享。对于优化,您应该选择一个好的DLL基址(请参阅)

要在进程之间共享数据,例如,可以使用共享内存对象,或者将需要共享的一些变量放置到标记为共享的部分(有关详细信息,请参阅和)。要将节“.SHAREDSECTIONNAME”标记为共享,可以使用

#pragma comment(linker, "/section:.SHAREDSECTIONNAME,RWS")
要在从共享内存写入/读取时不发生冲突,您应该使用命名事件或互斥体,这与所有其他多进程通信情况完全相同

根据注释更新了:如果您自己创建子进程,您将收到具有完全权限的子进程句柄。因此,您有足够的权限对
CreateRemoteThread
API进行DLL感染。以下是C语言中的工作代码,它启动CMD.EXE并在地址空间中插入MyTest.dll:

#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;
}
#包括
int main()
{
STARTUPINFO si={sizeof(STARTUPINFO)};
进程信息pi={0};
TCHAR szCommandLine[4096]=文本(“CMD.EXE”);
布尔·比斯凯利;
德沃德·德沃德身份;
LPCTSTR pszLibFile=TEXT(“C:\\Oleg\\MyTest\\Release\\MyTest.dll”);
PTSTR pszLibFileRemote=NULL;
handlehthread=NULL;
int-cb;
HMODULE HMODULE=NULL;
bIsSuccess=CreateProcess(NULL、szCommandLine、NULL、NULL、FALSE、CREATE\u SUSPENDED、NULL、NULL、si和pi);
//计算DLL路径名所需的字节数
cb=(1+lstrlen(pszLibFile))*sizeof(TCHAR);
__试一试{
PTHREAD_START_例程pfnThreadRtn;
//在远程进程中为路径名分配空间
pszLibFileRemote=(PTSTR)VirtualAllocEx(pi.hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
如果(pszLibFileRemote==NULL)\uu离开;//错误
//将DLL的路径名复制到远程进程的地址空间
如果(!WriteProcessMemory(pi.hProcess,pszLibFileRemote,(PVOID)pszLibFile,cb,NULL))离开;
//在Kernel32.dll中获取LoadLibraryW的实际地址
//dwProcessId中的Kernel32.dll的实际地址和我们的进程中的Kernel32.dll的实际地址必须相同!!!
//远程进程必须加载Kernel32.dll(SMSSS.EXE和系统没有)!!!
#ifdef UNICODE
pfnThreadRtn=(PTHREAD_START_例程)GetProcAddress(GetModuleHandle(TEXT(“Kernel32”),“LoadLibraryW”);
#否则
pfnThreadRtn=(PTHREAD_START_例程)GetProcAddress(GetModuleHandle(TEXT(“Kernel32”),“LoadLibraryA”);
#恩迪夫
如果(pfnThreadRtn==NULL)\u离开;
//创建一个调用LoadLibraryW(DLLPathname)的远程线程
hThread=CreateRemoteThread(pi.hProcess,NULL,0,pfnthreartn,(LPVOID)pszLibFileRemote,0,NULL);
如果(hThread==NULL)uu离开;
dwStatus=ResumeThread(pi.hThread);
//等待远程线程终止
如果(WaitForSingleObject(hThread,INFINITE)!=WAIT\u OBJECT\u 0)\u离开;
GetExitCodeThread(hThread,(PDWORD)和hModule);
//hModule是目标进程(CMD.EXE)中的地址
//注入的DLL的
//您可以验证它是否真的加载了,例如关于
//进程浏览器(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)
}
__最后{
//释放包含DLL路径名的远程内存
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);
}
返回0;
}

我感谢您的回复..您发布的信息似乎有点“在dll之间共享数据”,它提供了信息并且很有用,但我想知道是否有一种方法可以继承dll(mydll.dll)进程a到进程B的IAT。因此,我不想再次在进程B中加载我的挂钩。如果您在映射到进程(也在IAT中)的DLL中进行任何修改,则只会在一个进程中创建和修改相应页面的唯一副本。但是如果您已经在这个过程中注入了DLL,为什么会出现问题呢?也许您应该在“ProcessA启动另一个进程,即ProcessB”下更详细地描述您的意思。您是否已经在这两个进程中实现了DLL注入,还是要这样做?在“我已钩住进程A”下你是什么意思?我将向你解释我在做什么。我有一个exe(父exe),其中我捆绑了另一个exe(子exe)(假设我使用类似winzip的软件),因此当启动(运行)父exe时,它在提取后启动(运行)子exe。当我说“hooked”时,它意味着我已经在父Exe中插入了一个DLL…这就是我想知道是否有方法将属于父Exe的DLL的IAT继承给它的子DLL。