10

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

br IL_0003
call *****
IL_0003: ret

我在该 **** 调用之后添加一个命令,将 br 置于顶部,使其像应有的那样或该代码。

塞西尔是自己做还是我必须照顾所有这些分支?:/ 修复它们并不难,但如果 Cecil 没有,那么我根本不会启动这个项目,我没有时间(或知识)学习高级 IL 魔法:P

(是的,我知道它不会是 IL_0003,它只是举例)

4

1 回答 1

17

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

您必须注意的唯一情况是分支是短格式分支的情况。如果注入太多指令,它可能会溢出。

有一个非常简单的方法来处理这个。在注入代码之前,只需从 Mono.Cecil.Rocks 调用扩展方法 SimplifyMacros,如下所示:

method.Body.SimplifyMacros ();

这会将 br.s 变成 br。

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

method.Body.OptimizeMacros ();

这是相反的操作,即尽可能将 br 转为 br.s。

于 2011-09-01T08:36:24.907 回答