.net framework
115 TopicsAre Your Obfuscated .NET Builds Reproducible? Why It Matters for Production Diagnostics
I've seen a recurring issue across teams that use .NET obfuscation as part of their release pipeline. A protected build ships successfully, everything passes testing, and a few weeks later a customer reports a production crash. The stack trace contains obfuscated symbol names, so the team tries to locate the corresponding rename map. At that point, one of several things happens: The map file was never archived. The map file belongs to a different build. The build cannot be reproduced exactly because protection settings were not deterministic. As a result, diagnosing what should have been a routine production issue becomes far more difficult than expected. I'm curious how other teams are handling this, but first I'd like to share a few practices that have consistently helped. What does a reproducible protected build mean? For an obfuscated .NET application, I would consider a build reproducible when: The same source revision and protection settings produce the same protected output. The rename mapping file generated during protection is preserved alongside the release artifacts. Strong-name signing remains valid after the protection process. Without these safeguards, it becomes harder to: Decode production stack traces. Compare releases reliably. Verify that a rebuild actually matches the deployed artifact. Common Sources of Non-Determinism Randomized Renaming or Protection Seeds Many protection tools support randomization for renaming and transformation phases. If a new random seed is used for every build, identical source code can produce different outputs and different rename maps. One approach is to keep the protection project configuration under source control and use a fixed seed when reproducible builds are a requirement. Compiler Build Settings Deterministic compilation should also be considered. For SDK-style projects this typically means enabling: <PropertyGroup Condition="'$(Configuration)'=='Release'"> <Deterministic>true</Deterministic> </PropertyGroup> Without deterministic compilation, builds may still differ due to embedded metadata and other environmental factors. Signing Sequence Since obfuscation modifies IL and metadata, any strong-name signature applied before protection becomes invalid. The signing operation generally needs to occur after the final protected assembly is produced. Rename Map Retention In my experience, this is the most common operational issue. A rename map is often generated successfully but never stored as a release artifact. Once the build agent is cleaned up, the information required to translate production stack traces may be gone. Treat Protection Configuration as Part of the Build One practice that has worked well is treating protection settings the same way we treat source code and pipeline definitions. That typically means: Storing protection project files in source control. Reviewing configuration changes through pull requests. Running protection from CI/CD rather than manually. Pulling signing keys from a secure store. Publishing both protected binaries and rename maps as versioned artifacts. At a high level, the process looks something like: Source Commit / Tag ↓ Deterministic Release Build ↓ Protection Step ↓ Strong-Name Re-signing ↓ Archive Binary + Mapping File Verification Checklist Before releasing a protected build, I usually recommend confirming: The assembly's strong name is valid. Rebuilding the same commit produces identical protected output. Automated tests run against the protected assembly, not only the original one. The rename map is archived and associated with the build identifier. If two builds from the same source revision produce different hashes, the first places I would investigate are deterministic compilation settings and protection randomness. Typical Symptoms and Their Causes Symptom Possible Cause Strong-name validation errors Assembly was signed before protection Obfuscation tool cannot resolve dependencies Search paths do not include required assemblies Production stack traces cannot be decoded Rename map is missing or mismatched Identical commits generate different outputs Non-deterministic build or protection configuration Discussion For teams using obfuscation in production, how are you handling reproducibility and artifact retention? Do you archive rename maps alongside release artifacts, use symbol servers, maintain internal tooling, or follow another approach? I'd be especially interested in hearing how others have integrated obfuscation into modern Azure DevOps or GitHub Actions pipelines while keeping builds reproducible and supportable over time.7Views0likes0CommentsCVE-2024-43484
Has anyone been able to find a fix for CVE-2024-43484? I have a vulnerable file version here: C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\System.io.compression.dll has version 4.8.9221.0. KB5066131 's file information csv shows that this file gets updated to version 4.8.9277.0 but the machines won't accept the KB to install it. I did also try looking for the latest KB that superseded it which is as of this post Septembers KB5126052 however, when I look at the file information csv for KB5126052 it shows this file back to the old version at 4.8.9221.0. What gives? Did Microsoft update this file and then revert it in later KB or is it just a mistake? Is there any fix?77Views0likes0CommentsCVE-2024-43484
Has anyone been able to remediate CVE-2024-43484? I do actually see the vulnerable file version on machines in this location: C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\System.io.compression.dll has version 4.8.9221.0. Okay, so I download KB5066131 which says in it's file information csv that it updates this .dll to file version 4.8.9277.0. I try to install it and get a message that the KB is not applicable to my system. I run the commands to extrand the .cab file then install it with DISM and reboot the machine...but the file version doesn't update. So I look at the latest KB that superceeded KB5066131which is as of today september's KB5126052 but when you look at the listed file information csv it says it reverts this file back to version 4.8.9221.0. I'm so confussed now. Was this a Microsoft mistake or is there an actual fix to this?91Views0likes0CommentsWhat I Learned Contributing to .NET Runtime #135120 — Why More Developers Should Try Open Source
Contributing to the .NET Runtime was something I had wanted to try for a long time. Recently, I opened PR #135120 in the dotnet/runtime repository. https://github.com/dotnet/runtime/pull/135120 What surprised me most was not just the code change, but the engineering process behind making even a focused change in a large, production-grade open-source project. WHAT I LEARNED 1. Reading source code is a skill Before changing anything, I had to understand how the existing implementation worked and how the surrounding code was designed. 2. Tests tell a story Existing tests helped me understand the expected behavior and gave me confidence that the change was not breaking existing scenarios. 3. Small changes can require deep investigation A change that looks small from the outside can involve understanding implementation details, existing conventions, edge cases, and compatibility considerations. 4. Code review is part of the learning process A pull request is not simply code submitted for approval. It is an opportunity to learn from developers who know the codebase extremely well. 5. You do not have to be an expert before contributing This has probably been my biggest takeaway. I used to think I needed to understand the entire .NET Runtime before contributing to it. I don't. You can start with one problem, investigate it deeply, and learn along the way. MY QUESTION FOR THE .NET COMMUNITY For developers who have contributed to .NET, ASP.NET Core, EF Core, or other major open-source projects: What was your first contribution, and what did it teach you that you would not have learned from building your own applications? I would love to hear your experiences and advice for developers who are considering their first open-source contribution.99Views0likes0CommentsDot net 3.5 not available in windows feature box.
Dot net 3.5 not available in windows feature box. only 4.8 available. I installed 3.5 from standalone version as per microsoft guide . but still 3.5 not showing any version installed on my device windows 11 26H1 . i am unable to do my study for this problem . plz help me to comeout from this problem80Views0likes0CommentsDot net 3.5 not available in windows feature box.
Dot net 3.5 not available in windows feature box. only 4.8 available. I installed 3.5 from standalone version as per microsoft guide . But still 3.5 not showing any version installed on my device windows 11 26H1 . I am unable to do my study for this problem . Plz help me to comeout from this proble89Views0likes0CommentsMSB4184: The expression "[System.IO.Path]::GetDirectoryName('')" cannot be evaluate
Hi got this error now after I updated my VS IDE .... The path is not of a legal form. WinFormsSQLExamplePro C:\Program Files\dotnet\sdk\10.0.102\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Windows.targets <_WinRTRuntimeDllDirectory>$([System.IO.Path]::GetDirectoryName('%(_WinRTRuntimeDllReferencePath.FullPath)'))</_WinRTRuntimeDllDirectory> <_CsWinRTOrTargetingPackLibDirectory>$([System.IO.Path]::GetDirectoryName('$(_WinRTRuntimeDllDirectory)'))</_CsWinRTOrTargetingPackLibDirectory> Note the top most path entry contains a '%' character , whereas the 2nd path contains a '$' character... Not sure what is going on ... (happened after VS update)615Views0likes1CommentNeed help with ClickOnce deployment on .NET Framework 4.7.2 – "Unidentified program" warning
Hello, I have a WinForms application built on .NET Framework 4.7.2 that I'm publishing using ClickOnce from Visual Studio Community 2022 (official Microsoft version). Even after signing the application with a valid SHA256 V3 self-signed certificate, when I publish and try to install it via ClickOnce, I receive a warning saying the program is unidentified. Additionally, when I try to install the application on a machine that has antivirus software, the antivirus flags the program precisely because of the missing/certificate validation issue. How should I proceed? I'd like to know the correct way to publish with ClickOnce so that the application is fully recognized as valid by Windows, since I'm running into these antivirus validation problems. Thanks in advance for any guidance!440Views0likes1Comment