我一直在调试一个非常棘手的问题。
基本上,我有一个混淆的程序集以各种方式崩溃。未经模糊处理的程序集没有任何问题,但无法保证混淆程序不应归咎于此。 (这就是我可能想要解决的问题)
无论如何,混淆的程序集也可以在.Net 4.0上正常运行。如果我在.Net 4.5中禁用JIT优化,它运行正常。
我尝试了什么:
我尝试对IL进行调试。访问冲突似乎来自IL操作,该操作只是将某些内容加载到堆栈中。同样,完全托管代码。
为了防止它与String.Empty相关,我浏览了IL并用ldstr ""
替换了所有string :: empty调用。现在,我得到一个FatalEngine异常,而不是AccessViolation。
通过deobfuscator运行它,关闭所有选项使其工作。基本上,反混淆器所做的一切都没有打开,只是几乎不重新安排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的哪些部分正在造成这种情况,我会很感激。
答案 0 :(得分:0)
解决方案是我们确实有一点点P / Invoking。 .Net 4.5更积极地使用内存。出于某种原因,我们使用的工具在我们的一个结构上删除了Marshalling属性。修好那个bug后,一切都神奇地起作用了。所以,它根本不是.Net 4.5错误。它现在更积极地使用内存。