Я не могу найти часть данных в IDA

У меня есть книга, которую мне нужно прочитать в школе, и есть упражнение по созданию программы в Visual Studio на языке C, которая печатает «Hello!» и вставьте его в IDA. Затем вам нужно найти, где находится строка «Привет!» то, что было определено в программе, было сохранено, и я думаю, что нашел. Затем он говорит:

Внутри нашего main мы сосредоточимся на двух строках. Первое, aHello offset push. Эта строка помещает в стек адрес памяти строки Hello. Если мы нажмем aHello, мы будем перенаправлены на адрес строки в памяти», однако я не могу найти ни эту строку, ни ключевое слово «aHello» нигде в IDA.

После этого идет фото-пример и следующий текст:

Видно, что строка определена по адресу 416B94 и после нее определен символ 0Ah (как помнится из исследований по сборке, перенос строки), за которым следует символ 0 (как вы помните, обозначает конец строки для функций вывода).

Я пытался перейти к этой линии, но не смог ее найти. Мне было интересно, смогу ли я получить некоторые знания о IDA.

Код, который я использовал в программе:

#include <stdio.h>

int main() {
    printf("Hello!");
    return 0;
}

Извините, если я выразился что-то неправильно. Книга не на английском языке, и я новичок в IDA и языке C.

Инструкция должна быть push offset aHello, а не aHello offset push. Возможно, в IDA он написан по-другому или сгенерирован вашим компилятором по-другому — проследите за XREF в строке aHello, чтобы увидеть, где он используется.

interjay 11.08.2024 18:52

Кажется, вы описываете здесь то, что, по словам вашей книги, вы должны видеть, но что вы видите на самом деле?

500 - Internal Server Error 11.08.2024 18:55

@interjay Я тоже не могу найти эту строчку. Обычно я не могу найти слово aHello ни в одном сегменте данных.

yarden 11.08.2024 19:01

Вы это показали на скриншоте. Или вы зачем-то выложили скриншот из книги?

interjay 11.08.2024 19:02

@500-Внутренняя ошибка сервера. Есть ли способ как-нибудь загрузить весь файл IDA? Я не знаю, какую часть мне следует разместить.

yarden 11.08.2024 19:02

Картинка из книги @interjay

yarden 11.08.2024 19:03

Ну, у меня нет установленного банкомата IDA, и я давно им не пользовался, но видите ли вы что-нибудь «главное» на экране IDA? (я думаю, вам следует это сделать, если ваша программа была построена с использованием отладочной информации)

500 - Internal Server Error 11.08.2024 19:09

@500-InternalServerError Вопрос касается строкового литерала, который, вероятно, находится в другом сегменте, чем функция main().

Barmar 11.08.2024 19:13

@500-Внутренняя ошибка сервера, насколько я видел, она есть. Хотя я там ничего не вижу. Я добавил это к вопросу о теле.

yarden 11.08.2024 19:13

Ах, это прямо посередине вашего снимка экрана: 1400118ac: lea rcx, _Format ; "Привет!". Это загружает адрес «Hello!» строку (с именем «Формат») в ecx. Книга, вероятно, была основана на версии компилятора, отличной от той, которую вы используете, возможно, на 32-битной — здесь у вас 64-битный код.

500 - Internal Server Error 11.08.2024 19:17

@500-Внутренняя ошибка сервера. Думаю, именно там она и сохраняется. Тем не менее, я до сих пор не могу найти строку push offset aHello. Он еще нужен или он мне теперь не нужен?

yarden 11.08.2024 19:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, в вашей книге описан 32-битный пример, в котором перед вызовом printf помещается указатель на строку формата (автоматически называемую aHello) в стек.

Ваш двоичный файл является 64-битным с другим соглашением о вызовах, где регистр rcx используется для хранения указателя на строку формата (автоматически называемую _Format) вместо стека (поэтому инструкция push не требуется).

Если вы перейдете туда, где определен _Format (возможно, воспользуетесь функцией XREF, чтобы найти его), вы найдете байты, составляющие вашу строку.

(Похоже, ваша версия IDA использует имя аргумента функции для генерации имени, а версия книги использовала содержимое строки для генерации имени.)

Я нажал «Привет» на строке _Format, и это привело меня к строке _Format db 'Hello!',0 ; DATA XREF: main+1C↑o, которая не должна вести меня к SEG данных? Например, когда вы используете сборку и отлаживаете ее в DOSBox, где все записано в шестнадцатеричном формате? И заменяет ли это строку push offset aHello?

yarden 11.08.2024 19:26

@yarden Я предполагаю, что это, вероятно, сегмент данных, доступный только для чтения, хотя я не могу проверить то, что вы вставили. В этом соглашении о вызовах вместо стека используется регистр, поэтому не будет инструкции push, а будет только назначение регистра.

Alexander O'Mara 11.08.2024 19:30

Это привело вас к сегменту rdata (поскольку строковые литералы C неизменяемы, компилятор помещает их в данные, доступные только для чтения). Слева от этой копии будет что-то вроде .rdata:...., как в том примере, который вы привели в вопросе.

Andrey Turkin 12.08.2024 06:43

Другие вопросы по теме