修改硬编码值
本文关键字:编码值 修改 | 更新日期: 2023-09-27 18:01:27
如何更改我正在修改的目标程序中的硬编码值?我要修改的代码是一个庞大的if
链的一部分。这是我要查看的特定部分:
if (this.armor[l].type == 665)
{
this.maxTime = 150;
}
我想改变它,使this.maxTime = int.MaxValue
。我该怎么做呢?而且,如果这是不可能的,我可以针对if
块并改变它吗?或者我可以在方法的末尾附加一些代码来做我想做的事情吗?
保存在Mono.Cecil.Cil.Instruction
类的Operand
字段中。简而言之,更改它只需要为该属性赋值并保存程序集。
长版本是指令可能是OpCodes.Ldc_I4_S
, Operand
(-128到127)只占用一个字节,所以将其更改为int。MaxValue(2147483647)单独不起作用。如果这是一次性的,您也可以将Opcode
更改为OpCodes.Ldc_I4
,然后您应该很好地开始。
如果你要做很多更改,那么在monol . cecil . rocks .dll中有几个有用的扩展方法:MethodBody.SimplifyMacros
和MethodBody.OptimizeMacros
。Simplify将把短形式的指令变成长形式,Optimize将做相反的事情。这样做的好处是,您可以使用简化的指令集搜索/重写程序集,并安全地使用具有有限参数集的简短形式的指令。在这种情况下,您将调用SimplifyMacros
,将Operand
设置为您想要的值,然后调用OptimizeMacro
s以更改为适当的形式。
像ILSpy这样的工具可以让您查看原始和修改的程序集,在验证您的工作时是非常宝贵的。
我用另一条指示我想要的值的指令替换了这条指令
原始:IL_4361: ldc.i4 150
新:IL_4361: ldc.i4 2147483647