Где в виртуальной памяти я могу найти код x86, скомпилированный.Net JIT
Я понимаю, что когда функция вызывается впервые, вызывается JIT, который компилирует код.Net IL в инструкцию x86 и сохраняет ее где-то в памяти. Мне нужно знать место, где хранится этот код x86, чтобы я мог проанализировать инструкции по сборке x86 (цель не очень важна в контексте этого вопроса.) Может кто-нибудь сказать мне, как определить местоположение памяти, в котором переведенный код сохраняется, или, вероятно, какая функция в коде JIT делает это. У меня есть JIT-код (исходный код.net опубликован в GitHub, но пока я поражен размером кода). Буду признателен за любую помощь. Заранее спасибо...
Было бы полезно, если бы кто-то мог предложить дизассемблер, который мог бы дать дамп инструкции по сборке x86 для работающего.net exe, так же, как это делает дизассемблер в Visual Studio, но мне нужно запустить его автоматически. Я знаю, что это может быть сделано статически с помощью ngen. ngen может преобразовать инструкции в x86, и тогда любой дизассемблер сможет получить дамп, но для меня важно, чтобы это было сделано после запуска exe.
Это потому, что причина, по которой мне нужен дамп инструкций x86, заключается в том, чтобы найти сходство между несколькими.net exe. Сложность прямого взгляда на статически разобранную сборку заключается в том, что она может быть упакована или запутана, и в этом случае они могут выглядеть непохожими, даже если они внутренне похожи. Но во время выполнения они будут распакованы / разблокированы программой-упаковщиком, и скомпилированные JIT инструкции x86 будут выглядеть примерно так.
1 ответ
Вы можете использовать API отладчика, чтобы прочитать сопряженные инструкции из процесса. (В частности, комбинация ICorDebugFunction:: GetNativeCode, ICorDebugCode2:: GetCodeChunks и ICorDebugProcess:: ReadMemory).
Чтобы сделать это таким образом, вероятно, потребуется, чтобы метод уже был объединен... но вы, вероятно, могли бы сделать это, используя ICorDebugEval (возможно, с точкой останова в начале метода и затем прерывая eval при его обращении).