2016-12-12 10 views
5

У меня есть функция внутри исполняемого файла, которую я бы назвал из моей 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. Это не место.

+1

При проверке с помощью olly вы убедились, что функция не хранится внутри другого модуля, который использует ForgedAlliance1.exe, а не сам исполняемый файл? – Bauss

+0

@Bauss Хм, я немного новичок во всем этом, но могу сказать, как я получил адрес: я только что открыл исполняемый файл. Когда я отлаживаю его, я вижу, что начальный адрес - «0x00401000». Поэтому я предполагаю, что все, что я вижу в этом конкретном окне, - это мой исполняемый файл. Каждый раз, когда я сохраняю некоторые изменения в коде сборки исполняемого файла, я перезаписываю исполняемый файл ForgedAlliance1.exe. До тех пор, пока OllyDbg не отображает другие области моей памяти, адрес должен быть правильным и частью исполняемого файла. – displayname

+1

Вы взглянули на эту статью? https://www.codeproject.com/articles/1045674/load-exe-as-dll-mission-possible – Alden

ответ

2

Хорошо, это был просто беспорядочный указатель. Извините за это - долгое время не писал в C. Я сделал это правильно, в основном, но проблема с

f = ((test*)(0x00C0B530)); 
(*f)(); 

в том, что (*f) является 0x909090C3 - инструкции внутри исполняемого файла - и это адрес программа пытается перейти на который, конечно, недействительным.

Так трюк был:

int test_addr = 0x00C0B530 
f = ((test*)(&test_addr)); 
(*f)(); 

Я уверен, что это можно сделать немного проще, но это работает.