Информация об изменениях

Сообщение Re[3]: MSVC x64 зарезервировать место внутри метода от 06.07.2019 10:38

Изменено 06.07.2019 10:39 nen777w

Re[3]: MSVC x64 зарезервировать место внутри метода
Здравствуйте, nen777w, Вы писали:

N>>>В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.

N>>>Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
C>>__nop?

N>Спасибо. Действительно генерирует nop на месте вызова.

N>Гм... А ест способ получить адрес метки? (Для 32битного копилятора это __asm { mov dword ptr to, offset lbl }.

Отвечу сам себе, и заодно спрошу:
Мне по сути нужен только адресс начала этого зарезервированного блока. По идее я наверно могу получить его вот так:
#pragma optimize( "", off )
void test_func()
{
    goto l;

    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

l:
    uint64_t r = reinterpret_cast<uint64_t>(&buggyFunc);
    char *p = reinterpret_cast<char*>(r);
    p += 8; //<-- Вопрос.. могу ли я расчитывать на это смещение?

    int v = *(int*)p; //<-- Содержит: 0x90909090
}
#pragma optimize( "", on )


Вопрос.. могу ли я расчитывать смещение 8 байт. Понятно что для короткго jmp это опкод из 2-х байтов длинной.
А вот если __nop() будет больше то тут уже будет не 8 а другая константа.
Пролог у этой функции всегда будет 6 байт длинной?
Re[3]: MSVC x64 зарезервировать место внутри метода
Здравствуйте, nen777w, Вы писали:

N>>>В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.

N>>>Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
C>>__nop?

N>Спасибо. Действительно генерирует nop на месте вызова.

N>Гм... А ест способ получить адрес метки? (Для 32битного копилятора это __asm { mov dword ptr to, offset lbl }.

Отвечу сам себе, и заодно спрошу:
Мне по сути нужен только адресс начала этого зарезервированного блока. По идее я наверно могу получить его вот так:
#pragma optimize( "", off )
void test_func()
{
    goto l;

    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

l:
    uint64_t r = reinterpret_cast<uint64_t>(&test_func);
    char *p = reinterpret_cast<char*>(r);
    p += 8; //<-- Вопрос.. могу ли я расчитывать на это смещение?

    int v = *(int*)p; //<-- Содержит: 0x90909090
}
#pragma optimize( "", on )


Вопрос.. могу ли я расчитывать смещение 8 байт. Понятно что для короткго jmp это опкод из 2-х байтов длинной.
А вот если __nop() будет больше то тут уже будет не 8 а другая константа.
Пролог у этой функции всегда будет 6 байт длинной?