【发布时间】: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