|
给你一段代码试试。这个思路肯定是可行的,不过这段代码我没具体测试过,你可能要调试一下。具体思路是用PerformCallBack4 API在目标进程调用LoadLibraryW,参数通过cbi.pvArg0传递,由于lpLibFileName在本地buffer,目标进程不能访问,所以要把它拷贝到共享内存区域(用VirtualAlloc分配2MB内存)。
typedef struct _CALLBACKINFO {
HANDLE hProc; /* destination process */
FARPROC pfn; /* function to call in dest. process */
PVOID pvArg0; /* arg0 data */
} CALLBACKINFO;
typedef CALLBACKINFO *PCALLBACKINFO;
extern DWORD PerformCallBack4(PCALLBACKINFO pcbi, ...);
HMODULE WINAPI LoadLibraryInProcess(LPCWSTR lpLibFileName, DWORD dwProcessId)
{
HANDLE hProcess = OpenProcess(0, FALSE, dwProcessId);
if (!hProcess)
{
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
}
CALLBACKINFO cbi;
cbi.hProc = hProcess;
cbi.pfn = GetProcAddress(GetModuleHandle(L"coredll.dll"), L"LoadLibraryW");
size_t len = (1+wcslen(lpLibFileName))*sizeof(WCHAR);
LPVOID p0 = VirtualAlloc(0, 2*1024*1024, MEM_RESERVE, PAGE_NOACCESS);
if (p0)
{
cbi.pvArg0 = VirtualAlloc(p0, len, MEM_COMMIT, PAGE_READWRITE);
memcpy(cbi.pvArg0, lpLibFileName, len*sizeof(WCHAR));
DWORD r = PerformCallBack4(&cbi);
VirtualFree(p0, MEM_RELEASE);
}
CloseHandle(hProcess);
return (HMODULE)r;
}
|
|