我破坏了与 Dotfuscator 的兼容性...请帮助我了解如何
I broke compatibility with Dotfuscator...please help me understand how
我已经使用 Visual Studio 2010 创建 Windows 使用 C# 的程序超过 18 个月了。在那几个月中至少有 12 个月,我一直在使用 Dotfuscator 的社区版来混淆我的所有程序。到目前为止,它运行良好。
我的最新项目已发布初始测试版,使用 Visual Studio 2010 for .NET Framework 4.0 编译。混淆得很好。
从那时起,我将其导入 Visual Studio 2013,将其移至 .NET Framework 4.5.1,然后继续开发我的调试版本。当我准备向我的用户发布另一个测试版时,我意识到混淆版本在其发布状态下崩溃了。发布形式的未混淆版本不会崩溃。如果我将混淆后的 EXE 替换为调试版本,Visual Studio 会给我一个警告,但程序运行正常。没有崩溃。
即使我在 Program.cs 中有一个 UnhandledException 处理程序,程序还是崩溃了,Windows 只给我一个流水线参考。我无法用它来缩小原因范围。
我已经将程序移回 Visual Studio 2010,.NET Framework 4.0,.NET Framework 4.0 Client Profile,尝试了 Dotfuscator 中的所有设置变体。试用了 Dotfuscator 专业版(14 天试用期)。没有什么。混淆后,崩溃,没有可用信息。即使我排除一切,所以 0.0% 被重命名,仍然会崩溃。
我有一些加密信息需要像过去一年左右那样保持混淆。所以我需要混淆工作。而且我根本不知道发生了什么,或者我做了什么,让它停止工作。
我将非常感谢一些关于可能发生的事情的指导。提前谢谢你。
编辑:这是非常基本但不是很有用的错误消息。如果提供的话,我可以跟踪堆栈跟踪。我的代码也包含了大量的错误捕捉器,外加一个通用的 AppDomain.CurrentDomain.UnhandledException 处理程序。尽管如此,这就是我得到的:
http://www.keepitfishy.com/files/crash1.jpg
http://www.keepitfishy.com/files/crash2.jpg
这是我尝试使用 Visual Studio 进行调试时得到的汇编代码的一部分,我标记了应该是罪魁祸首的行:
7362CEF1 E8 15 05 00 00 call 7362D40B
7362CEF6 59 pop ecx
7362CEF7 68 09 04 00 C0 push 0C0000409h
7362CEFC E8 16 05 00 00 call 7362D417
7362CF01 59 pop ecx
7362CF02 5D pop ebp
7362CF03 C3 ret
7362CF04 55 push ebp
7362CF05 8B EC mov ebp,esp
7362CF07 81 EC 24 03 00 00 sub esp,324h
7362CF0D 6A 17 push 17h
7362CF0F E8 37 DE C3 FF call 7326AD4B
7362CF14 85 C0 test eax,eax
7362CF16 74 05 je 7362CF1D
7362CF18 6A 02 push 2
7362CF1A 59 pop ecx
[error line]7362CF1B CD 29 int 29h[error line]
7362CF1D A3 58 61 75 73 mov dword ptr ds:[73756158h],eax
7362CF22 89 0D 54 61 75 73 mov dword ptr ds:[73756154h],ecx
7362CF28 89 15 50 61 75 73 mov dword ptr ds:[73756150h],edx
7362CF2E 89 1D 4C 61 75 73 mov dword ptr ds:[7375614Ch],ebx
7362CF34 89 35 48 61 75 73 mov dword ptr ds:[73756148h],esi
7362CF3A 89 3D 44 61 75 73 mov dword ptr ds:[73756144h],edi
7362CF40 8C 15 70 61 75 73 mov word ptr ds:[73756170h],ss
7362CF46 8C 0D 64 61 75 73 mov word ptr ds:[73756164h],cs
7362CF4C 8C 1D 40 61 75 73 mov word ptr ds:[73756140h],ds
7362CF52 8C 05 3C 61 75 73 mov word ptr ds:[7375613Ch],es
7362CF58 8C 25 38 61 75 73 mov word ptr ds:[73756138h],fs
7362CF5E 8C 2D 34 61 75 73 mov word ptr ds:[73756134h],gs
7362CF64 9C pushfd
7362CF65 8F 05 68 61 75 73 pop dword ptr ds:[73756168h]
7362CF6B 8B 45 00 mov eax,dword ptr [ebp]
7362CF6E A3 5C 61 75 73 mov dword ptr ds:[7375615Ch],eax
7362CF73 8B 45 04 mov eax,dword ptr [ebp+4]
7362CF76 A3 60 61 75 73 mov dword ptr ds:[73756160h],eax
7362CF7B 8D 45 08 lea eax,[ebp+8]
7362CF7E A3 6C 61 75 73 mov dword ptr ds:[7375616Ch],eax
7362CF83 8B 85 DC FC FF FF mov eax,dword ptr [ebp-324h]
如果有人能帮我破译一下,我或许可以查出原因。谢谢。
根据您发布的错误对话框,您在本机代码中遇到堆栈问题:
来自MSDN:
0xC0000409 STATUS_STACK_BUFFER_OVERRUN
The system detected an
overrun of a stack-based buffer in this application. This overrun
could potentially allow a malicious user to gain control of this application.
追踪导致溢出的原因可能就像抛出异常时查看堆栈跟踪一样简单。即使 VS 没有向您显示代码,它仍然可以 identify the module and function on the top off the call stack.
如果问题是由于早已过去的堆栈损坏引起的,您可能需要不是从 .Net 而是从任何其他本机应用程序来处理该问题。
如果您不是应用程序中任何本机组件的作者,您的 P/Invoke 签名可能不正确,分配的缓冲区大小不正确或传递给 [=24= 的结构]d 函数,或者以其他方式错误地调用本机代码。检查您的 P/Invoke 并确保您有 MDAs enabled.
我已经使用 Visual Studio 2010 创建 Windows 使用 C# 的程序超过 18 个月了。在那几个月中至少有 12 个月,我一直在使用 Dotfuscator 的社区版来混淆我的所有程序。到目前为止,它运行良好。
我的最新项目已发布初始测试版,使用 Visual Studio 2010 for .NET Framework 4.0 编译。混淆得很好。
从那时起,我将其导入 Visual Studio 2013,将其移至 .NET Framework 4.5.1,然后继续开发我的调试版本。当我准备向我的用户发布另一个测试版时,我意识到混淆版本在其发布状态下崩溃了。发布形式的未混淆版本不会崩溃。如果我将混淆后的 EXE 替换为调试版本,Visual Studio 会给我一个警告,但程序运行正常。没有崩溃。
即使我在 Program.cs 中有一个 UnhandledException 处理程序,程序还是崩溃了,Windows 只给我一个流水线参考。我无法用它来缩小原因范围。
我已经将程序移回 Visual Studio 2010,.NET Framework 4.0,.NET Framework 4.0 Client Profile,尝试了 Dotfuscator 中的所有设置变体。试用了 Dotfuscator 专业版(14 天试用期)。没有什么。混淆后,崩溃,没有可用信息。即使我排除一切,所以 0.0% 被重命名,仍然会崩溃。
我有一些加密信息需要像过去一年左右那样保持混淆。所以我需要混淆工作。而且我根本不知道发生了什么,或者我做了什么,让它停止工作。
我将非常感谢一些关于可能发生的事情的指导。提前谢谢你。
编辑:这是非常基本但不是很有用的错误消息。如果提供的话,我可以跟踪堆栈跟踪。我的代码也包含了大量的错误捕捉器,外加一个通用的 AppDomain.CurrentDomain.UnhandledException 处理程序。尽管如此,这就是我得到的:
http://www.keepitfishy.com/files/crash1.jpg
http://www.keepitfishy.com/files/crash2.jpg
这是我尝试使用 Visual Studio 进行调试时得到的汇编代码的一部分,我标记了应该是罪魁祸首的行:
7362CEF1 E8 15 05 00 00 call 7362D40B
7362CEF6 59 pop ecx
7362CEF7 68 09 04 00 C0 push 0C0000409h
7362CEFC E8 16 05 00 00 call 7362D417
7362CF01 59 pop ecx
7362CF02 5D pop ebp
7362CF03 C3 ret
7362CF04 55 push ebp
7362CF05 8B EC mov ebp,esp
7362CF07 81 EC 24 03 00 00 sub esp,324h
7362CF0D 6A 17 push 17h
7362CF0F E8 37 DE C3 FF call 7326AD4B
7362CF14 85 C0 test eax,eax
7362CF16 74 05 je 7362CF1D
7362CF18 6A 02 push 2
7362CF1A 59 pop ecx
[error line]7362CF1B CD 29 int 29h[error line]
7362CF1D A3 58 61 75 73 mov dword ptr ds:[73756158h],eax
7362CF22 89 0D 54 61 75 73 mov dword ptr ds:[73756154h],ecx
7362CF28 89 15 50 61 75 73 mov dword ptr ds:[73756150h],edx
7362CF2E 89 1D 4C 61 75 73 mov dword ptr ds:[7375614Ch],ebx
7362CF34 89 35 48 61 75 73 mov dword ptr ds:[73756148h],esi
7362CF3A 89 3D 44 61 75 73 mov dword ptr ds:[73756144h],edi
7362CF40 8C 15 70 61 75 73 mov word ptr ds:[73756170h],ss
7362CF46 8C 0D 64 61 75 73 mov word ptr ds:[73756164h],cs
7362CF4C 8C 1D 40 61 75 73 mov word ptr ds:[73756140h],ds
7362CF52 8C 05 3C 61 75 73 mov word ptr ds:[7375613Ch],es
7362CF58 8C 25 38 61 75 73 mov word ptr ds:[73756138h],fs
7362CF5E 8C 2D 34 61 75 73 mov word ptr ds:[73756134h],gs
7362CF64 9C pushfd
7362CF65 8F 05 68 61 75 73 pop dword ptr ds:[73756168h]
7362CF6B 8B 45 00 mov eax,dword ptr [ebp]
7362CF6E A3 5C 61 75 73 mov dword ptr ds:[7375615Ch],eax
7362CF73 8B 45 04 mov eax,dword ptr [ebp+4]
7362CF76 A3 60 61 75 73 mov dword ptr ds:[73756160h],eax
7362CF7B 8D 45 08 lea eax,[ebp+8]
7362CF7E A3 6C 61 75 73 mov dword ptr ds:[7375616Ch],eax
7362CF83 8B 85 DC FC FF FF mov eax,dword ptr [ebp-324h]
如果有人能帮我破译一下,我或许可以查出原因。谢谢。
根据您发布的错误对话框,您在本机代码中遇到堆栈问题:
来自MSDN:
0xC0000409 STATUS_STACK_BUFFER_OVERRUN
The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.
追踪导致溢出的原因可能就像抛出异常时查看堆栈跟踪一样简单。即使 VS 没有向您显示代码,它仍然可以 identify the module and function on the top off the call stack.
如果问题是由于早已过去的堆栈损坏引起的,您可能需要不是从 .Net 而是从任何其他本机应用程序来处理该问题。
如果您不是应用程序中任何本机组件的作者,您的 P/Invoke 签名可能不正确,分配的缓冲区大小不正确或传递给 [=24= 的结构]d 函数,或者以其他方式错误地调用本机代码。检查您的 P/Invoke 并确保您有 MDAs enabled.