n00*_*00b 10 .net c# cil mono.cecil
那么这个问题可能看起来很奇怪但很简单 - 我的观点是,如果我在反编译代码中有一个"goto"(brtrue等),例如
br IL_0003
call *****
IL_0003: ret
Run Code Online (Sandbox Code Playgroud)
然后我在****调用之后添加一个命令,将顶点处的br恢复为应该或该代码.
塞西尔是单独做的还是我必须照顾所有这些分支?:/它不是很难修复它们但是如果Cecil没有那么我根本就不会启动这个项目,我没有时间(或知识)获得高级IL魔法:P
(是的我知道它不会是IL_0003只是例如)
Jb *_*ain 16
是的,Cecil将为您更新分支机构.
您必须要处理的唯一情况是分支是一个简短形式的分支.如果注入太多指令,它可能会溢出.
有一种非常简单的方法来处理这个问题.在注入代码之前,只需从Mono.Cecil.Rocks中调用扩展方法SimplifyMacros,如下所示:
method.Body.SimplifyMacros ();
Run Code Online (Sandbox Code Playgroud)
这将把br.s变成br.
当你完成注入代码时,只需调用:
method.Body.OptimizeMacros ();
Run Code Online (Sandbox Code Playgroud)
这是相反的操作,也就是说,如果可能的话,它会尝试将br转换成br.s.