如何更改我正在修改的目标程序中的硬编码值?我想要修改的代码是大量if
链的一部分。这是我正在研究的具体部分:
if (this.armor[l].type == 665)
{
this.maxTime = 150;
}
我想更改this.maxTime = int.MaxValue
。我该如何做到这一点?而且,如果那是不可能的,我可以定位if
块并更改它吗?或者我可以在方法的末尾附加一些代码来做我想要的吗?
答案 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.SimplifyMacros
和MethodBody.OptimizeMacros
。简化会将短格式指令转换为长格式,而Optimize则会反过来。这样做的好处是,您可以使用精简指令集搜索/重写汇编,并安全地使用具有有限参数集的短表格的指令。在这种情况下,您可以致电SimplifyMacros
,将Operand
设置为您想要的值,然后致电OptimizeMacro
以更改为相应的表单。
在验证您的工作时,ILSpy这样的工具可以让您查看原始和修改的程序集。
答案 1 :(得分:0)
我用不同的指令替换了指令,表示我想要的值
原件:
IL_4361: ldc.i4 150
新:
IL_4361: ldc.i4 2147483647