c++ - 在注入(inject)的 DLL 中调用函数?

标签 c++ function dll process inject

使用 C++,我有一个创建远程进程并向其中注入(inject) DLL 的应用程序。有没有办法让远程应用程序从创建它的应用程序执行从 DLL 导出的函数?是否可以向该函数发送参数?请注意,我试图避免在 DllMain 中做任何事情。

最佳答案

注意:
要获得更好的答案,请 see my update posted below !


好的,这就是我如何做到这一点的:

BOOL RemoteLibraryFunction( HANDLE hProcess, LPCSTR lpModuleName, LPCSTR lpProcName, LPVOID lpParameters, SIZE_T dwParamSize, PVOID *ppReturn )
{
    LPVOID lpRemoteParams = NULL;

    LPVOID lpFunctionAddress = GetProcAddress(GetModuleHandleA(lpModuleName), lpProcName);
    if( !lpFunctionAddress ) lpFunctionAddress = GetProcAddress(LoadLibraryA(lpModuleName), lpProcName);
    if( !lpFunctionAddress ) goto ErrorHandler;

    if( lpParameters )
    {
        lpRemoteParams = VirtualAllocEx( hProcess, NULL, dwParamSize, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
        if( !lpRemoteParams ) goto ErrorHandler;

        SIZE_T dwBytesWritten = 0;
        BOOL result = WriteProcessMemory( hProcess, lpRemoteParams, lpParameters, dwParamSize, &dwBytesWritten);
        if( !result || dwBytesWritten < 1 ) goto ErrorHandler;
    }

    HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpFunctionAddress, lpRemoteParams, NULL, NULL );
    if( !hThread ) goto ErrorHandler;

    DWORD dwOut = 0;
    while(GetExitCodeThread(hThread, &dwOut)) {
        if(dwOut != STILL_ACTIVE) {
            *ppReturn = (PVOID)dwOut;
            break;
        }
    }

    return TRUE;

ErrorHandler:
    if( lpRemoteParams ) VirtualFreeEx( hProcess, lpRemoteParams, dwParamSize, MEM_RELEASE );
    return FALSE;
}

//...
CStringA targetDll = "injected.dll"

    // Inject the target library into the remote process
PVOID lpReturn = NULL;
RemoteLibraryFunction( hProcess, "kernel32.dll", "LoadLibraryA", targetDll.GetBuffer(MAX_PATH), targetDll.GetLength(), &lpReturn );
HMODULE hInjected = reinterpret_cast<HMODULE>( lpReturn );

    // Call our exported function
lpReturn = NULL;
RemoteLibraryFunction( hProcess, targetDll, "Initialize", NULL, 0, &lpReturn );
BOOL RemoteInitialize = reinterpret_cast<BOOL>( lpReturn );


这也可用于通过指向结构或 union 的指针将参数发送到远程函数,并且不必在 DllMain 中编写任何内容。

关于c++ - 在注入(inject)的 DLL 中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13428881/

相关文章:

c++11 多读取器/多写入器队列,使用原子处理对象状态和永久递增索引

c++ - 在 C++11 的 lambda 中使用封闭函数中的模板类型可以吗?

jquery - 拆分并替换 href

c++ - 在 Android Studio 中,C++ 代码导航和分析不适用于 CMake 3.7 或更高版本

c++ - 如何使用 Code::Blocks 在 C++ 程序中使用 SQLite?

javascript - 使用 .bind 时将参数传递给回调函数

c - 为什么结果是零,而不是正确的 sqrt?

actionscript-3 - 在 ActionScript 中使用 .dll 文件

c# 在导出 DLL 时隐藏类成员

c - 关于将 windbg 用于从 Labview 调用的 dll 的问题