Это мой первый пост, и я новичок в сборке и отладке, поэтому несите меня, пожалуйста.Адреса в OllyDbg Изменение на перезагрузке программы
Я пытался ввести некоторый код (маленький вызов MessageBoxA) в исполняемый файл Windows 7 Notepad. Однако я столкнулся с проблемой адресов. Сначала я открыл exe в OllyDbg, затем я пошел в строку, содержащую текст ASCII «notepad.pdb». Затем я поместил строку ASCII ниже (например, «INJECTED NOTEPAD»). Далее, ниже, я вошел в этот ассемблерный код:
PUSH 0
PUSH address_of_ASCII_string ; In this case, 00A6B668C
PUSH address_of_ASCII_string ; In this case, 00A6B668C
PUSH 0
CALL MessageBoxA
Затем я пошел в первой строке кода в программе (просто щелкнув правой кнопкой мыши и нажатие Перейти к Origin (или просто нажмите * на цифровой клавиатуре)) Затем я заменил первую строку инструкцией JMP на адрес первого PUSH 0 в моем введенном коде. Затем я поместил инструкцию, которую я заменил в конце введенного кода. После этого я поместил JMP-инструкцию в строку кода после того, как моя команда JMP перескакивает на мой код (да, я просто описал кодек или вид). Все работает нормально, когда я запускаю его. Однако, когда я сохраняю измененный код в новом исполняемом файле и снова запускаю его с помощью OllyDbg, он не работает. Когда я пытаюсь ссылаться на строку ASCII, которую я вставляю, адрес полностью ошибочен. Пример в изображениях ниже:
Как вы можете видеть, я нажимаю строку в стек, но когда я снова перезагрузить измененную программу в отладчик, адрес строки изменений, но мой код этого не делает. Поэтому, когда я вызываю функцию MessageBoxA, она ошибочно, потому что я загрузил неправильный адрес для аргументов Text и Caption. Как это исправить?
Ну да, вы пытаетесь использовать абсолютные адреса, когда должны использоваться относительные адреса. Базовый адрес исполняемого файла является случайным образом при каждом запуске процесса, поэтому фиксированный адрес недействителен для нескольких вызовов. (Также: добро пожаловать в Stack Overflow! Спасибо за хорошо спрошенный и хорошо представленный вопрос.) –
Спасибо. Как я буду использовать относительный адрес? – DD314
Я бы сказал, что вы не пытаетесь ввести код, но патч exe. вам, конечно, нужно использовать не относительные, а абсолютные адреса, но все абсолютные адреса должны быть описаны в разделе '.relocs'. в одном случае ваш патч работает - отключить релокс на exe. для этого вам нужно установить флаг 'IMAGE_FILE_RELOCS_STRIPPED' в' IMAGE_FILE_HEADER.Characteristics' - после этого exe всегда будет загружен на постоянный адрес и возможные абсолютные адреса жесткого кода – RbMm