如何更改正在修改的目标程序中的硬编码值?我要修改的代码是一个庞大if
链的一部分。这是我正在查看的特定部分:
if (this.armor[l].type == 665)
{
this.maxTime = 150;
}
我想改变它,这样this.maxTime = int.MaxValue
。我该如何做到这一点?而且,如果这不可能,我可以定位if
块并改变它吗?或者我可以在方法的末尾附加一些代码来做我想做的事吗?
如何更改正在修改的目标程序中的硬编码值?我要修改的代码是一个庞大if
链的一部分。这是我正在查看的特定部分:
if (this.armor[l].type == 665)
{
this.maxTime = 150;
}
我想改变它,这样this.maxTime = int.MaxValue
。我该如何做到这一点?而且,如果这不可能,我可以定位if
块并改变它吗?或者我可以在方法的末尾附加一些代码来做我想做的事吗?
该值存储在类的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