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

dis*_*ame 5 c executable ollydbg

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

luaL__openlib *f = ((luaL__openlib*)(module_handle  + 0x0090DE00));
Run Code Online (Sandbox Code Playgroud)

而且还要按照此处的建议添加模块句柄的基础:

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

luaL__openlib *f = ((luaL__openlib*)(module_handle  + 0x0090DE00));
Run Code Online (Sandbox Code Playgroud)

看来这不起作用,因为我得到访问冲突异常 - 看起来指针无效.

那么:如何通过使用其地址来调用此函数?


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

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 
}
Run Code Online (Sandbox Code Playgroud)

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

0x909090C3ForgedAlliance1.exe中抛出的异常0xC0000005::访问冲突执行位置0x909090C3.


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

90 | NOP
90 | NOP
90 | NOP
C3 | RETN
Run Code Online (Sandbox Code Playgroud)

似乎我用指针弄乱了一些东西.为什么要尝试执行"位置" 0x909090C3.那不是位置.

dis*_*ame 2

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

f = ((test*)(0x00C0B530));
(*f)();  
Run Code Online (Sandbox Code Playgroud)

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

所以诀窍是:

int test_addr = 0x00C0B530
f = ((test*)(&test_addr ));
(*f)();
Run Code Online (Sandbox Code Playgroud)

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