修改硬编码值

问题描述 投票:0回答:2

如何在要修改的目标程序中更改硬编码值? 我要修改的代码是大量if链的一部分。 这是我正在查看的特定部分:

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

我想更改它,以便this.maxTime = int.MaxValue 。 我该怎么做? 而且,如果那不可能,我if可以定位if块并进行更改? 还是可以将一些代码附加到方法的末尾以执行我想要的操作?

c# mono mono.cecil hardcoded
2个回答
0
投票

该值存储在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.SimplifyMacrosMethodBody.OptimizeMacros 。 Simplify会将简短的指令转换为长格式,Optimize则相反。 这样做的好处是,您可以使用简化的指令集搜索/重写程序集,并安全地使用带有有限参数集的简短形式的指令。 在这种情况下,您可以调用SimplifyMacros ,将Operand设置为所需的值,然后调用OptimizeMacro更改为适当的形式。

验证工作时, ILSpy之类的工具可以让您查看原始装配和修改的装配,这是非常宝贵的。


0
投票

我将指令替换为另一条指示我想要的值的指令

原始: IL_4361: ldc.i4 150

新增: IL_4361: ldc.i4 2147483647

© www.soinside.com 2019 - 2024. All rights reserved.