【问题标题】:How to call function with parameters in the injected dll in windows如何在windows中使用注入的dll中的参数调用函数
【发布时间】:2022-01-11 14:49:20
【问题描述】:

我想将我的简单 dll 注入第三方应用程序。 之后我想从我自己的进程调用dll中的一个函数,而不是第三方应用程序中的进程。

下面的第一部分显示了我测试的整个dll:

// dllmain.cpp
#include "pch.h"



extern "C" __declspec(dllexport) int add(int a, int b)
{
    return a + b;
}


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

第二部分显示了我的进程中的调用者函数:

    // hProcess is the process in the third-party application

    // Call our exported function
    lpReturn = NULL;

    ***// I don't know how to pass parameter a and b into the exported function add in my simple dll***
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpFunctionAddress, lpRemoteParams, NULL, NULL);

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

我不知道如何将参数a和b传递到导出的函数中添加到我的简单dll中(请参考上面的第二部分)

任何人都可以给我一个提示,或者一个完整的例子说明如何在windows的注入dll中调用带有参数的函数?谢谢:-)

【问题讨论】:

  • 您的注入进程不能直接调用它已注入另一个进程的 DLL 上的函数。它必须注入更多代码才能在其他进程的上下文中进行这些函数调用。否则,DLL 应该设置某种 IPC 服务器,注入器可以根据需要向其发送命令。另外,不能使用CreateRemoteThread()调用签名与ThreadProc不兼容的函数。
  • @RemyLebeau 注入更多代码是什么意思?有简单的例子吗? :-) 而且我更害怕使用 IPC 来做这件事,我认为这对我来说可能很困难。
  • 这看起来与您尝试做的类似:resources.infosecinstitute.com/…
  • @JeunePrimeOrigines 那篇文章只解释了如何加载 DLL,OP 已经在做。它没有介绍如何在加载该 DLL 后对其进行额外调用。
  • @JYP2011 - 因此,如果您能够按照我之前评论的链接中所述使用 CreateRemoteThread() 成功加载 DLL,也许一种简单的方法是尝试重写您的 add() 函数所以它将使用一个结构接受单个参数。 (例如 struct { int a; int b; };)。本质上是为了使其与 RemyLebeau 所指出的 ThreadProc 签名兼容。附加参考:stackoverflow.com/questions/575695/…

标签: c++ windows dll dllexport dll-injection


【解决方案1】:

我认为棘手的部分是在注入 DLL 时传递参数。

您至少可以尝试两种方法:

  1. 使用您的 DLL 路径和名称作为参数。 DLL 的文件名可以通过GetModuleHandleExGetModuleFileName 检索
  2. 通过线程描述传递参数。首先,使用标志 CREATE_SUSPENDED 调用 CreateRemoteThread,然后在您有机会通过 SetThreadDescription 设置其描述后恢复它。在您的 DLL_PROCESS_ATTACH 案例中使用 GetThreadDescription 来获取描述。

请参考 Github 上的migi project 获取工作源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多