0

我一直在调试一个非常棘手的问题。

基本上,我有一个以各种方式崩溃的混淆程序集。未混淆的程序集没有问题,但不能保证混淆器不会在这里受到责备。(这就是我可能要解决的问题)

无论如何,混淆程序集在 .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 导致了这种情况,我将不胜感激。

4

1 回答 1

0

解决方案是我们确实有一点点 P/Invoking。.Net 4.5 更积极地使用内存。出于某种原因,我们使用的一个工具在我们的一个结构上剥离了 Marshalling 属性。修复该错误后,一切都神奇地起作用。所以,这根本不是 .Net 4.5 的错误。它现在只是更积极地使用内存。

于 2012-09-12T13:27:32.070 回答