我在可执行文件中找到了一个函数,我想从我的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));
看来这不起作用,因为我遇到访问冲突异常 - 看起来指针无效。
那么:如何通过使用其地址来调用此函数?
我刚刚在RET
插入了一条简单的0x00C0B530
指令。我的代码现在看起来如下:
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
似乎我正在用指针弄乱一些东西。为什么它会尝试执行" location" 0x909090C3
。那不是位置。
答案 0 :(得分:2)
好吧,这只是指针搞乱了。对不起 - 没有写C
很长一段时间。我做得对,基本上,但问题是
f = ((test*)(0x00C0B530));
(*f)();
是,(*f)
是0x909090C3
- 可执行文件中的指令 - 这是程序尝试跳转到的地址,当然这是无效的。
所以诀窍是:
int test_addr = 0x00C0B530
f = ((test*)(&test_addr ));
(*f)();
我确信这可以做得更简单但现在已经有效了。