<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8676183357407548589</id><updated>2012-02-01T19:11:04.507+02:00</updated><category term='features'/><category term='tricks'/><category term='product development'/><category term='history'/><title type='text'>Eazfuscator.NET Blog</title><subtitle type='html'>This blog is dedicated to &lt;a href="http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx"&gt;Eazfuscator.NET&lt;/a&gt; obfuscator for &lt;a href="http://msdn.microsoft.com/en-us/netframework/default.aspx"&gt;.NET&lt;/a&gt; platform.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-6933599993832697388</id><published>2011-06-06T00:37:00.008+03:00</published><updated>2011-06-07T06:59:24.345+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><title type='text'>Reading Environment Variables from Another Running Process</title><content type='html'>Recently I was working on some changes aimed to achieve better usability experiences for Eazfuscator.NET.&lt;br /&gt;&lt;br /&gt;One of the common pitfalls is the requirement to restart Microsoft Visual Studio after the first Eazfuscator.NET installation. This requirement is commonly addressed by a message box during installation asking user to restart the running instances of Visual Studio. While it is a technically simple solution, it adds one additional screen (a message box) to the user interface and user should react to that message box by pressing OK button. This can worsen the user experience as this stands out of the expected installation workflow.&lt;br /&gt;&lt;br /&gt;So I decided to implement another solution. Whenever user tries to protect a project the following screen appears:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uDci2V_wlzg/TevfUPLU-uI/AAAAAAAAAC4/qGRgQB2KakU/s1600/sshot-17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-uDci2V_wlzg/TevfUPLU-uI/AAAAAAAAAC4/qGRgQB2KakU/s1600/sshot-17.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see, there is a large amount of space where the desired message can reside. And it computes pretty well to the user workflow, unobtrusively suggesting to restart Visual Studio to complete the installation of Eazfucator.NET. &amp;nbsp;Of course, there is nothing to&amp;nbsp;complete; the restart of Visual Studio is required just to apply an updated set of &lt;a href="http://en.wikipedia.org/wiki/Environment_variable"&gt;environment variables&lt;/a&gt; Eazfuscator.NET integration relies on.&lt;p&gt;The next thing to decide is when to show that message.&lt;br /&gt;&lt;b&gt;And here comes the most interesting part, actually directly reflecting the topic.&lt;/b&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;The only reliable way to detect the necessity of Visual Studio restart is to analyze its current environment variables. Visual Studio generally runs as &lt;i&gt;devenv.exe&lt;/i&gt; process, so we have to retrieve its environment variable values.&lt;br /&gt;&lt;br /&gt;The first implementation, I naively thought it had to work out:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: white; color: black; font-family: Consolas; font-size: 13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[]&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;processes&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Process&lt;/span&gt;.GetProcessesByName(&lt;span style="color: #a31515;"&gt;"devenv"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;process&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;processes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;env&amp;nbsp;=&amp;nbsp;process.StartInfo.EnvironmentVariables;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;path&amp;nbsp;=&amp;nbsp;env[&lt;span style="color: #a31515;"&gt;"PATH"&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(path);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;br /&gt;While it runs without errors, the retrieved value of &lt;i&gt;PATH&lt;/i&gt; environment variable is wrong. It corresponds to the current running process, not that remote &lt;i&gt;devenv.exe&lt;/i&gt; process it supposed to be. How does this happen? Well, this is a flaw in&amp;nbsp;&lt;i&gt;System.Diagnostics.Process&lt;/i&gt; class from .NET Framework. While it seems like it has to work out, actually it does not, giving you the wrong values without raising exceptions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;After investigation, it became evident that Windows has no API to&amp;nbsp;retrieve&amp;nbsp;the&amp;nbsp;environment&amp;nbsp;variables of another running process in the system.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;But there is a good workaround which allows to retrieve the desired values with the help of &lt;i&gt;ntdll.dll&lt;/i&gt; API and &lt;a href="http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx"&gt;ReadProcessMemory&lt;/a&gt; function.&lt;br /&gt;&lt;br /&gt;The technical details and sample C++ code can be found &lt;a href="http://www.codeproject.com/KB/threads/ReadProcEnv.aspx"&gt;here&lt;/a&gt;.&amp;nbsp;Unfortunately, I did not find a decent implementation for .NET which would handle both 32 bit and 64 bit scenarios. That's why I created the component for reading the environment variables of a running process from scratch.&lt;br /&gt;&lt;br /&gt;So, let me introduce the interface part of the component. It is very simple and everything is implemented inside one class:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: black; font-family: Consolas; font-size: 13px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Specialized;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Diagnostics;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ProcessEnvironment&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;StringDictionary&lt;/span&gt;&amp;nbsp;GetEnvironmentVariables(&lt;span style="color: blue;"&gt;this&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Process&lt;/span&gt;&amp;nbsp;process)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;The&amp;nbsp;implementation&amp;nbsp;goes&amp;nbsp;here.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;StringDictionary&lt;/span&gt;&amp;nbsp;TryGetEnvironmentVariables(&lt;span style="color: blue;"&gt;this&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Process&lt;/span&gt;&amp;nbsp;process)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;The&amp;nbsp;implementation&amp;nbsp;goes&amp;nbsp;here.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, &lt;i&gt;ProcessEnvironment&lt;/i&gt; is a static class with two extension methods.&lt;br /&gt;&lt;br /&gt;And this is how it can be used:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: black; font-family: Consolas; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;class&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #2b91af;"&gt;Program&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;static&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;void&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;Main(&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;string&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;[]&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;var&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;processes&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #2b91af;"&gt;Process&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;.GetProcessesByName(&lt;/span&gt;&lt;span style="background-color: white; color: #a31515;"&gt;"devenv"&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;foreach&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;var&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;process&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;in&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;processes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;var&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;env&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;b&gt;process.GetEnvironmentVariables()&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;string&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;path&amp;nbsp;=&amp;nbsp;env[&lt;/span&gt;&lt;span style="background-color: white; color: #a31515;"&gt;"PATH"&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #2b91af;"&gt;Console&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;.WriteLine(path);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Neatly done, isn't it?&lt;br /&gt;&lt;br /&gt;The full sources of the component and sample usage can be found in the sample project.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Downloads/Samples/ReadEnvSample.zip"&gt;Download sample project&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-6933599993832697388?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/6933599993832697388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2011/06/reading-environment-variables-from.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/6933599993832697388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/6933599993832697388'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2011/06/reading-environment-variables-from.html' title='Reading Environment Variables from Another Running Process'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uDci2V_wlzg/TevfUPLU-uI/AAAAAAAAAC4/qGRgQB2KakU/s72-c/sshot-17.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-7067488024633520142</id><published>2011-04-17T04:53:00.003+03:00</published><updated>2011-09-10T00:51:39.082+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='features'/><title type='text'>Resource Encryption and Speed Improvements</title><content type='html'>&lt;i&gt;&lt;span class="Apple-style-span" style="color: #01c314;"&gt;Eaz&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #b0099f;"&gt;fuscator&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;.NET&lt;/span&gt; 3.1&lt;/i&gt; has been released just a few minutes ago, so I’m here to spread some words about it!&lt;br /&gt;&lt;br /&gt;This release includes highly demanded features and improvements.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resource encryption&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;This highly demanded feature allows to encrypt and optionally compress the embedded resources of an assembly.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Out of the box support for Managed Extensibility Framework (MEF)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;Reflection analysis engine in Eazfuscator.NET was improved to automatically handle the semantics implied by &lt;a href="http://msdn.microsoft.com/en-us/library/dd460648.aspx" target="_blank"&gt;MEF&lt;/a&gt;. This feature is a decent addition to the product, given that MEF is becoming more and more widespread nowadays thanks to its excellent design and robustness.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Code control flow obfuscation produces fully verifiable code&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;The code produced by control flow obfuscation was unverifiable in previous versions of Eazfuscator.NET. Unverifiable code is out of .NET standard and control flow obfuscation was treated almost as a hack before. New Eazfuscator.NET guarantees that produced code is always &lt;em&gt;verifiable&lt;/em&gt; and thus can be validated by &lt;em&gt;PEVerify&lt;/em&gt; tool for a full conformance to .NET standard. This also means that code control flow obfuscation is safe and compatible with Mono and other alternative .NET runtimes now.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Better reflection analysis engine&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;Eazfuscator.NET now understands even more about LINQ, Web services, component designer and serialization. This allows to achieve better, non-intrusive obfuscation results.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Improved multi-core performance&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;New Eazfuscator.NET is a lot faster on multiprocessor systems than the previous versions, so it is definitely worth a try if you have large projects and long builds.&lt;br /&gt;&lt;br /&gt;Some other &lt;a href="http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Changelog.aspx"&gt;improvements and fixes&lt;/a&gt; are included in the release as well.&lt;br /&gt;You can &lt;a href="http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx#downloads"&gt;download&lt;/a&gt; the new version right now or whenever you find it suitable.&lt;br /&gt;&lt;br /&gt;Thank you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-7067488024633520142?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/7067488024633520142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2011/04/resource-encryption-and-speed.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/7067488024633520142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/7067488024633520142'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2011/04/resource-encryption-and-speed.html' title='Resource Encryption and Speed Improvements'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-8827364736226536969</id><published>2011-01-16T00:21:00.001+02:00</published><updated>2011-09-10T00:52:21.212+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='features'/><title type='text'>Eazfuscator.NET 3.0 Released</title><content type='html'>I just want to say that Eazfuscator.NET 3.0 has been released just a couple of minutes ago.&lt;br /&gt;&lt;br /&gt;This release includes a great set of the new features:&lt;br /&gt;&lt;ul&gt;&lt;li style="margin-bottom: 0.5em;"&gt;&lt;b&gt;Assemblies embedding with encryption and compression.&lt;/b&gt; Assembly's dependencies can be embedded into the assembly itself, this is a great way for creating single-file deployed applications&lt;/li&gt;&lt;li style="margin-bottom: 0.5em;"&gt;&lt;b&gt;Debugging.&lt;/b&gt; Eazfuscator.NET now handles .pdb files, so you can debug your code after obfuscation&lt;/li&gt;&lt;li style="margin-bottom: 0.5em;"&gt;&lt;b&gt;String compression.&lt;/b&gt; Large strings are compressed during obfuscation. Compressed strings are decompressed on demand during the run time. The decompression algorithm is incredibly fast, so there is no performance  penalty observed — the actual decompression speed comes very close to the speed  of a simple memory copy. String compression and the corresponding decisions are the parts of an automatic process, so you don't have to put any efforts here; Eazfuscator.NET does this all for you.&lt;/li&gt;&lt;/ul&gt;The release contains a set of other improvements as well.&lt;br /&gt;&lt;br /&gt;There is a lot of ongoing work for better WPF, Silverlight and Windows Phone support, plus some other new great features are being developed and evaluated and will find their ways in new Eazfuscator.NET releases.&lt;br /&gt;&lt;br /&gt;I would like to thank all those who made a feedback on Eazfuscator.NET and helped to make it better. Thank you!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx#downloads"&gt;Get your copy right now!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-8827364736226536969?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/8827364736226536969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2011/01/eazfuscatornet-30-released.html#comment-form' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/8827364736226536969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/8827364736226536969'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2011/01/eazfuscatornet-30-released.html' title='Eazfuscator.NET 3.0 Released'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-2975509538304532103</id><published>2010-10-30T01:35:00.015+03:00</published><updated>2010-10-30T06:33:18.793+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='features'/><title type='text'>XML Documentation Filter</title><content type='html'>&lt;p&gt;XML Documentation Filter is a feature that arrived in Eazfuscator 2.8.&lt;/p&gt;Ok, let me start the show.&lt;br /&gt;&lt;pre style="font-family: consolas"&gt;&lt;pre style="font-family: consolas"&gt;&lt;pre style="font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;DS1307&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Gets a value indicating whether clock is in halt state.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;value&amp;gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;true&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt; if clock is in halt state; otherwise, &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;false&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;bool&lt;/span&gt; IsClockHalted&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;byte&lt;/span&gt; data = I2CBus.Transfer(Address, 0x00);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; (data &amp;amp; 0x80) != 0;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;I know that every .NET developer saw such comments for a code entity at least once in his life :) That kind of comments allows to provide a quick documentation for a class, property or method.&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Code documentation is used by Visual Studio to show &lt;a title="Wiki article about IntelliSense technology" href="http://en.wikipedia.org/wiki/IntelliSense"&gt;IntelliSense&lt;/a&gt; hints:&lt;br /&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_IvWbak_Zj90/TMtwDbflJiI/AAAAAAAAACY/4fiGqd3CDxo/image%5B20%5D.png?imgmax=800" width="513" height="160" /&gt;&lt;/p&gt;So, as you can see, code documentation is a nice and useful feature.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;If you write a class library then it’s always a good idea to provide code documentation. Visual Studio gives such ability by enabling XML Documentation generation for your project:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_IvWbak_Zj90/TMtwDy57fgI/AAAAAAAAACc/9mTcShSKP7k/image%5B25%5D.png?imgmax=800" width="630" height="214" /&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Whenever you build your project with XML documentation enabled you will get two main files in the output folder – assembly file and corresponding XML documentation file:&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_IvWbak_Zj90/TMtwEX87efI/AAAAAAAAACg/hqk8N9k8E9E/s1600-h/image%5B49%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_IvWbak_Zj90/TMtwElD2AqI/AAAAAAAAACk/NDK8O1Ozz0k/image_thumb%5B28%5D.png?imgmax=800" width="125" height="79" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;As you can see, there is &lt;em&gt;MyLib.XML&lt;/em&gt; file in the output folder. Let’s take a look on its content:&lt;/p&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;doc&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;MyLib&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;members&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;P:&lt;font style="background-color: #ffff00"&gt;MyLib.DS1307.IsClockHalted&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Gets a value indicating whether clock is in halt state.&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; if clock is in halt state; otherwise, &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;members&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;doc&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: Verdana;"&gt;&lt;em&gt;MyLib.XML&lt;/em&gt; file contains documentation for the public property &lt;em&gt;IsClockHalted&lt;/em&gt; of the class &lt;em&gt;DS1307&lt;/em&gt; from &lt;em&gt;MyLib&lt;/em&gt; assembly. That’s exactly what you might expect. File contains minimal and sufficient amount of information.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h4&gt;A Security Problem&lt;/h4&gt;Let’s add some private members to our class (marked with yellow):&lt;p&gt;&lt;/p&gt;&lt;pre style="font-family: consolas"&gt;&lt;pre style="font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;DS1307&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Gets a value indicating whether clock is in halt state.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;value&amp;gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;true&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt; if clock is in halt state; otherwise, &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;false&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;bool&lt;/span&gt; IsClockHalted&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;byte&lt;/span&gt; data = I2CBus.Transfer(Address, 0x00);&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; (data &amp;amp; 0x80) != 0;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; An I2C bus instance.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;II2CBus&lt;/span&gt;&amp;#160;&lt;font style="background-color: #ffff00"&gt;I2CBus&lt;/font&gt;;&lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Device address at I2C bus.&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;byte&lt;/span&gt;&amp;#160;&lt;font style="background-color: #ffff00"&gt;Address&lt;/font&gt;;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;&lt;br /&gt;Rebuild the project and here is the corresponding content of MyLib.XML file:&lt;br /&gt;&lt;pre style="font-family: consolas"&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;doc&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;MyLib&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;members&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;F:&lt;font style="background-color: #ffff00"&gt;MyLib.DS1307.I2CBus&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; An I2C bus instance.&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;F:&lt;font style="background-color: #ffff00"&gt;MyLib.DS1307.Address&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Device address at I2C bus.&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;P:MyLib.DS1307.IsClockHalted&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Gets a value indicating whether clock is in halt state.&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; if clock is in halt state; otherwise, &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;members&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;doc&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;As you can see, the documentation for private class members was generated and stored in &lt;i&gt;MyLib.XML&lt;/i&gt; (marked with yellow).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let’s stop at this point and analyze the consequences of this in terms of obfuscation. Obfuscation is the process of hiding information about inner structure of the system from the prying eyes of reverse-engineer.&lt;br /&gt;&lt;p&gt;And now we have information about &lt;em&gt;private&lt;/em&gt; assembly items right in &lt;em&gt;MyLib.XML&lt;/em&gt; file... This is shocking from security point of view.&lt;/p&gt;&lt;p&gt;It is worth to mention that XML documentation files are often distributed together with product assemblies, so you can estimate an amount of possible intellectual property leakage that can be brought by XML documentation files.&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;Solution&lt;/span&gt;&lt;/p&gt;&lt;p&gt;XML Documentation Filter built in Eazfuscator.NET comes to the rescue.&lt;/p&gt;Let’s protect MyLib project with Eazfuscator.NET by drag’n’dropping the project from Solution Explorer of Visual Studio onto the green zone of Eazfuscator.NET Assistant:&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_IvWbak_Zj90/TMtwFdRNWwI/AAAAAAAAACo/Zs4BAwWfQGY/s1600-h/image%5B54%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_IvWbak_Zj90/TMtwGP2REKI/AAAAAAAAACs/iLPBo0ttyZI/image_thumb%5B31%5D.png?imgmax=800" width="385" height="342" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Then rebuild the project in Release configuration with Visual Studio and take a look on &lt;em&gt;MyLib.XML&lt;/em&gt; file content:&lt;/p&gt;&lt;pre style="font-family: consolas"&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;doc&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;MyLib&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;members&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;P:MyLib.DS1307.IsClockHalted&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        Gets a value indicating whether clock is in halt state.&lt;br /&gt;&lt;span style="color: blue"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;summary&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; if clock is in halt state; otherwise, &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;c&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;member&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;members&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;doc&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;Voila. What we see is that all &lt;em&gt;private&lt;/em&gt; documentation is gone. The only documented item is a public property in terms of inter-assembly visibility. Exactly what’s expected without security compromises.&lt;br /&gt;&lt;p&gt;That was just a simple sample, but I assure you that XML Documentation Filter gives a considerable effect on bigger assemblies. XML documentation for non-public assembly items is automatically pruned so that essential knowledge about component internals does not leak to the rest of the world.&lt;/p&gt;&lt;h4&gt;How It Works&lt;/h4&gt;As many things in Eazfuscator.NET, XML Documentation Filter works behind the scene to ease your life. No special options should be given to Eazfuscator.NET. All required actions are automatically performed on obfuscation stage:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;XML documentation file location is extracted from the project file (.csproj, .vbproj)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If step 1 fails then Eazfuscator.NET tries to find a corresponding XML documentation file by heuristic search&lt;/li&gt;&lt;br /&gt;&lt;li&gt;XML documentation file is processed according to obfuscation information to prune non-public items&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;XML Documentation Filter is a step toward better obfuscation results. This feature is essential for component developers and publishers, by whom XML documentation files are published on every release.&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-2975509538304532103?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/2975509538304532103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2010/10/xml-documentation-filter.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/2975509538304532103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/2975509538304532103'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2010/10/xml-documentation-filter.html' title='XML Documentation Filter'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_IvWbak_Zj90/TMtwDbflJiI/AAAAAAAAACY/4fiGqd3CDxo/s72-c/image%5B20%5D.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-3699093462813821143</id><published>2010-04-13T03:26:00.009+03:00</published><updated>2011-04-17T05:17:34.040+03:00</updated><title type='text'>Eazfuscator 2.8 Arrived</title><content type='html'>Phew! After Visual Studio 2010 arrival I spent several hours on integrating things, polishing documentation and making triple-testing of the new release. And it seems it is April 13 on my local time now.&lt;br /&gt;&lt;br /&gt;This release brings some new cool features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XML documentation filter (← this guy is the most prominent one!) &lt;/li&gt;&lt;li&gt;Signing key auto-discovery&lt;/li&gt;&lt;li&gt;Support for .NET 4.0 and Microsoft Visual Studio 2010&lt;/li&gt;&lt;li&gt;Fail-safe MSBuild project integration&lt;/li&gt;&lt;li&gt;Guaranteed CLS-compliance of the resulting assemblies&lt;/li&gt;&lt;/ul&gt;Unfortunately I had to postpone several features and bug fixes that could enter in 2.8. I did that for the sake of stability — version 2.8 has the biggest changeset ever that were packed in one version during the whole history of Eazfuscator.NET.&lt;br /&gt;&lt;br /&gt;I will describe all the new features one by one in my next articles. I hope you'll enjoy 2.8!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-3699093462813821143?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/3699093462813821143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2010/04/eazfuscator-2.html#comment-form' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/3699093462813821143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/3699093462813821143'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2010/04/eazfuscator-2.html' title='Eazfuscator 2.8 Arrived'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-1697208523266137617</id><published>2010-03-30T21:06:00.011+03:00</published><updated>2010-03-30T22:20:33.436+03:00</updated><title type='text'>Eazfuscator.NET 2.8 Release Announcement</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_IvWbak_Zj90/S7JFMP1e54I/AAAAAAAAAB8/2ViLuIw2aF0/s1600/icon_64.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 64px; height: 64px;" src="http://3.bp.blogspot.com/_IvWbak_Zj90/S7JFMP1e54I/AAAAAAAAAB8/2ViLuIw2aF0/s400/icon_64.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5454498175410694018" /&gt;&lt;/a&gt;New version of Eazfuscator.NET will be available on April 12, 2010. It is synced to .NET 4.0 and Microsoft Visual Studio 2010 release on the same day.&lt;br /&gt;&lt;br /&gt;Version 2.8 brings some new cool features and quality improvements.&lt;br /&gt;&lt;br /&gt;New features and ideas will be described in details right after release on April 12. Stay tuned!&lt;br /&gt;&lt;br /&gt;P.S. Please note that it's not always possible to process all feedback reports in a real-time fashion, however they are really helpful! Thank you for your feedback and support!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-1697208523266137617?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/1697208523266137617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2010/03/eazfuscatornet-28-release-announcement.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/1697208523266137617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/1697208523266137617'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2010/03/eazfuscatornet-28-release-announcement.html' title='Eazfuscator.NET 2.8 Release Announcement'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_IvWbak_Zj90/S7JFMP1e54I/AAAAAAAAAB8/2ViLuIw2aF0/s72-c/icon_64.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-6303256594622987687</id><published>2009-09-01T06:59:00.021+03:00</published><updated>2010-03-30T21:48:53.773+03:00</updated><title type='text'>Three Tools Every Project Should Use</title><content type='html'>If you want to get things go smoothly during your software development process then this post can be useful for you.&lt;br /&gt;&lt;br /&gt;As you know, writing the code is not the main force for a development of delicious software. It sounds quite paradoxical, but the main things are planning and support.&lt;br /&gt;&lt;br /&gt;Let me show an example about the planning. A few smart and accurately implemented features can easily overweight the tons of clunky code. The code is &lt;span style="font-style:italic;"&gt;nothing&lt;/span&gt; by itself. It can be useful only when it flawlessly implements some useful &lt;span style="font-style:italic;"&gt;features&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Support allows to achieve bug-free operation of your software. Support makes your customers happy. Support gives you hints for the further project development.&lt;br /&gt;&lt;br /&gt;Those approaches require frequent, small, incremental code changes. And your project must be ready for this. You have to go out and prepare three basic aspects:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Automated tests.&lt;/b&gt; They allow to be sure about the quality of produced software. Make sure they are easy to launch and then &lt;span style="font-style:italic;"&gt;just press the button&lt;/span&gt; from time to time; after every bug fix and before each release to the public, as for example&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Creation of the final installation package with one or a few button clicks.&lt;/b&gt; It makes code changes really cheap and effortless for you. Just fix, build and deliver. Don't think about how the installation must be built every time you need to build it. Let complex things become simple. &lt;span style="font-style:italic;"&gt;Just press the button&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Publishing and delivery with one or a few button clicks.&lt;/span&gt; Ok, installation package is ready, but how are you going to publish? FTP-copy to webserver, fix some HTML, write about some changes, ..., etc.&lt;br/&gt;&lt;span style="font-style:italic;"&gt;Do not do it like that.&lt;/span&gt;&lt;br/&gt; Create a single-click solution. &lt;span style="font-style:italic;"&gt;Just press the button&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;So, if you curious about how it's done in Eazfuscator.NET project, let me show.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Testing suite&lt;/span&gt; is built with Visual Studio test project. The test project contains a bunch of tests. Every test just references the corresponding .exe file. Every .exe file for every test is created by a separate project, depending on requirements for the test. It may be C# project for .NET, VB.NET project for Compact Framework and so on. Every .exe is launched in a separate AppDomain at the beginning of a test. During .exe execution its stdout output is grabbed and recorded to the memory. After that, the .exe file is processed with Eazfuscator.NET obfuscator. Then it launched again in a new AppDomain and its output is then grabbed and compared to the original output of non-obfuscated .exe. If the outputs differ, then &lt;span style="font-style:italic;"&gt;“Ooops, something went wrong”&lt;/span&gt; and test fails.&lt;br /&gt;&lt;br /&gt;The test suite works really great being dumb and simple. Screenshot of the window with the tests being executed after some small bug fix today:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_IvWbak_Zj90/Spytu1o6Q2I/AAAAAAAAABM/eK1fWQpulSQ/s1600-h/Running+Tests.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 111px;" src="http://4.bp.blogspot.com/_IvWbak_Zj90/Spytu1o6Q2I/AAAAAAAAABM/eK1fWQpulSQ/s400/Running+Tests.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5376363075357786978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And then, &lt;span style="font-style:italic;"&gt;bingo!,&lt;/span&gt; code changes are ok, everything works as expected:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_IvWbak_Zj90/SpyuLotYAoI/AAAAAAAAABU/jEfeu60WpHk/s1600-h/Running+Tests+Done.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 385px; height: 35px;" src="http://1.bp.blogspot.com/_IvWbak_Zj90/SpyuLotYAoI/AAAAAAAAABU/jEfeu60WpHk/s400/Running+Tests+Done.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5376363570103059074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installation builds and publishing&lt;/span&gt; are controlled by a tool called “Eazfuscator.NET Production Board”. Actually I've created it in a form of a kit and it can be attached and customized to any project within a minute. Screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_IvWbak_Zj90/Spy0heGfYiI/AAAAAAAAABc/fwt5RXBNjcw/s1600-h/sshot-5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 290px;" src="http://3.bp.blogspot.com/_IvWbak_Zj90/Spy0heGfYiI/AAAAAAAAABc/fwt5RXBNjcw/s400/sshot-5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5376370542282498594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Buttons for the most frequent operations are color-marked for a greater associativity and scan-ability by the eye; it speedups the game. The tool allows to orchestrate the whole manufacturing process of your product within several button clicks. Simple and dumb at the face, but super smart behind the scene. The real time saver.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;P.S. Section below was added to show the functionality of Production Board in details.&lt;/span&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;Production Board does several important things. First of all, it allows you to modify the version information for a product. It can be done by pressing &lt;span style="font-weight:bold;"&gt;“Change version” button&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_IvWbak_Zj90/Sp29nciSoGI/AAAAAAAAABs/3nEwWJbnQ3k/s1600-h/sshot-7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 231px;" src="http://3.bp.blogspot.com/_IvWbak_Zj90/Sp29nciSoGI/AAAAAAAAABs/3nEwWJbnQ3k/s400/sshot-7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5376662015522807906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, you are informed about the current version and you can define the new one. By default, the dialog just increments the build number of a version and generates the new revision number based on the current time, so it gives the new version for a product. It can be overridden by the user if necessary. Also it's possible to select several predefined version descriptions from a drop-down list, such as &lt;span style="font-style:italic;"&gt;Release&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Beta.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When the user presses &lt;span style="font-style:italic;"&gt;OK&lt;/span&gt; button, the new version is delivered to the project files. &lt;span style="font-style:italic;"&gt;Behind-the-scenes magic begins right here.&lt;/span&gt; There are several places in the project to put the new version in. Obviously, AssemblyInfo.* files are patched to correspond to the new version. Installation project file (.vdproj) is also patched to define the new version for an installation package. The new GUID for installation UpgradeCode is automatically generated too. Changelog XML file is patched to include the latest version number and a fresh time stamp. And the last patched place is an update manifest file which allows customers to potentially receive an update for that new version through the Internet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;“Rebuild solution” button&lt;/span&gt; just rebuilds the code base and installation package by invoking corresponding tools. For Eazfuscator.NET, the windowless Visual Studio instance is created with COM automation interface. That instance builds the code and installation package.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;“Publish” button&lt;/span&gt; gathers and delivers product output files to the predefined folder on the file system. During this step the file name for an installation package is renamed to eye-candy name which includes the current product name and version: &lt;span style="font-style:italic;"&gt;setup.msi&lt;/span&gt; becomes &lt;span style="font-style:italic;"&gt;Eazfuscator.NET 2.6.20 Beta Setup.msi.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After the publish step, the product can be played and tested at the local machine. That's why there are “Install”, “Uninstall” and “Open publish folder” buttons. If the product passes the last manual test(s) then it can be published on the web.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;“Publish on Web” button&lt;/span&gt; copies files to the web-server via secured FTP channel. These files are placed at the special locations on the web-server, so the web site application catches them and generates the new content about the new available version.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Change version, rebuild solution&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;publish&lt;/span&gt; are common actions being executed one-by-one at most of the times. So that's why there is a yellow button with a long arrow on the dialog. This button aggregates those three frequent actions in one click.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-6303256594622987687?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/6303256594622987687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2009/09/three-tools-each-project-should-have.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/6303256594622987687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/6303256594622987687'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2009/09/three-tools-each-project-should-have.html' title='Three Tools Every Project Should Use'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_IvWbak_Zj90/Spytu1o6Q2I/AAAAAAAAABM/eK1fWQpulSQ/s72-c/Running+Tests.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-1657107384928215033</id><published>2009-05-14T19:39:00.012+03:00</published><updated>2011-04-17T04:55:43.023+03:00</updated><title type='text'>Future Development</title><content type='html'>I am going to cover some future directions of Eazfuscator.NET development in this article.&lt;br /&gt;There are three main milestones planned for this year:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;s style="font-weight: bold;"&gt;Flexible tuning&lt;/s&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;✓done&lt;/span&gt;&lt;br /&gt;Eazfuscator works great for 90% of applications now. The rest of applications require some gentle obfuscation tuning. That's why such ability as namespace obfuscation control will be added.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;s&gt;Encryption of embedded resources&lt;/s&gt;&lt;/span&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;✓done&lt;/span&gt;&lt;br /&gt;This is useful feature which allows to hide all embedded resources of an assembly from prying eyes. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Custom virtual machine&lt;/span&gt;&lt;br /&gt;Custom &lt;a href="http://en.wikipedia.org/wiki/Virtual_machine" target="_blank"&gt;virtual machine&lt;/a&gt; uses custom &lt;a href="http://en.wikipedia.org/wiki/Byte_code" target="_blank"&gt;bytecode&lt;/a&gt; which is unknown to existing decompilation tools. Some parts of obfuscated .NET application can be translated from &lt;a href="http://en.wikipedia.org/wiki/Common_Intermediate_Language" target="_blank"&gt;Common Intermediate Language (CIL)&lt;/a&gt; to the custom bytecode. The resulting code is then executed during runtime by embedded custom virtual machine which works on top of .NET runtime. Furthermore, the grammar of the custom virtual machine is randomly generated on every run of Eazfuscator.NET, so it's guaranteed that it will be nearly impossible to create a stable decompiler. This technique has some drawbacks, and the most outstanding one is performance degradation. So this means that custom virtual machine must be applied just to the most precious algorithms you want to hide.&lt;/li&gt;&lt;/ol&gt;If you have some other ideas then please don't hesitate to share, I'm always open to hear from you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-1657107384928215033?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/1657107384928215033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2009/05/future-development.html#comment-form' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/1657107384928215033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/1657107384928215033'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2009/05/future-development.html' title='Future Development'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-4371570416878247162</id><published>2009-04-20T18:42:00.016+03:00</published><updated>2010-12-27T05:50:34.947+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='product development'/><title type='text'>Making a Product</title><content type='html'>Writing an application is just a half of the road. Another half is to make a product which can be used by other people.&lt;br /&gt;&lt;br /&gt;The most important aspect of a product is that it must be ready to be consumed by the customers. If a product is not consumable by an average customer then product is considered as unfeasible.&lt;br /&gt;&lt;br /&gt;In software world it means that your application must be well-tested, documented and be ready for a wide deployment on divergent set of customer machines and platforms. Also product must be easy to start with. Average customer should enter its comfort zone within the first 20 minutes of product usage. Otherwise the product will be abandoned by a customer.&lt;br /&gt;&lt;br /&gt;Another thing manufacturer should think of is to provide quick feature-tour of a product to a customer. The most efficient way to do that is to use visual signs, text and colors. Take a look at two pictures below:&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_IvWbak_Zj90/Seyq3r4UrrI/AAAAAAAAAAU/iPBacynaFTw/s1600-h/Export_Apple.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5326820332920942258" src="http://1.bp.blogspot.com/_IvWbak_Zj90/Seyq3r4UrrI/AAAAAAAAAAU/iPBacynaFTw/s320/Export_Apple.jpg" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 166px;" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td width="55%"&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_IvWbak_Zj90/SeyrnxL6p_I/AAAAAAAAAAc/gYMUYyFTy8k/s1600-h/pineapple_exclusive.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5326821158979020786" src="http://4.bp.blogspot.com/_IvWbak_Zj90/SeyrnxL6p_I/AAAAAAAAAAc/gYMUYyFTy8k/s320/pineapple_exclusive.jpg" style="cursor: hand; cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 113px;" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;I often see those two kinds of juice packages when I go to a market every weekend. The picture on the left shows strict white package with some green text on it. The picture on the right shows colorful package with some text and nice attractive photo of the pineapple.&lt;br /&gt;&lt;br /&gt;Obviously, most of the customers prefer colorful package shown at the right. There are two factors which have impact on a customer decision: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Colorful things take more customers' attention&lt;/li&gt;&lt;li&gt;Pineapple photo gives a better feature set to a customer comparing to the blank package at the equal amount of time&lt;/li&gt;&lt;/ul&gt;So, let's return to Eazfuscator.NET.&lt;br /&gt;I wrote the core part of Eazfuscator from September 2007 to the end of November.&lt;br /&gt;&lt;br /&gt;Knowing all those tricks about products I additionally spend two months to make a product from just a written application. I wrote documentation, designed user interface of Assistant, created &lt;a href="http://en.wikipedia.org/wiki/Windows_Installer" target="_blank"&gt;MSI&lt;/a&gt; installation package. The result of all these efforts was the first public release on February 6, 2008.&lt;br /&gt;&lt;br /&gt;This article is the last one in the history series. Further articles will be mostly dedicated to the current development of Eazfuscator.NET.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-4371570416878247162?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/4371570416878247162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2009/04/making-product.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/4371570416878247162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/4371570416878247162'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2009/04/making-product.html' title='Making a Product'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_IvWbak_Zj90/Seyq3r4UrrI/AAAAAAAAAAU/iPBacynaFTw/s72-c/Export_Apple.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-2974050669154800985</id><published>2009-02-25T02:07:00.004+02:00</published><updated>2011-01-06T18:24:17.066+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>Concept</title><content type='html'>The concept of Eazfuscator.NET was born in early autumn of 2007. It became clear to me that there were no decent products available at that time.&lt;br /&gt;&lt;br /&gt;Most of the obfuscators for .NET were quite hard to use as for me. First of all, they all required significant efforts to make them just start working. Many of them required too much of manual guidance through obfuscation transformation decisions so I had to set tons of check boxes against class members tree. And many of them were extremely unfriendly in terms of build process integration.&lt;br /&gt;&lt;br /&gt;The only obfuscator I was fascinated about was &lt;a href="http://smartassembly.com/" target="_blank"&gt;{smartassembly}&lt;/a&gt; which is commercially available product. It was easy to use and it worked very well. However I was disappointed with significant performance degradation of encrypted strings. Another concerning issue was a lack of x64 platform support at that time and I was working on x64 since mid of 2005. Keeping in mind that then was 2007, it is 2 years distance and not so positive signal for the product.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #999999;"&gt;&lt;span style="font-size: 78%;"&gt;* Please keep in mind that information above may be outdated now.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;The final contributing factor to start own project was indescribable fusion sparkle in my head. It's hard to describe without fear to be blamed in madness but it was a very new feeling to me. The feeling of thousands of parallel thoughts that go through my head. So this was a starting point for Eazfuscator.NET. The whole product concept was born within several seconds somewhere at September 2007.&lt;br /&gt;The main principles of Eazfuscator.NET are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ease of use. Yes, things must be simple because this is the only way for a human to manage them&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Automatic obfuscation and integration without manual work. Manual work is a waste of time and money, so no waste anymore&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Painless build process integration. Integration must take several seconds and not countless hours&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Stability. I know that a lot of people might be using Eazfuscator.NET to create their own products.  So Eazfuscator.NET must be bullet-proof stable to be able to do its best job&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Free availability&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;User interface prototype appeared at the same time as the whole concept did. I drew the following picture:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_IvWbak_Zj90/SaTDitHTujI/AAAAAAAAAAM/n9Mjg0fr3Ig/s1600-h/Eazfuscator.NET+UI+Concept.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Eazfuscator.NET User Interface Concept" border="0" id="BLOGGER_PHOTO_ID_5306581261942503986" src="http://4.bp.blogspot.com/_IvWbak_Zj90/SaTDitHTujI/AAAAAAAAAAM/n9Mjg0fr3Ig/s320/Eazfuscator.NET+UI+Concept.png" style="cursor: hand; cursor: pointer; display: block; height: 169px; margin: 0px auto 10px; text-align: center; width: 288px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Given user interface is primarily designed to be used in conjunction with &lt;a href="http://en.wikipedia.org/wiki/Drag-and-drop" target="_blank"&gt;drag-and-drop&lt;/a&gt;. The picture above consists of two zones: red zone to the left and green zone to the right. &lt;span style="font-style: italic;"&gt;Right&lt;/span&gt; side and &lt;span style="font-style: italic;"&gt;green&lt;/span&gt; color are obviously associated with safety, at least in European cultures. So the green zone is responsible for protection (obfuscation). &lt;span style="font-style: italic;"&gt;Left&lt;/span&gt; side and &lt;span style="font-style: italic;"&gt;red&lt;/span&gt; color are obviously associated with potential danger. So the red zone is responsible for removal of previously applied protection. Protection removal does not mean reverse-obfuscation, it just means that given .NET project will not be obfuscated anymore. Whenever user wants to change protection settings of .NET project he drags and drops the project onto corresponding zone.&lt;br /&gt;&lt;br /&gt;So that was a brief history of concept birth for Eazfuscator.NET obfuscator.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-2974050669154800985?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/2974050669154800985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2009/02/concept.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/2974050669154800985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/2974050669154800985'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2009/02/concept.html' title='Concept'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_IvWbak_Zj90/SaTDitHTujI/AAAAAAAAAAM/n9Mjg0fr3Ig/s72-c/Eazfuscator.NET+UI+Concept.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8676183357407548589.post-2862637382376084928</id><published>2009-02-24T03:40:00.000+02:00</published><updated>2009-02-25T06:49:52.089+02:00</updated><title type='text'>Introduction</title><content type='html'>Dear Readers,&lt;br /&gt;&lt;p&gt;This blog is dedicated to &lt;a href="http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx"&gt;Eazfuscator.NET&lt;/a&gt;. Such a strange name was given to a special application which &lt;a href="http://en.wikipedia.org/wiki/Obfuscated_code" target="_blank"&gt;obfuscates&lt;/a&gt; .NET applications. Facts, motivations, history, thoughts and other aspects of Eazfuscator.NET obfuscator will be covered in this blog.&lt;/p&gt;&lt;p&gt;First of all I would like to make some short introduction to the .NET world and domain of obfuscation.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/netframework/default.aspx" target="_blank"&gt;.NET&lt;/a&gt; is a technology from &lt;a href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; which allows to create quality and reliable software. .NET platform is similar to &lt;a href="http://java.sun.com/" target="_blank"&gt;Java&lt;/a&gt; platform but has many unique features. I would say that .NET inherits the best achievements of Java and adds some new superior concepts such as support of multiple programming languages.&lt;/p&gt;&lt;p&gt;Applications that were written in one of .NET languages (C#, VB.NET, etc.) are often called &lt;span style="font-style:italic;"&gt;managed&lt;/span&gt; applications. The word &lt;span style="font-style:italic;"&gt;managed&lt;/span&gt; means that those applications work under control of .NET Runtime. It is worth to mention that there is another kind of applications which do not use .NET Runtime; these applications are called &lt;span style="font-style:italic;"&gt;native&lt;/span&gt; ones.&lt;/p&gt;&lt;p&gt;Application development with .NET is much more easier and productive comparing to native application development and brings many benefits to developers and product quality. However .NET has some weak points. The most concerning one is an ability to easily reverse-engineer an application after compilation. It is possible because managed applications are compiled to &lt;a href="http://en.wikipedia.org/wiki/Common_Intermediate_Language" target="_blank"&gt;Common Intermediate Language (CIL)&lt;/a&gt; which contains a lot of additional &lt;a href="http://en.wikipedia.org/wiki/.NET_metadata" target="_blank"&gt;meta data&lt;/a&gt;. So it's a piece of cake for decompiler tool to reverse the source of an application. You may take a look at &lt;a href="http://www.red-gate.com/products/reflector/" target="_blank"&gt;.NET Reflector&lt;/a&gt; tool as a proof of concept.&lt;/p&gt;&lt;p&gt;Eazfuscator.NET allows to minimize the risks of possible decompilation. It uses several techniques to prevent reverse-engineering of applications. The short description of obfuscation process is: sensitive data are hashed or encrypted, superfluous meta data are removed.&lt;/p&gt;&lt;p&gt;It is possible to find a lot of flaming forum threads on the Internet where people debate about obfuscators and their applicability. However if you value your intellectual property then I would say that obfuscation is a must-have for your precious software products.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8676183357407548589-2862637382376084928?l=eazfuscator.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eazfuscator.blogspot.com/feeds/2862637382376084928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://eazfuscator.blogspot.com/2009/02/introduction.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/2862637382376084928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8676183357407548589/posts/default/2862637382376084928'/><link rel='alternate' type='text/html' href='http://eazfuscator.blogspot.com/2009/02/introduction.html' title='Introduction'/><author><name>Oleksiy</name><uri>http://www.blogger.com/profile/06538731824465563253</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
