加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:51:35 所属栏目:Windows 来源:网络整理
导读:我在可执行文件中找到了一个函数,我想从我的DLL中调用它.根据OllyDbg,它的地址是0x0090DE00.我试图直接调用它: luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00)); 而且还要按照建议here添加模块句柄的基础: uint8_t * module_handle =
我在可执行文件中找到了一个函数,我想从我的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));

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

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

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

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

解决方法

好吧,这只是一个指针搞砸了.很抱歉 – 没有用C写很长一段时间.我做得对,基本上,但问题

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

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

所以诀窍是:

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

我相信这可以做得更简单但现在这样做了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读