如何从加载的 DLL 调用位于可执行文件中的函数?

How to call a function located in an executable from a loaded DLL?

我在可执行文件中找到了一个函数,我想从我的 DLL 中调用 。根据OllyDbg,它的地址是0x0090DE00。我试过直接调用它:

luaL__openlib *f = ((luaL__openlib*)(module_handle  + 0x0090DE00));

而且还按照建议向其添加模块句柄的基址 :

uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe");

luaL__openlib *f = ((luaL__openlib*)(module_handle  + 0x0090DE00));

这似乎不起作用,因为我收到访问冲突异常 - 指针似乎无效。

那么:如何使用地址调用这个函数?


我刚刚在 0x00C0B530 处插入了一个简单的 RET 指令。我的代码现在看起来如下:

typedef void (*test) ();

EXTERN_DLL_EXPORT void initialize(lua_State *L)
{
    // Adding this should not be necessary. I get 0x00C0B530 from 
    // OllyDbg where the offset 0x00401000 is included
    uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe");

    test *f = NULL;

    f = ((test*)(0x00C0B530));

    (*f)(); // Crashing 
}

我不太明白的是为什么我在异常消息中得到了不同的地址:

Exception thrown at 0x909090C3 in ForgedAlliance1.exe: 0xC0000005: Access violation executing location 0x909090C3.


更新: 我刚刚意识到 0x909090C3 不仅仅是一个指针,它是代码本身

90 | NOP
90 | NOP
90 | NOP
C3 | RETN

看来我在用指针搞砸了。为什么它会尝试执行 "location" 0x909090C3。那不是那个位置。

好吧,这只是一个指针混乱。很抱歉 - 很长一段时间没有写在 C 中。基本上我做对了,但是

的问题
f = ((test*)(0x00C0B530));
(*f)();  

是,(*f)0x909090C3 - 可执行文件中的指令 - 这是程序试图跳转到的地址,当然是无效的。

所以诀窍是:

int test_addr = 0x00C0B530
f = ((test*)(&test_addr ));
(*f)();

我相信这可以做得更简单一些,但现在可以了。