我一直在调试一个非常棘手的问题。
基本上,我有一个以各种方式崩溃的混淆程序集。未混淆的程序集没有问题,但不能保证混淆器不会在这里受到责备。(这就是我可能要解决的问题)
无论如何,混淆程序集在 .Net 4.0 上也可以正常运行。如果我在 .Net 4.5 中禁用 JIT 优化,它运行良好。
我试过的:
我尝试针对 IL 进行调试。访问冲突似乎来自一个简单地将某些内容加载到堆栈上的 IL 操作。同样,完全托管的代码。
以防万一它与String.Empty相关,我通过 IL 并将所有 string::empty 调用替换为ldstr ""
.. 现在,而不是 AccessViolation,我得到了 FatalEngineException
在所有选项关闭的情况下通过反混淆器运行它可以使其正常工作。基本上,反混淆器所做的一切都没有打开,只是勉强重新排列 IL 并插入一些 NOP。
此外,可执行文件确实通过了 PEVerify,所以这不是问题。
错误的可执行文件:Test.exe
好的可执行文件:Test-cleaned.exe
有问题的堆栈跟踪:
Test.exe!PreEmptive.SoS.Client.Cache.CacheService.ServiceCache() 第 22032 行 + 0x137 字节未知 Test.exe!Test.TestConsole.Main(string[] args) 第 14 行 + 0x6 字节未知
您可以使用 ildasm 比较两个可执行文件。因为它是重新排序的,我发现它对我的口味来说有点太难了。我制作了一个小工具来转储方法的 IL 并将方法按排序顺序排列以便于比较。
错误的 IL 转储:testcount.il
好的 IL 转储:testcountcleaned.il
无论如何,如果有人对如何分析这一点有任何想法并弄清楚究竟是哪些 IL 导致了这种情况,我将不胜感激。