通过CreateRemoteThread创建的线程调用函数

时间:2015-11-04 04:30:02

标签: c++ c dll dll-injection

我正在研究dll注入,到目前为止,我设法在一个进程中注入一个dll,导致消息框出现。

即使经过大量的阅读和研究,我还不太了解这部分是如何将参数传递给dll,或者调用其中的特定函数。

dll:

extern "C" __declspec(dllexport) bool WINAPI
DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{

switch (fdwReason)
{
    case DLL_PROCESS_ATTACH:
    {
        MessageBoxA(NULL, "Hello World!", "Dll says:", MB_OK);

    break;
    }

    case DLL_PROCESS_DETACH:
        break;

    case DLL_THREAD_ATTACH:
        break;

    case DLL_THREAD_DETACH:
        break;
}

return true;
}

注射:

char dllPath[] = "sampleDll.dll";

// For dll path injection.
int memAmountToAllocate = strlen(dllPath);

LPVOID dllPathAddress = VirtualAllocEx(procHandle, 0, memAmountToAllocated, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

FARPROC loadLibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

WriteProcessMemory(procHandle, dllPathAddress, dllPath, memAmountToAllocated, 0);

// creating a thread that will call LoadLibraryA with allocMemAddress as argument
CreateRemoteThread(procHandle, 0, 0, loadLibraryAddr, dllPathAddress, 0, 0);

正如我所说,注射工作正常,即出现消息框。 但是说我在dll foo(LPVOID ptrToData)中有一个方法。如何调用foo函数? 我有我想要在目标进程上执行的函数的地址,它是一个添加函数,所以我需要传递x和y。

我可以像这样调用这个函数

          _asm
        {
            push 0;
            push 0x7;
            mov ecx, esi;
            mov eax, 0x41367C;
            call eax;
        }

但是push的值必须来自注入过程。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我的问题的解决方案是使用IPC机制来允许我的主应用程序和dll进行通信。 我使用了命名管道。

我在C#中创建了管道,然后当我注入dll时,我连接到管道。