我一直在调试一个非常棘手的问题。我完全托管的程序集在.Net 4.5上出现AccessViolationException异常?
基本上,我有一个混淆的程序集,以各种方式崩溃。未混淆的程序集没有问题,尽管不能保证混淆器不会在这里受到责备。 (这就是我可能想要修复的问题)
无论如何,混淆程序集在.NET 4.0上运行良好。如果我禁用.Net 4.5中的JIT优化,它运行良好。
我已经试过:
我试图调试它针对IL。访问冲突似乎来自IL操作,它只是将某些东西加载到堆栈上。再次,完全托管的代码。
万一它涉及到String.Empty,我通过IL就去更换了所有的字符串::空通话与ldstr ""
。现在,而不是AccessViolation,我得到一个FatalEngineException
通过它运行关闭所有选项的反混淆器使其工作。基本上,所有的反混淆器没有打开任何东西,只是几乎不重新安排IL并插入一些NOP。
此外,可执行文件确实通过了PEVerify,所以这不是问题。
坏可执行文件:Test.exe
好可执行文件:Test-cleaned.exe
违规的堆栈跟踪:
Test.exe!PreEmptive.SoS.Client.Cache.CacheService.ServiceCache() Line 22032 + 0x137 bytes Unknown Test.exe!Test.TestConsole.Main(string[] args) Line 14 + 0x6 bytes Unknown
您可以使用ILDASM两个可执行文件进行比较。因为它是重新排序的,但我发现它对我的口味来说太难了。我创建了一个small tool来转储该方法的IL,并将这些方法按排序顺序排列以便于比较。
坏IL转储:testcount.il
好IL转储:testcountcleaned.il
无论如何,如果任何人有如何分析这一点,并找出到底是什么IL碎片导致此任何想法,我欣赏它。