修改硬编码值

Modify hard coded value

如何更改我正在修改的目标程序中的硬编码值?我要修改的代码是一个巨大的 if 链的一部分。这是我正在查看的特定部分:

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

我想将其更改为 this.maxTime = int.MaxValue。我如何做到这一点?而且,如果这不可能,我可以定位 if 块并更改它吗?或者我可以在方法的末尾附加一些代码来做我想做的事吗?

该值存储在 Mono.Cecil.Cil.Instruction class 的 Operand 字段中。简短的版本是更改它只需要分配给 属性 并保存程序集。

长版本是该指令可能 OpCodes.Ldc_I4_S 只需要一个 sbyte 用于 Operand(-128 到 127),因此单独将其更改为 int.MaxValue(2147483647)不管用。如果这是一次性的,您还可以将 Opcode 更改为 OpCodes.Ldc_I4 那么您就可以开始了。

如果您要进行很多更改,那么 Mono.Cecil.Rocks.dll 中有几个有用的扩展方法:MethodBody.SimplifyMacrosMethodBody.OptimizeMacros。 Simplify 会将短格式指令转换为长格式,而 Optimize 则相反。这样做的好处是,您可以 search/rewrite 使用精简指令集的程序集,并安全地使用具有简短形式和有限参数集的指令。在这种情况下,您将调用 SimplifyMacros,将 Operand 设置为您想要的值,然后调用 OptimizeMacros 以更改为适当的形式。

ILSpy 这样的工具可以让您查看原始和修改后的程序集,这在验证您的工作时非常有用。

我用另一条指示我想要的值的指令替换了指令

原文: IL_4361: ldc.i4 150

新: IL_4361: ldc.i4 2147483647