Сообщение 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 }.
Отвечу сам себе, и заодно спрошу:
Мне по сути нужен только адресс начала этого зарезервированного блока. По идее я наверно могу получить его вот так:
Вопрос.. могу ли я расчитывать смещение 8 байт. Понятно что для короткго jmp это опкод из 2-х байтов длинной.
А вот если __nop() будет больше то тут уже будет не 8 а другая константа.
Пролог у этой функции всегда будет 6 байт длинной?
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 }.
Отвечу сам себе, и заодно спрошу:
Мне по сути нужен только адресс начала этого зарезервированного блока. По идее я наверно могу получить его вот так:
Вопрос.. могу ли я расчитывать смещение 8 байт. Понятно что для короткго jmp это опкод из 2-х байтов длинной.
А вот если __nop() будет больше то тут уже будет не 8 а другая константа.
Пролог у этой функции всегда будет 6 байт длинной?
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 байт длинной?