2015-07-08 2 views
1

Я понимаю, что когда функция вызывается в первый раз, JIT вызывается и компилирует код .Net IL в инструкцию x86 и сохраняет ее в где-то в памяти. Мне нужно знать, где находится этот код x86, чтобы я мог анализировать инструкции сборки x86 (цель в этом вопросе не очень важна). Может ли кто-нибудь сказать мне, как определить место памяти в который хранится переведенный код, или, возможно, какая функция в коде JIT делает это. У меня есть код JIT со мной (как .net исходный код опубликован в GitHub, но до сих пор меня поражает размер кода). Я был бы признателен за любую помощь. Заранее спасибо ...Где я могу найти код x86, скомпилированный .Net JIT

Это помогло бы, если бы кто-нибудь мог предложить дизассемблер, который мог бы дать дамп команды сборки x86 работающего .net exe, как и визуальная студия дизассемблера, но мне нужно запустить ее автоматически. Я знаю, что это можно сделать статически ngen. ngen может преобразовать в инструкции x86, а затем любой дизассемблер может получить дамп, но для меня важно, чтобы это было сделано после запуска exe.

Это потому, что причиной, по которой мне нужен дамп команды x86, - это найти сходство между несколькими .net exes. Задача с прямым просмотром статически разобранной сборки заключается в том, что она может быть упакована или запутана, и в этом случае они могут выглядеть несходными, даже если они внутренне похожи. Но во время выполнения они будут распакованы/деобфассированы программой упаковщика, а команды JIT, составленные с использованием x86, будут похожи.

+1

Зачем вам место в памяти? Почему бы не посмотреть окно 'Dissasembly' в Visual Studio? –

+0

Удаление ссылки на '[Java]', потому что этот вопрос касается .NET. – xanatos

+1

Это, как правило, невозможно, адрес очень случайный и никогда не повторяется. Функция защиты от вредоносных программ. Только профайлер выстрелил в него. Избегайте задавать XY-вопрос, «анализировать» ничего не значит, и в этом контексте он действительно необходим. –

ответ

1

Вы можете использовать debugger api, чтобы прочитать приведенные инструкции из процесса. (В частности, комбинация ICorDebugFunction::GetNativeCode, ICorDebugCode2::GetCodeChunks и ICorDebugProcess::ReadMemory).

Выполнение подобных действий, вероятно, потребует, чтобы метод уже был сбит ... но вы, вероятно, могли бы организовать это с использованием ICorDebugEval (возможно, с точкой останова в начале метода и последующим прерыванием eval при его ударе) ,

+0

. Я только начинаю следовать этому подходу, поэтому не знаю, может ли он быть успешным или нет. Но похоже, что это действительно поможет мне. Огромное спасибо. –

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