RunDLL32 不执行任何操作

Posted

技术标签:

【中文标题】RunDLL32 不执行任何操作【英文标题】:RunDLL32 does not execute anything 【发布时间】:2020-10-12 21:50:47 【问题描述】:

我正在尝试创建一个可以使用 RunDLL32 执行的 DLL。我知道 RunDLL32 运行正常,因为如果我执行以下命令,它会弹出一个消息框: rundll32 printui.dll,PrintUIEntry/。 但是我无法让它执行我创建的 DLL,如下所示:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )

    switch (ul_reason_for_call)
    
    case DLL_PROCESS_ATTACH:
        MessageBox(0, L"Hello1", 0, 0);
        break;
    case DLL_THREAD_ATTACH:
        MessageBox(0, L"Hello2", 0, 0);
        break;
    case DLL_THREAD_DETACH:
        MessageBox(0, L"Hello3", 0, 0);
        break;
    case DLL_PROCESS_DETACH:
        MessageBox(0, L"Hello4", 0, 0);
        break;
    
    return TRUE;

代码编译良好(在 Visual Studio 2017 中,发布模式,x64)但是当我执行时

RunDLL32 MyDLL.dll

什么都没有发生。没有错误消息,没有输出,也没有消息框。这是为什么呢?

【问题讨论】:

【参考方案1】:

由于您正在编译 64 位 DLL,请确保您运行的是 64 位版本的 RunDll32:

rundll32.exe equivalent for 64-bit DLLs

每this page:

如果您将错误类型的 DLL 传递给 Rundll32,它可能无法运行而不会返回任何错误消息。

即使您可以让 RunDLL32 加载您的 DLL,you can't safely call MessageBox() in DllMain() at all。

除了DllMain,您还需要export a function for RunDLL32 to execute。您可以在该函数中调用MessageBox(),例如:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )

    return TRUE;


extern "C" __declspec(dllexport) void CALLBACK MyFunctionW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)

    MessageBoxW(hwnd, lpszCmdLine, L"Hello", MB_OK);

rundll32 my.dll,MyFunction "hello world"

【讨论】:

以上是关于RunDLL32 不执行任何操作的主要内容,如果未能解决你的问题,请参考以下文章

text 可以由mshta或rundll32执行的Scriplet,用于执行任意代码

rundll32执行js代码&Win32/Poweeliks

可疑进程描述----rundll32.exe进程详述

rundll 的 PHP 执行

RunDll32 是如何工作的?

Windows 7 计划任务“运行”但不执行任何操作