【问题标题】:How to implement rundll2-callable function?如何实现rundll2-callable函数?
【发布时间】:2010-11-04 11:08:49
【问题描述】:

我正在尝试编写一个 exe,它还可以导出可以用 rundll32 调用的函数。这可能吗?如果可以,为什么不能这样工作?

我密切关注Microsoft's advice on this

#define RUNDLL32(func) extern "C" __declspec(dllexport) void CALLBACK func(HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow)

RUNDLL32(MyFunc)
{
  MessageBox(0, 0, 0, 0);
}

但是当被调用时

rundll32 myprog.exe,_MyFunc@16

rundll32 崩溃/DEP 启动。

【问题讨论】:

  • 你为什么要使用函数名的错位?不要rundll32 myprog.exe,MyFunc 工作?
  • 那是因为函数是以该名称导出的。我可以制作一个 .def 文件并以不同的名称导出它,但我不在乎它是否看起来有点奇怪(rundll32 找到它,这不是问题)另外我真的不知道如何告诉它使用.def 文件。

标签: winapi crash dllexport rundll32


【解决方案1】:

Rundll32.exe 使用 LoadLibrary() 加载可执行映像。这不太可能对 EXE 有效,它不会期望加载到不是其默认地址的地址上。保证会发生,rundll32.exe 已经占用了该默认地址。不确定您是否可以修改链接器,以便它不会忽略重定位记录。

但不要打扰这种方法,只需创建一个 DLL 而不是 EXE。并将真正的参数传递给 MessageBox()。而且,是的,使用 .def 文件重命名导出的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多