如何从加载的 DLL 调用位于可执行文件中的函数?
How to call a function located in an executable from a loaded DLL?
我在可执行文件中找到了一个函数,我想从我的 DLL 中调用 。根据OllyDbg,它的地址是0x0090DE00
。我试过直接调用它:
luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00));
而且还按照建议向其添加模块句柄的基址 :
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
看来我在用指针搞砸了。为什么它会尝试执行 "location" 0x909090C3
。那不是那个位置。
好吧,这只是一个指针混乱。很抱歉 - 很长一段时间没有写在 C
中。基本上我做对了,但是
的问题
f = ((test*)(0x00C0B530));
(*f)();
是,(*f)
是 0x909090C3
- 可执行文件中的指令 - 这是程序试图跳转到的地址,当然是无效的。
所以诀窍是:
int test_addr = 0x00C0B530
f = ((test*)(&test_addr ));
(*f)();
我相信这可以做得更简单一些,但现在可以了。
我在可执行文件中找到了一个函数,我想从我的 DLL 中调用 。根据OllyDbg,它的地址是0x0090DE00
。我试过直接调用它:
luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00));
而且还按照建议向其添加模块句柄的基址
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 location0x909090C3
.
更新: 我刚刚意识到 0x909090C3
不仅仅是一个指针,它是代码本身
90 | NOP
90 | NOP
90 | NOP
C3 | RETN
看来我在用指针搞砸了。为什么它会尝试执行 "location" 0x909090C3
。那不是那个位置。
好吧,这只是一个指针混乱。很抱歉 - 很长一段时间没有写在 C
中。基本上我做对了,但是
f = ((test*)(0x00C0B530));
(*f)();
是,(*f)
是 0x909090C3
- 可执行文件中的指令 - 这是程序试图跳转到的地址,当然是无效的。
所以诀窍是:
int test_addr = 0x00C0B530
f = ((test*)(&test_addr ));
(*f)();
我相信这可以做得更简单一些,但现在可以了。