Mono.塞西尔负责分支机构等的选址

本文关键字:机构 分支 Mono | 更新日期: 2023-09-27 18:07:26

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

br IL_0003
call *****
IL_0003: ret

,我在后面添加了一个命令****调用将顶部的br像它应该的那样返回到该代码。

是Cecil自己做还是我必须处理所有的分支?:/修复它们并不难,但如果塞西尔不这样做,那么我根本不会开始这个项目,我没有时间(或知识)先进的IL魔法:P

(是的,我知道它不会是IL_0003,它只是一个例子)

Mono.塞西尔负责分支机构等的选址

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

唯一需要注意的情况是分支是短形式分支的情况。如果你注入太多指令,它可能会溢出。

有一个非常简单的方法来处理这个问题。在注入代码之前,只需从monoc . cecil中调用扩展方法SimplifyMacros。岩石,像这样:

method.Body.SimplifyMacros ();

这将扭转br。

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

method.Body.OptimizeMacros ();

是相反的操作,也就是说,它会尝试将br变成br。