Изменить жестко закодированное значение

Как я могу изменить жестко запрограммированное значение в целевой программе, которую я изменяю? Код, который я хочу изменить, является частью огромного if цепь. Это конкретный раздел, на который я смотрю:

if (this.armor[l].type == 665)
{
    this.maxTime = 150;
}

Я хочу изменить это так, чтобы this.maxTime = int.MaxValue, Как мне это сделать? И, если это невозможно, могу ли я if заблокировать и изменить это? Или я могу добавить код в конец метода, чтобы сделать то, что я хочу?

2 ответа

Решение

Значение хранится в Operand поле Mono.Cecil.Cil.Instruction учебный класс. Короткая версия заключается в том, что для его изменения требуется только присвоить это свойство и сохранить сборку.

Длинная версия, что инструкция скорее всего OpCodes.Ldc_I4_S который занимает всего один раз Operand (От -128 до 127), поэтому изменение его на int.MaxValue (2147483647) само по себе не будет работать. Если это один раз, вы также можете изменить Opcode в OpCodes.Ldc_I4 тогда тебе должно быть хорошо идти.

Если вы делаете много изменений, то есть несколько полезных методов расширения в Mono.Cecil.Rocks.dll: MethodBody.SimplifyMacros а также MethodBody.OptimizeMacros, Simplify превратит краткие инструкции в их длинную форму, а Optimize сделает обратное. Плюсом этого является то, что вы можете искать / переписывать вашу сборку с сокращенным набором команд и безопасно работать с инструкциями, которые имеют короткие формы с ограниченным набором аргументов. В этом случае вы бы позвонили SimplifyMacros, установить Operand на значение, которое вы хотите, затем позвоните OptimizeMacros, чтобы перейти к соответствующей форме.

Такой инструмент, как ILSpy, который позволит вам взглянуть на оригинальные и измененные сборки, неоценим при проверке вашей работы.

Я заменил инструкцию на другую, указывающую желаемое значение

Оригинал:IL_4361: ldc.i4 150

Новое:IL_4361: ldc.i4 2147483647

Другие вопросы по тегам