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

时间:2016-12-12 15:04:37

标签: c executable ollydbg

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

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

还要按照建议的here

添加模块句柄的基础
uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe");

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

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

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

我刚刚在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 
}

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

  

ForgedAlliance1.exe 0x909090C3处抛出异常:0xC0000005:访问冲突执行位置0x909090C3

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

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

似乎我正在用指针弄乱一些东西。为什么它会尝试执行" location" 0x909090C3。那不是位置。

1 个答案:

答案 0 :(得分:2)

好吧,这只是指针搞乱了。对不起 - 没有写C很长一段时间。我做得对,基本上,但问题是

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

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

所以诀窍是:

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

我确信这可以做得更简单但现在已经有效了。