У меня есть функция внутри исполняемого файла, которую я бы назвал из моей DLL. Адрес его будет 0x0090DE00
согласно OllyDbg. Я пытался вызвать его непосредственно:Как вызвать функцию, находящуюся в исполняемом файле из загруженной библиотеки DLL?
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
}
То, что я не совсем понимаю, почему я получаю другой адрес в сообщении исключения:
Exception брошенным в
0x909090C3
в ForgedAlliance1.exe:0xC0000005
: Ошибка доступа к месту выполнения0x909090C3
.
UPDATE: Я просто понял, что 0x909090C3
не просто указатель здесь, это сама
90 | NOP
90 | NOP
90 | NOP
C3 | RETN
код Кажется, я что-то баловаться с указателями. Почему он пытается выполнить «местоположение» 0x909090C3
. Это не место.
При проверке с помощью olly вы убедились, что функция не хранится внутри другого модуля, который использует ForgedAlliance1.exe, а не сам исполняемый файл? – Bauss
@Bauss Хм, я немного новичок во всем этом, но могу сказать, как я получил адрес: я только что открыл исполняемый файл. Когда я отлаживаю его, я вижу, что начальный адрес - «0x00401000». Поэтому я предполагаю, что все, что я вижу в этом конкретном окне, - это мой исполняемый файл. Каждый раз, когда я сохраняю некоторые изменения в коде сборки исполняемого файла, я перезаписываю исполняемый файл ForgedAlliance1.exe. До тех пор, пока OllyDbg не отображает другие области моей памяти, адрес должен быть правильным и частью исполняемого файла. – displayname
Вы взглянули на эту статью? https://www.codeproject.com/articles/1045674/load-exe-as-dll-mission-possible – Alden