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