MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Помощь с редактированием кода C# для получения идентификатора ЦП"
Answer 1492065
Ошибка возникает из-за того, что объявление локальных переменных-ссылок (ref locals) доступно только с версии C# 7.0 (Visual Studio 2017). В данном случае необходимости в ref нет, так как переменная типа byte[] сама по себе является ссылкой на массив (массивы в C# являются ссылочными типами). Присваивание переменной-массива не создает новую копию массива, а лишь присваивает ссылку на тот же массив в новую ячейку памяти. То есть можно просто убрать ref из объявления переменной:
byte[] code; if (IsX64Process()) code = code_x64; else code = code_x86;
и код скомпилируется, и даже заработает! У меня он выдает значения, вроде совпадающие с показаниями CPU-Z. Однако вас наверняка интересует, правильно/хорошо ли использовать такой трюк для запуска машинного кода из C#?
Я вижу тут несколько проблем:
Безопасность. Вы разрешаете выполнение машинного кода с целой страницы памяти на управляемой куче. На ней могут располагаться другие данные, а также сборщик мусора может впоследствии переместить на нее вообще что-то другое в ходе сжатия кучи. Это потенциальный вектор для уязвимостей. Лучше убирать разрешение на выполнение кода после завершения работы функции, либо генерировать код не в куче, а в памяти, самостоятельно выделенной вызовом VirtualAlloc.
Согласованность кэша инструкций. По документации Windows положено вызывать FlushInstructionCache после динамической генерации нового машинного кода в памяти:
When protecting a region that will be executable, the calling program bears responsibility for ensuring cache coherency via an appropriate call to FlushInstructionCache once the code has been set in place. Otherwise attempts to execute code out of the newly executable region may produce unpredictable results.
Кроме того, следует помнить, что инструкция cpuid, вызванная, как у вас, с параметром 1, возвращает некоторую информацию о модели CPU, но не уникальный идентификатор конкретного изделия. Проблема уникальных идентификаторов ранее обсуждалась здесь.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.