gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:06:51 27 4
gpt4 key购买 nike

我在可执行文件中找到了一个函数,我想从我的 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)();

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

关于c - 如何从加载的 DLL 调用位于可执行文件中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41103726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com