我一直在調試一個非常棘手的問題。我完全託管的程序集在.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碎片導致此任何想法,我欣賞它。