如何在要修改的目标程序中更改硬编码值? 我要修改的代码是大量if
链的一部分。 这是我正在查看的特定部分:
if (this.armor[l].type == 665)
{
this.maxTime = 150;
}
我想更改它,以便this.maxTime = int.MaxValue
。 我该怎么做? 而且,如果那不可能,我if
可以定位if
块并进行更改? 还是可以将一些代码附加到方法的末尾以执行我想要的操作?
该值存储在Mono.Cecil.Cil.Instruction
类的Operand
字段中。 简短的版本是更改它仅需要分配给该属性并保存程序集。
长版本是该指令可能是OpCodes.Ldc_I4_S
,它仅对Operand
(-128到127)占用一个OpCodes.Ldc_I4_S
,因此仅将其更改为int.MaxValue(2147483647)将不起作用。 如果这是一个选项,则还可以将Opcode
更改为OpCodes.Ldc_I4
那么您应该可以进行。
如果要进行许多更改,则Mono.Cecil.Rocks.dll中有几个有用的扩展方法: MethodBody.SimplifyMacros
和MethodBody.OptimizeMacros
。 Simplify会将简短的指令转换为长格式,Optimize则相反。 这样做的好处是,您可以使用简化的指令集搜索/重写程序集,并安全地使用带有有限参数集的简短形式的指令。 在这种情况下,您可以调用SimplifyMacros
,将Operand
设置为所需的值,然后调用OptimizeMacro
更改为适当的形式。
验证工作时, ILSpy之类的工具可以让您查看原始装配和修改的装配,这是非常宝贵的。
我将指令替换为另一条指示我想要的值的指令
原始: IL_4361: ldc.i4 150
新增: IL_4361: ldc.i4 2147483647