修改硬编码值
Modify hard coded value
如何更改我正在修改的目标程序中的硬编码值?我要修改的代码是一个巨大的 if
链的一部分。这是我正在查看的特定部分:
if (this.armor[l].type == 665)
{
this.maxTime = 150;
}
我想将其更改为 this.maxTime = int.MaxValue
。我如何做到这一点?而且,如果这不可能,我可以定位 if
块并更改它吗?或者我可以在方法的末尾附加一些代码来做我想做的事吗?
该值存储在 Mono.Cecil.Cil.Instruction
class 的 Operand
字段中。简短的版本是更改它只需要分配给 属性 并保存程序集。
长版本是该指令可能 OpCodes.Ldc_I4_S
只需要一个 sbyte 用于 Operand
(-128 到 127),因此单独将其更改为 int.MaxValue(2147483647)不管用。如果这是一次性的,您还可以将 Opcode
更改为 OpCodes.Ldc_I4
那么您就可以开始了。
如果您要进行很多更改,那么 Mono.Cecil.Rocks.dll 中有几个有用的扩展方法:MethodBody.SimplifyMacros
和 MethodBody.OptimizeMacros
。 Simplify 会将短格式指令转换为长格式,而 Optimize 则相反。这样做的好处是,您可以 search/rewrite 使用精简指令集的程序集,并安全地使用具有简短形式和有限参数集的指令。在这种情况下,您将调用 SimplifyMacros
,将 Operand
设置为您想要的值,然后调用 OptimizeMacro
s 以更改为适当的形式。
像 ILSpy 这样的工具可以让您查看原始和修改后的程序集,这在验证您的工作时非常有用。
我用另一条指示我想要的值的指令替换了指令
原文:
IL_4361: ldc.i4 150
新:
IL_4361: ldc.i4 2147483647
如何更改我正在修改的目标程序中的硬编码值?我要修改的代码是一个巨大的 if
链的一部分。这是我正在查看的特定部分:
if (this.armor[l].type == 665)
{
this.maxTime = 150;
}
我想将其更改为 this.maxTime = int.MaxValue
。我如何做到这一点?而且,如果这不可能,我可以定位 if
块并更改它吗?或者我可以在方法的末尾附加一些代码来做我想做的事吗?
该值存储在 Mono.Cecil.Cil.Instruction
class 的 Operand
字段中。简短的版本是更改它只需要分配给 属性 并保存程序集。
长版本是该指令可能 OpCodes.Ldc_I4_S
只需要一个 sbyte 用于 Operand
(-128 到 127),因此单独将其更改为 int.MaxValue(2147483647)不管用。如果这是一次性的,您还可以将 Opcode
更改为 OpCodes.Ldc_I4
那么您就可以开始了。
如果您要进行很多更改,那么 Mono.Cecil.Rocks.dll 中有几个有用的扩展方法:MethodBody.SimplifyMacros
和 MethodBody.OptimizeMacros
。 Simplify 会将短格式指令转换为长格式,而 Optimize 则相反。这样做的好处是,您可以 search/rewrite 使用精简指令集的程序集,并安全地使用具有简短形式和有限参数集的指令。在这种情况下,您将调用 SimplifyMacros
,将 Operand
设置为您想要的值,然后调用 OptimizeMacro
s 以更改为适当的形式。
像 ILSpy 这样的工具可以让您查看原始和修改后的程序集,这在验证您的工作时非常有用。
我用另一条指示我想要的值的指令替换了指令
原文:
IL_4361: ldc.i4 150
新:
IL_4361: ldc.i4 2147483647