Mono.Cecil是否负责分支机构等位置?

时间:2011-09-01 07:58:28

标签: c# .net cil mono.cecil

这个问题可能看起来很奇怪但很简单 - 我的观点是如果我在反编译代码中有一个“goto”(brtrue等),例如

br IL_0003
call *****
IL_0003: ret

然后在****调用之后添加一个命令,将顶点处的br恢复为应该或该代码。

塞西尔独自完成这项工作还是我必须照顾所有这些分支机构? :/ 修复它们并不是很难,但如果塞西尔不这样做,那么我根本就不会启动这个项目,我没有时间(或知识)获得高级IL魔法:P

(是的,我知道它不会是IL_0003,仅仅是例如)

1 个答案:

答案 0 :(得分:16)

是的,Cecil将为您更新分支。

您必须要处理的唯一情况是分支是一个简短形式的分支。如果注入太多指令,它可能会溢出。

有一种非常简单的方法可以解决这个问题。在注入代码之前,只需从Mono.Cecil.Rocks调用扩展方法SimplifyMacros,如下所示:

method.Body.SimplifyMacros ();

这会将br.s变为br。

当你完成注入代码时,只需调用:

method.Body.OptimizeMacros ();

这是相反的操作,也就是说,如果可能的话,它会尝试将br转换成br.s。