2013-02-11 4 views
0

У меня есть приложение, которое я написал на C, где мне действительно нужно изменить значение одного из регистров процессора перед вызовом функции. Обычно я делал это с помощью встроенной сборки, но, как мы все знаем, было удалено для 64-битных приложений. Я также не могу сделать это в отдельном файле .asm, который скомпилирован с ml64 из-за определенных ограничений проекта. Поэтому в основном я должен выполнить эквивалент следующего кода инлайн:Visual Studio 2010 x64 __setReg Equivalent Compiler Intrinsic

_asm mov r10d, 0xDEADBEEF 

Кто-нибудь знает творческого метода или какой-либо другой компилятор внутренней для x64, что позволит вам изменить значение регистра инлайн?

+0

* Почему * вам нужно изменить реестр? А какие регистры? –

+0

Это невозможно. Вы устранили альтернативу. –

+3

Вы все равно можете поместить машинный код в массив, сделать исполняемый файл базы данных и выполнить его. Как насчет этого для творчества? –

ответ

1

К сожалению, после рассмотрения возможных обходных решений кажется, что Ханс прав, и просто невозможно изменить содержимое встроенного регистра. Для этого нет встроенного встроенного компилятора, и единственная альтернатива заключается в том, чтобы либо записать всю функцию в 64-битной сборке в виде отдельного файла .asm и скомпилировать ее с помощью ml64, либо сделать так, как предложил Alexey и выделить исполняемый блок памяти до и написать коды операций. Затем вы можете создать указатель на функцию и просто вызвать этот код напрямую. Так, например, если я хотел бы сделать эквивалент:

mov r10d, ecx 
ret 

Просто создать массив для хранения опкодов:

BYTE copyValueToR10[] = "\x44\x8B\xD1\xC3"; 

Вы можете затем VirtualAlloc память для этой маленькой функции с защитой PAGE_EXECUTE. Затем просто создайте указатель на функцию, и вам хорошо идти. Определенно грязный способ сделать это, но, учитывая ограничения отсутствия встроенного asm или желания скомпилировать с использованием ml64, это, по-видимому, единственный способ сделать это.

Смежные вопросы