В старой версии (сужу по v3.5.1, не знаю когда это поведение поменялось) весь код ВМ располагался в секциях VMProtect, куда управление из защищаемых функций попадало через простые джампы. То есть есть весь код ВМ ссылался лишь сам на себя и на свои секции.
В последней версии (v3.8.4.1798) некоторая часть ВМ располагается прямо на месте защищаемых функций. На бумаге все хорошо, оптимизируется используемое пространство, но есть одно но в текущем положении дел: код ВМ из одной секции может бесконтрольно ссылаться на код ВМ из другой секции.
У меня это вылилось в то, что программа теперь крашится при доступе к секциям, которые были зачищены случайными байтами + помечены как NX, в те моменты когда таких доступов уже быть не должно. Я так понимаю, ВМ переиспользует различный код, чтоб не плодить копии по программе, что опять же хорошо, но лучше бы эту оптимизацию сделать только в рамках одной секции, либо же хотя бы учитывать discardable-флаг на секциях и не ссылаться на них из других секций.
Не знаю, что сделать проще, но просьба либо сделать чекбокс для использования старого режима (в котором весь код ВМ был лишь в секциях .vmp, а из остальных секций были джампы), либо поправить логику работы инлайнинга.
необязательно, посмотрите на ntoskrnl.exe с Win11 22H2.
но в любом случае, опять же, можно и обойтись чекбоксом, для использования старого режима, если так проще будет
В вашем примере ВМ генерируется для функции из “.text” (без discardable флага) и из “init.p” (с disсardable флагом), поэтому секция ВМ не имеет disacrdable флага и вмпротект снимает disacrdable флаг у всех секции, которые идут раньше в том числе и у “init.p”.
P.S. Там еще и Exception Directory перезаписывается в новое место, для которой discardable тоже снимается.
У меня это вылилось в то, что программа теперь крашится при доступе к секциям, которые были зачищены случайными байтами + помечены как NX, в те моменты когда таких доступов уже быть не должно.