Цитата:
Сообщение от n3k0nation
Code segment != virt adr
|
Конечно, это вообще разные понятия, но что это доказывает?
Цитата:
Сообщение от n3k0nation
Патчинг кода из дллки или RemoteThread это иной сегмент кода, нежели ранинг уже пропатченого куска кода на клиенте.
|
Не понял смысла этого предложения. "Патчинг это иной сегмент"?
Цитата:
Сообщение от n3k0nation
Ну и многопоточностьмногоядерность не забываем.
|
Не забываем: кэши мультипроцессорной системе инвалидейтятся, конкретно у интел это вариация MESI:
https://en.wikipedia.org/wiki/MESI_protocol
Цитата:
Сообщение от n3k0nation
branch predictors -- в данном случае prefetch queue
Особенно актуально для RemoteThread.
|
Intel Volume 3a, section 11.6, “Self Modifying Code”:
Цитата:
In addition, the P6 family and Pentium processors check whether a write to a code segment may modify an instruction that has been prefetched for execution. If the write affects a prefetched instruction, the prefetch queue is invalidated. This latter check is based on the linear address of the instruction.
|
Возможный вариант рассинхронизации, оттуда же:
Цитата:
Systems software, such as
a debugger, that might possibly modify an instruction using a different linear address
than that used to fetch the instruction, will execute a serializing operation, such as a
CPUID instruction, before the modified instruction is executed, which will automatically
resynchronize the instruction cache and prefetch queue.
|
Другой сценарий, в котором я могу представить проблемы: когда один процессор (ядро) модифицирует код, который уже исполняется другим процессором.
Небольшое исследование по теме с цитатами из 3a:
http://blog.onlinedisassembler.com/blog/?p=133
Я, конечно, допускаю, что дело может быть в синхронизации, но зная X86 – вряд ли…