修改硬编码值

时间:2015-07-06 21:16:42

标签: c# mono mono.cecil hardcoded

如何更改我正在修改的目标程序中的硬编码值?我想要修改的代码是大量if链的一部分。这是我正在研究的具体部分:

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

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

2 个答案:

答案 0 :(得分:0)

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

长版本是指令可能是OpCodes.Ldc_I4_S,它只需要Operand(-128到127)的sbyte,因此单独将其更改为int.MaxValue(2147483647)将不起作用。如果这是一次性的,您也可以将Opcode更改为OpCodes.Ldc_I4,那么您应该很高兴。

如果您进行了许多更改,那么Mono.Cecil.Rocks.dll中有一些有用的扩展方法:MethodBody.SimplifyMacrosMethodBody.OptimizeMacros。简化会将短格式指令转换为长格式,而Optimize则会反过来。这样做的好处是,您可以使用精简指令集搜索/重写汇编,并安全地使用具有有限参数集的短表格的指令。在这种情况下,您可以致电SimplifyMacros,将Operand设置为您想要的值,然后致电OptimizeMacro以更改为相应的表单。

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

答案 1 :(得分:0)

我用不同的指令替换了指令,表示我想要的值

原件: IL_4361: ldc.i4 150

新: IL_4361: ldc.i4 2147483647