Нахождение адреса функции в памяти - PullRequest
3 голосов
/ 10 июня 2019

Ради интереса я хотел разобрать свой код на С ++, и я узнал, как программа вызывает функцию, я узнал, что байт 0xE8 представляет инструкцию вызова, за которой следуют 4 байта, которые приводят к первой команде требуемой функции. При использовании средства просмотра памяти Visual Studio 4 байта, которые идут после байта инструкции 0xE8, не приводят к первой инструкции функции, известной как адрес функции.

Для примера

Адрес printf: 046FC90h -> Что означает «h»?

4 байта, которые мне удалось извлечь, это 53 d1 06 00

enter image description here

1 Ответ

1 голос
/ 10 июня 2019

Привет, так как ваш код C изложен так

void Func() {
    printf("Just a Func");
}

У нас есть функция, которую мы вызываем, и она печатает Just a Func. Чтобы получить адрес этой функции, мы можем поставить перед ней префикс &, например &Func

h, которое вы видите, представляет шестнадцатеричное (Base 16), и число, которое вы видите, может быть представлено 3 способами, но не все поддерживаются каждым компилятором, 046FC90h и 0x046FC90, что в десятичном виде означает 4652176

Но первоначальный вопрос заключался в том, как получить адрес функции, а это оператор &.

void Func() {
    printf("Just a Func");
}

int main(int argc, char** args) {
    printf("addr = %i", &Func); // print address to terminal
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...