dis*_*ame 5 c executable ollydbg
我在可执行文件中找到了一个函数,我想从我的DLL中调用它.它的地址将0x0090DE00根据OllyDbg.我试图直接调用它:
luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00));
Run Code Online (Sandbox Code Playgroud)
而且还要按照此处的建议添加模块句柄的基础:
uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe");
luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00));
Run Code Online (Sandbox Code Playgroud)
看来这不起作用,因为我得到访问冲突异常 - 看起来指针无效.
那么:如何通过使用其地址来调用此函数?
我刚刚插入了一条简单的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
}
Run Code Online (Sandbox Code Playgroud)
我不太明白为什么我在异常消息中得到一个不同的地址:
0x909090C3ForgedAlliance1.exe中抛出的异常0xC0000005::访问冲突执行位置0x909090C3.
更新:我刚刚意识到这0x909090C3不仅仅是一个指针,它是代码本身
90 | NOP
90 | NOP
90 | NOP
C3 | RETN
Run Code Online (Sandbox Code Playgroud)
似乎我用指针弄乱了一些东西.为什么要尝试执行"位置" 0x909090C3.那不是位置.
好吧,这只是一个指针混乱。抱歉——C很长一段时间没有写信了。我基本上做对了,但问题是
f = ((test*)(0x00C0B530));
(*f)();
Run Code Online (Sandbox Code Playgroud)
也就是说(*f),0x909090C3可执行文件内的指令 - 这是程序尝试跳转到的地址,当然这是无效的。
所以诀窍是:
int test_addr = 0x00C0B530
f = ((test*)(&test_addr ));
(*f)();
Run Code Online (Sandbox Code Playgroud)
我相信这可以做得更简单一些,但现在已经可以了。