Изменить жестко закодированное значение
Как я могу изменить жестко запрограммированное значение в целевой программе, которую я изменяю? Код, который я хочу изменить, является частью огромного 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
на значение, которое вы хотите, затем позвоните OptimizeMacro
s, чтобы перейти к соответствующей форме.
Такой инструмент, как ILSpy, который позволит вам взглянуть на оригинальные и измененные сборки, неоценим при проверке вашей работы.
Я заменил инструкцию на другую, указывающую желаемое значение
Оригинал:IL_4361: ldc.i4 150
Новое:IL_4361: ldc.i4 2147483647