【问题标题】:Modify hard coded value修改硬编码值
【发布时间】:2015-07-06 21:16:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# mono mono.cecil hardcoded


    【解决方案1】:

    该值存储在Mono.Cecil.Cil.Instruction 类的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 则相反。这样做的好处是您可以使用简化的指令集搜索/重写您的程序集,并安全地使用具有有限参数集的简短形式的指令。在这种情况下,您将调用SimplifyMacros,将Operand 设置为您想要的值,然后调用OptimizeMacros 以更改为适当的形式。

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

    【讨论】:

      【解决方案2】:

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

      原文: IL_4361: ldc.i4 150

      新: IL_4361: ldc.i4 2147483647

      【讨论】:

        猜你喜欢
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2016-11-04
        • 2018-10-30
        • 1970-01-01
        • 2013-08-08
        相关资源
        最近更新 更多