【问题标题】:How to call a function located in an executable from a loaded DLL?如何从加载的 DLL 调用位于可执行文件中的函数?
【发布时间】:2017-04-27 11:43:30
【问题描述】:

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

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

在 ForgedAlliance1.exe 中的 0x909090C3 处引发异常:0xC0000005:访问冲突执行位置 0x909090C3


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

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

似乎我在用指针搞砸了。为什么它会尝试执行“位置”0x909090C3。不是那个位置。

【问题讨论】:

  • 使用 olly 检查时,您是否确保函数没有存储在 ForgedAlliance1.exe 使用的另一个模块中,而不是可执行文件本身?
  • @Bauss 嗯,我对这一切有点陌生,但我可以告诉你我是如何得到地址的:我刚刚打开了可执行文件。当我调试它时,我看到起始地址是0x00401000。所以我假设我在这个特定窗口中看到的都是我的可执行文件。每次我保存对可执行文件的汇编代码的一些更改时,我都会覆盖可执行文件ForgedAlliance1.exe。所以只要 OllyDbg 不显示我内存的其他区域,地址应该是正确的并且是可执行文件的一部分。
  • 你看过这篇文章了吗? codeproject.com/articles/1045674/…
  • @Alden 这是否意味着我 必须 将 exe 加载为 dll 还是我在这里出错了?
  • 0x0090DE00 - 这是RVA 还是VA?你需要RVA,并且没有参数?

标签: c executable ollydbg


【解决方案1】:

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

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

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

所以诀窍是:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 2017-07-10
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多