Я читал о различных вещах на CodeProject, и я нашел эту статью: http://www.codeproject.com/Articles/29527/Reverse-Engineering-and-Function-Calling-by-Addres
Поэтому я создал инжектор и DLL и взял образец исполняемого файла. Это в основном выводит это, когда вы нажимаете F11:
http://i.stack.imgur.com/YIygV.jpg
Итак, я следовал всему уроку, но дело в том, что адрес, используемый в DLL, всегда меняется. Этот, чтобы быть конкретным:
pFunctionAddress pMySecretFunction = (pFunctionAddress)(0x004113C0);
В его уроке адрес для функции 0x004113C0. По моему это что-то еще, и я беру тот, который у меня есть, и использую его. Он работает отлично, но когда я закрываю исполняемый файл и открываю его, он больше не работает, и OllyDbg показывает, что адрес является совершенно новым.
Поэтому я немного исследовал и начал добавлять точки останова с помощью OllyDbg. Я узнал, что адрес всегда будет:
main + 4C
Где я предполагаю, что «основной» является основным модулем этих исполняемых файлов. Как я могу найти этот адрес для функции всегда? Потому что это все время меняется, и я ничего не понимаю в этой точке. В этой статье я прочитал, что в нем не рассказывается, что происходит, когда исполняемый файл повторно открывается, и я потратил 5 часов, пытаясь найти решение.
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Огромное спасибо всем. Благодаря MFC особенно у меня есть в конце концов догадаться! То, что я заканчивал тем, что делал, всякий раз, когда я нажимал DLL_PROCESS_ATTACH, я устанавливал глобальный HMODULE по адресу исполняемого файла, например так:
HMODULE g_hExeModule;
g_hExeModule = GetModuleHandle(L"TutExample.exe");
И после нескольких тестов кажется, что адрес функции всегда является адресом исполняемого файла + 0x11014, поэтому в вызове я просто делаю:
pFunctionAddress pMySecretFunction = (pFunctionAddress)((DWORD)g_hExeModule + 0x11014);
Я не могу ни редактировать свое сообщение, ни добавлять какие-либо замечания, поэтому я должен опубликовать это как новый ответ.
Ваш результат:
Exe loaded at: 00000000 (wrong, probably: 00BE0000 and offset is: 00001005)
Target function at: 00BE1005
Exe loaded at: 00000000 (wrong, probably: 01230000 and offset is: 00001005)
Target function at: 01231005
Exe loaded at: 00000000 (wrong, probably: 012A0000 and offset is: 00001005)
Target function at: 012A1005
Пожалуйста, проверьте имя вашего скомпилированного EXE-файла, это TutExample.exe? если нет, измените его на точное имя в вызове GetModuleHandle.
Значение «00000000» указывает на сбой GetModuleHandle, поскольку имя «TutExample.exe» не найдено в текущем пространстве памяти.
Адрес целевой функции выглядит нормально. Просто минус этот адрес с адресом загруженного exe, и вы получите смещение внутри макета памяти exe.
Вы можете сделать ту же самую математику внутри вашей введенной dll, чтобы всегда правильно отслеживать адрес целевой функции независимо от того, как ОС загружает исполняемый файл.
поэтому, если я найду способ получить адрес «main», я могу добавить смещение 4C, и функция всегда будет там, я думаю
Опять же, функции У меня есть адрес:
void *(funcPtr)() = (void (*)())((char *)&main + 0x4C);
// If you were right, and you also substituted the appropriate
// function signature above, then this should work:
funcPtr();
Функция, которую вы пытаетесь вызвать, находится внутри exe-файла, поэтому смещение ссылки должно быть относительно адреса памяти, который загружен exe-файлом.
Смещение целевой функции должно быть константой, изменяемой только после каждой компиляции исходного кода.
Чтобы узнать больше о вашем exe-файле, добавьте эти две строки в ваш exe-файл:
printf(_T("Exe loaded at: %08X"), GetModuleHandle(_T("TutExample.exe")));
printf(_T("Target function at: %08X"), mySecretFunction);
Более новые ОС имеют функцию под названием ASLR (рандомизация расположения адресного пространства). Преступники используют некоторые уловки, которые вы используете. Таким образом, чтобы сделать плохих парней труднее, EXE и DLL получают разные адреса каждый раз, когда вы запускаете программу.
Если вы скомпилировали DLL, есть возможность отключить ASLR для вашей DLL.