<?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-3251957072749834367</id><updated>2012-02-11T01:40:32.635+02:00</updated><category term='mvc'/><category term='csharp'/><category term='obfuscation'/><category term='translates'/><category term='css'/><category term='git'/><category term='sql'/><category term='silverlight'/><category term='revelation'/><category term='functional'/><category term='.net'/><category term='multicore'/><category term='cpp'/><title type='text'>My revelation. sharcUs</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-1976189706803100414</id><published>2012-01-27T13:13:00.002+02:00</published><updated>2012-01-27T13:13:56.905+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='multicore'/><category scheme='http://www.blogger.com/atom/ns#' term='translates'/><title type='text'>Два слова о параллельной обработке связанных списков</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0in; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; line-height: 115%; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;Предлагаю отказаться от последовательных связанных списков в пользу древовидных структур для всех случаев использования неупорядоченных данных при их паралельной обработке.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;Связанный список – это динамическая структура данных, которая используется для хранения линейной коллекции данных (как правило неупорядоченных). Простейшая вариация такого списка предполагает только наличие «головного» указателя, ссылающегося на первый элемент списка. Каждый элемент состоит из данных и указателя на «следующий» элемент коллекции. Если этот указатель нулевой (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;NULL&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt; &lt;span lang="RU"&gt;или соответствующий эквивалент), то это является индикатором того, что данный элемент – последний в списке. Для предоставления более быстрого доступа к требуемому элементу в списке могут использоваться дополнительные указатели. Примером такого указателя может быть «концевой» указатель, ссылающийся на последний элемент. С его помощью можно увеличить скорость выполнения операций добавления элементов в конец списка.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;Для чего можно применять такой список и чем хуже обычный массив? Связанные список не предоставляет произвольного доступа к любому элементу в списке, однако позволяет добавлять новые элементы, удалять или переупорядочивать существующие за время О(1). И здесь нету никаких ограничений на количество элементов в списке, кроме, разумеется, естественных ограничений доступной памяти в системе. Таким образом, учитывая ограничения по доступу и перемещению данных, массивы и связанные списки взаимодополняемые структуры. Разработчики программного обеспечения вправе сами решать какая из структур лучше походит для применения в той или иной ситуации.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;А имеет ли смысл использовать связанные списки в наши дни, с приходом эпохи параллельных вычислений? &lt;a href="http://www.cs.washington.edu/homes/djg/"&gt;&lt;span style="color: windowtext;"&gt;Дэн Гроссман&lt;/span&gt;&lt;/a&gt; из университета Вашингтона, говорит: «Нет». Впервые я услышал об этом заявлении от коллеги, который готовил презентацию с професором Гроссманом на конференции &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;SIGCSE&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;. Суть заявления сводится к тому, что везде где может использоваться связанный список, его использование можно заменить на использование дерева. Давайте попробуем разобраться насколько данная идея имеет смысл.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;Связанный список последовательная структура данных которая очень хорошо подходит для последовательной обработки данных. Дерево отлично вписывается в идиому параллелизма &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;fork&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;-&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;join&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;, о которых я писал в своих предыдущих публикациях (прим. переводчика – см. публикации Клэя на &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;a href="http://drdobbs.com/"&gt;&lt;span style="color: windowtext;"&gt;http&lt;/span&gt;&lt;span lang="RU" style="color: windowtext; mso-ansi-language: RU;"&gt;://&lt;/span&gt;&lt;span style="color: windowtext;"&gt;drdobbs&lt;/span&gt;&lt;span lang="RU" style="color: windowtext; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: windowtext;"&gt;com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;). Как и в случае со связанным списком, дерево может динамически изменять свою структуру. Время необходимое на добавление нового элемента не будет постоянным, однако в случае с упорядоченным деревом оно не превысит О (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;log&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;n&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;), что намного лучше алгоритма со сложностью &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;O&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt; (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;n&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt; mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;), когда имеется два указателя и их необходимо переместить в самый конец списка для добавления нового элемента. А что по поводу других операций, для которых может применяться связанный список? Могут ли эти операции также успешно использовать вместо списка дерево при параллельных вычислениях? Ниже представлены некоторые операции над связанным списком подбного рода и примеры того, как они могут быть «сэмулированны» с использованием дерева.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Обработка всех элементов&lt;/span&gt;&lt;/b&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. В последовательном процессе, для обработки каждого элемента в связанном списке, необходимо начинать с «головного» элемента, выполнять над ним требуемые операции, передвинуть указатель на следующий элемент и повторять данный процесс до тех пор пока не будут выполнены требуемые операции над последним элементом списка. Если в выполняемые операции не вовлечены другие элементы списка, то операции над элментами можно выполнять паралельно в разных потоках или процессах. Если данные упорядочены в виде дерева, то в таком случае до или после обработки текущего элемента можно параллельно в отдельном потоке выполнить обработку дочерних узлов текущего элемента. Как только некоторое пороговое количество активных отоков достигнуто, новые потоки перестают создаваться до тех пор пока запущеные процессы обработки не будут завершены.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В целях улучшения баланса загрузки системы при обработке элементов, дерево имеет смысл делать также максимально сбалансированным. Если потоки создаются на одном и том же уровне дерева, то каждый поток сможет обработать одинаковое количество элементов. Существует большое количество видов сбалансированного дерева, которые могут использоваться для подобных задач. В открытом доступе можно найти много справочных материалов, которые в деталях описывают возможные варианты. При выборе того или иного типа дерева необходимо учитвыать набор операций, которые необходимо осуществлять над будущей структурой данных и также держать в голове информацию о том, могут ли паралельные потоки обращаться к различным элементам дерева параллельно.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Поиск&lt;/span&gt;&lt;/b&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. В данном случае, я имею ввиду неупорядоченный поиск. (Если у вас есть отсортированные данные, то в таком случае одного потока будет более чем достаточно для того, что бы спустится вниз до требуемого элемента, создание отдельных потоков в этом случае выглядит более чем избыточным). Для бинарного дерева существует три алгоритма поиска: &lt;/span&gt;preorder&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, &lt;/span&gt;inorder&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;и &lt;/span&gt;&lt;/span&gt;postorder&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Все они являются рекурсивными, а значит этот процесс можно оптимизировать с использованием нескольких параллельных потоков. Если вы не знакомы с данными алгоритмами, настоятельно рекомендую с ними ознакомится.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В другом случае необходимо найти уникальный элемент в коллекции данных. Здесь наиболее сложным моментом при реализация параллельного поиска будет необходимость проинформировать задействованные в поиске потоки о том, что поиск завершен, остановить их выполнение и убедится в том, что все потоки поиска ожидающие запуска не будут активированны. С другой стороны, если поиск должен быть полным, то есть в результате его выполнения может быть найдено несколько копий желаемого элемента, останавливать потоки при находжении первого элемента не требуется.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Эмуляция очереди или стека&lt;/span&gt;&lt;/b&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. И в первом и во втором случае, вставка и удаление данных осуществляется по общему принципу. Подобно тому, как связанный список используется для эмуляции очереди или стека, при использовании дерева для подобных задач необходимо убедится что когда несколько потоков пытаются вставить или удалить некоторый элемент, то доступ к структуре дерева должен быть таким, что бы гарантировать, что данные не будут потеряны, повреждены или продублированы в процессе выполнения данных операций. (Я надеюсь что все это я мог бы и не рассказывать, так как вы и так все это знаете и без меня.)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Как и с эмуляцией стека и обыкновенной очереди, очередь с приоритетами может быть реализована посредством структуры «кучи» (еще одна структура данных о которой можно почитать на досуге) на дереве. Непосредственная реализация обыкновенной очереди и стека будет незначительно сложнее, если ее осуществлять на базе дерева. Стоит учесть, что параллельное выполнение потоков на данных структурах может быть недетерминированным (в то время как вывод - детерминированным). Даже если мы используем связанный список для стека с параллельным вычислением, из-за самой природы параллелизма, порядок обработки элементов в нем в большинстве случаев будет неопределенным (если алгоритм требует некоторой упорядоченности при обработке элементов стека, о параллельных вычислениях придется забыть). Итак, поскольку у нас есть методы для безопасной вставки и удаления элементов данных, их можно приспособить к работе с любыми реализациями деревьев.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Смог ли я убедить вас в том что имеет смысл отказаться от последовательных связанных списков в пользу древовидных структур для всех видов неупорядоченных данных в случаях, когда допустима их параллельная обработка? По крайней мере я убедил в этом себя. Это выглядит хорошей идеей и я выделил для себя агрументы описанные выше, но у меня еще не было возможности использовать эту идею на практике. Поэтому мне было бы интересно узнать о наличии каких-либо операций над данными, которые традиционно используются при работе со связанными списками, и которые не могут быть реализованы в случаях использования деревьев. Первое что пришло мне в голову – списки упорядоченные по частоте использования (&lt;/span&gt;frequency&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;ordered&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;list&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;). Однако, эта структура базируется на последовательном доступе к элементам и последовательном упорядочевании запросов поиска. А вы можете назвать методы/алгоритмы доступа к списку, которые могут выполнятся параллельно, но требующие последовательного связанного списка или такой структуры данных, которая не могла бы быть реализована с использованием дерева?&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: 8.0pt; line-height: 115%;"&gt;By &lt;a href="http://drdobbs.com/author/7104"&gt;&lt;span style="color: windowtext;"&gt;Clay Breshears&lt;/span&gt;&lt;/a&gt;, January 17, 2012&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-1976189706803100414?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/1976189706803100414/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=1976189706803100414' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/1976189706803100414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/1976189706803100414'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2012/01/blog-post.html' title='Два слова о параллельной обработке связанных списков'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-5097974441057564673</id><published>2011-12-27T16:48:00.001+02:00</published><updated>2011-12-27T16:50:51.162+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='translates'/><title type='text'>Десять способов потерять ценных сотрудников</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Сложно ли таким выдающимся &lt;/span&gt;IT&lt;span lang="RU"&gt;-компаниям как &lt;/span&gt;Yahoo&lt;span lang="RU"&gt;! или более выраженным конгломератам таким, как, скажем, &lt;/span&gt;General Electrics &lt;span lang="RU"&gt;или &lt;/span&gt;Home Depot&lt;span lang="RU"&gt; сохранять свои лучшие кадры в неприкосновенности. Не так давно на &lt;/span&gt;GigaOM &lt;span lang="RU"&gt;обсуждались проблемы &lt;/span&gt;Yahoo &lt;span lang="RU"&gt;с ее бесприбыльным графиком рыночной строимости, бенефитами отдельных «звезд» внутри компании и утечками лучших кадров на неизвестные стартап-проекты.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;И еще, имеют ли подобные компании какие-либо преимущества по удерживанию своих талантов. Я могу отметить как положительные, так и отрицательные моменты, которые присутствуют в управлении талантливыми сотрудниками в больших компаниях. Вот мой список топ-10, пункты которого «помогают» компаниям потерять свои таланты.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;1. &lt;u&gt;Бюрократия большой компании&lt;/u&gt;. Это пожалуй причина №1 которую мы слышим, после того, как ценные сотрудники покидают компанию. Но на самом деле, за этой причиной стоит некая иная причина. Никому не нравятся правила, которые не имеют смысла. Но когда таланты жалуются по этому поводу, это является знаком того, что они считают, что им не дали высказаться. Они может быть и говорили что-то ранее. Однако действительно талантливые сотрудники, обязательной сказали бы: «постойте, давайте проверим».&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;2. &lt;u&gt;Остутствие попыток найти нечто, что было бы способно зажечь умы талантов&lt;/u&gt;. Большая компания представляет собой огромный, постоянно двигающийся механизм. Поэтому, как правило, нет таких специальных людей, которые бегали бы вокруг «нужных» сотрудников и спрашивали бы их без умолку, нравится ли им их текущий проект или хотели бы ли они заниматься чем то новым, что им было бы интересно и таким образом помогать компании. Отдел кадров обычно слишком занят, что бы тратить время на подобную деятельность. Начальники также разрываются на части по другим, очевидно, не менее важным делам, и вот этот вопрос по поиску заинтересованности талантов переходит из разряда обязательного в разряд желательного. Но до тех пор пока это не будет обязательным, может сказать «адиос» вашим лучшим людям. Талантливые люди на первое место ставят не власть и деньги, а скорее возможность принять участие в чем-то невероятном, способном изменить мир. Такие вещи их действительно заводят. Большие компании как правило не уделяют должного внимания этому вопросу.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;3. &lt;u&gt;Недостачный ежегодный анализ результативности&lt;/u&gt;. Вы бы изумились, если бы узнали как большие компании проводят ежегодный анализ результативности. Если он есть, то часто это сводится к тому, что в срочном порядке заполняется бланк отчетности «для галочки» и тут же отсылается в отдел кадров. Это оставляет впечатление, что начальство - и, соответственно, компанию вцелом – не интересует отдаленное будущее своих сотрудников. Если вы настолько талантливы, что вы тут делаете? И это приводит к пункту 4... &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;4. &lt;u&gt;Нету обсуждения посвященного развитию карьеры&lt;/u&gt;. Тут запрятан секрет большинства боссов: большинство сотрудников не имеют понятия чем они будут заниматься через пять лет. По-нашим подсчетам менее пяти процентов людей смогут ответить на этот вопрос. Однако каждый из нас хочет, что бы разговор о нашем будущем непременно состоялся. Большинство руководителей никогда не затрагивают эту тему со своими подчиненными, даже с самыми талантливыми. Это представляет собой великолепную возможность для вас и вашей организации изменить ситуацию, если вы возьмете этот вопрос в оборот. Затрагивайте с каждым из ваших сотрудников данный вопрос раз а лучше два раза в год. Если ценные вам сотрудники знают, что вы думаете о их будущем, это пойдет только на пользу.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;5. &lt;u&gt;Меняющиеся прихоти / стратегические приоритеты&lt;/u&gt;. Я аплодирую компаниям, которые пытаются создать инкубатор или «кирпичный дом» для своих самых ценных сотрудников, используя для этого новые занимательные проекты. Проблема большинства организаций заключается в том, что у них не расставлены стратегические приоритеты. То есть, они могут подумать о подобном инкубаторе, но начать его внедрять только спустя год или два. Талантливые люди ненавидят томится в ожидании. Если вы назначили ценных сотрудников на проект, они вправе получить от проекта то, что было обещано ранее.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;6. &lt;u&gt;Недостаток ответственности и/или разговоров о том как нужно работать&lt;/u&gt;. Хотя вы не можете позволить что бы талантливые люди «валяли дурака», также будет и ошибкой пустить на самотек проекты, управляемые вашими талантами. Речь не идет о том, что вы должны лезть не в свои дела и говорить кому что и как делать. Однако, талантливый человек требует от окружающих ответственности и совсем не против нести ответственность за свои проекты. Поэтому, практикуйте небольшие митинги с вашими талантами относительно текущего состояния дел. Они будут ценить ваше внимание к их делам – но только если ваше вмешательство будет в рамках допустимого.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;7. &lt;u&gt;Талантливые люди любят других талантливых людей&lt;/u&gt;. Какие люди окружают ваши таланты? Многие организации пристраивают к выдающимся личностям более посредственных сотрудников. Для этого начальство находит тысячу и одну причину: «Ну этого парня сложно было пристроить куда-то еще...», «Давайте пока он тут побудет...». Однако, как показывают опросы талантливых сотрудников при увольнении из крупных организаций, многие увольнялись из-за того что не сработались со своими не такими талантливыми коллегами. Так что, если вы хотите сохранить ваши выдающиеся кадры при себе, побеспокойтесь что бы они были окружены не менее выдающимися личностями.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;8. &lt;u&gt;Момент пропущенной цели&lt;/u&gt;. Это может казаться очевидным, но тем не менее, насколько радужное будущее у вашей организации? Какой стратегии вы следуете? К какой цели должны стремится талантливые сотрудники вашей организации? Они могут принимать участие в обсуждение этой цели? Если ответ – нет, это нужно немедленно исправлять.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;9. &lt;u&gt;Недостаток открытого взаимодействия&lt;/u&gt;. Талантливые сотрудники хотят говорить о своих идеях и хотят быть услышанными. Но, это желание часто не согласуется со стратегиями многих организаций – и часто подобные инициативы тут же подавляются. Ваши лучшие люди в такой ситуации покинут вас и рядом с вами останутся люди всегда говорящие «Да» по любому вопросу которые вы им подкинете. Вам же следует научиться выслушивать и другие точки зрения, отличные от ваших – и брать из всех предложенных решений только самое лучшее.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;10. &lt;u&gt;Кто здесь начальник?&lt;/u&gt; Если несколько людей подчиненных одному руководителю увольняются со своих позиций – это плохой знак. Часто в подобных случаях нужно прийти и серьёзно поговорить с таким руководителем. Но, к сожалению, такая стратегия работает не всегда и дает положительный результат только в одном случае из трех. Лучшим решением будет перевод такого «начальника» на другую позицию в организации, туда, где он не сможет добраться до ваших самых талантливых.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;В реальности не всегда виновата организация. Талантливые люди также несут ответственность по этому вопросу не меньше организации-работодателя. Однако, в наши дни талантливых сотрудников очень немного и поэтому на коне будут те организации, которые сами предпримут необходимые действия, что бы устранить проблемы описанные в данной статье-рекомендации и не будут дожидаться пока кто-то придет к ним и подскажет что и как нужно делать.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Базируется на публикации &lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;a href="http://www.forbes.com/sites/ericjackson/2011/12/14/top-ten-reasons-why-large-companies-fail-to-keep-their-best-talent/"&gt;&lt;span style="line-height: 115%;"&gt;http://www.forbes.com/sites/ericjackson/2011/12/14/top-ten-reasons-why-large-companies-fail-to-keep-their-best-talent/ &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: xx-small; line-height: 115%;"&gt;By&lt;/span&gt;&lt;span style="font-size: xx-small; line-height: 115%;"&gt; &lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;a href="http://blogs.forbes.com/ericjackson/"&gt;&lt;span style="line-height: 115%;"&gt;Eric&lt;/span&gt;&lt;span style="line-height: 115%;"&gt; &lt;/span&gt;&lt;span style="line-height: 115%;"&gt;Jackson&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-5097974441057564673?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/5097974441057564673/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=5097974441057564673' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/5097974441057564673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/5097974441057564673'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2011/12/blog-post.html' title='Десять способов потерять ценных сотрудников'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-6645893136454308054</id><published>2011-11-25T08:23:00.000+02:00</published><updated>2011-11-25T08:23:41.033+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='translates'/><title type='text'>Так что же нам готовит Windows 8?</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0in; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;&lt;div class="MsoSubtitle" style="text-align: right;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span&gt;Статья базируется на публикации Дино Эспозито "&lt;a href="http://drdobbs.com/windows/231902075" target="_blank"&gt;What Exactly is Windows 8?&lt;/a&gt;"&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoSubtitle" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoSubtitle" style="text-align: justify;"&gt;&lt;i&gt;&lt;span&gt;Metro&lt;/span&gt;&lt;span style="mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt; &lt;span lang="RU"&gt;– одно из знаковых нововведений для разработчиков, которое &lt;/span&gt;&lt;/span&gt;&lt;span style="mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;Microsoft&lt;/span&gt;&lt;span style="mso-ansi-language: RU; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;"&gt; &lt;span lang="RU"&gt;представит в релизе новой версии своей операционной системы.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoSubtitle" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В сентябре &lt;/span&gt;Microsoft&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;продемонстрировала первое превью разрабатываемой &lt;/span&gt;&lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8. Новая версия операционной системы предназначена не только для &lt;/span&gt;PC&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, она также может использоваться и на планшетных устройствах. С точки зрения разработчика, &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8: система двух режимов. Первый режим базируется на продолжении развития предыдущих версий &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, и предоставляет привычный пользовательский интерфейс и возможности для разработки. Второй режим – это абсолютно новое решение пользовательского интерфейса, которое базируется на новом системном &lt;/span&gt;API&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Это новое решение &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;8 называется &lt;/span&gt;&lt;/span&gt;Metro&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Оно построено на пользовательском интерфейсе &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Phone&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Оно также предлагает набор новых приложений, которые выполняются с помощью нового системного &lt;/span&gt;API&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;– &lt;/span&gt;&lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Runtime&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; (или сокращенно &lt;/span&gt;WinRT&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;).&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Из-за наличия двух режимов пользовательского интерфейса в &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8 – обычного и &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;– новые приложения также в перспективе будут делится на две соответствующие категории. Это очевидное и простое требование породило множество дисскусий, которые стали источниками заблуждений и необоснованных догадок.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Вот несколько ключевых вопросов, которые мучают разработчиков по всему миру, и на которые пока нету четких и вразумительных ответов:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-left: .5in; mso-list: l0 level1 lfo1; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span lang="RU" style="font-family: Symbol; font-size: 10.0pt; mso-ansi-language: RU; mso-bidi-font-family: Symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: Symbol;"&gt;&lt;span style="mso-list: Ignore;"&gt;·&lt;span style="font: 7.0pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Какую роль играет фреймворк .&lt;/span&gt;NET&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; при реализации приложений &lt;/span&gt;Metro&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;?&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-left: .5in; mso-list: l0 level1 lfo1; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span lang="RU" style="font-family: Symbol; font-size: 10.0pt; mso-ansi-language: RU; mso-bidi-font-family: Symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: Symbol;"&gt;&lt;span style="mso-list: Ignore;"&gt;·&lt;span style="font: 7.0pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Что вообще требуется для написания &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;приложений?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-left: .5in; mso-list: l0 level1 lfo1; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span lang="RU" style="font-family: Symbol; font-size: 10.0pt; mso-ansi-language: RU; mso-bidi-font-family: Symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: Symbol;"&gt;&lt;span style="mso-list: Ignore;"&gt;·&lt;span style="font: 7.0pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;И более глобально, какое будущее ждет платформу &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;вцелом?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-left: .5in; mso-list: l0 level1 lfo1; tab-stops: list .5in; text-indent: -.25in;"&gt;&lt;span lang="RU" style="font-family: Symbol; font-size: 10.0pt; mso-ansi-language: RU; mso-bidi-font-family: Symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: Symbol;"&gt;&lt;span style="mso-list: Ignore;"&gt;·&lt;span style="font: 7.0pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Какое будущее у меня как, разработчика &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;?&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Неопределенность, которая сейчас существует является отличным поводом для появления всевозможных страхов, слухов и сомнений. В данной публикации мы попробуем проанализировать информацию, которую &lt;/span&gt;Microsoft&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;предоставила на первой презентации &lt;/span&gt;&lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;8, и постараемся прийти к выводу, что все страхи не имеют под собой никаких оснований.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="RU"&gt;Новое представление &lt;/span&gt;Windows&lt;span lang="RU"&gt; 7&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div style="text-align: justify;"&gt;Microsoft&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;гарантирует обратную совместимость. Таким образом все приложения, которые были написаны ранее, будут работать и на новой операционной системе так же как и прежде. Говоря о &lt;/span&gt;&lt;/span&gt;Metro&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, нужно понимать, что это новое семейство приложений. &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8 может работать в двух режимах, которые можно переключать в зависимости от своих предпочтений: стандартный режим, который и выглядит и работает так, как это было в предыдущих версиях &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, но с небольшими обновлениями ключевых компонентов системы, и новый режим, который базируется на &lt;/span&gt;Metro&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. В &lt;/span&gt;Metro&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; присутствует нативная поддержка тач-скрина, новая система рантайм, и новые подходы в программировании. &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;в первую очередь проектировалось для планшетных устройств, однако также доступно и для стандартных &lt;/span&gt;&lt;/span&gt;PC&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Можно посмтреть на данный вопрос под другим углом: классический рабочий стол &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;– это просто другая интерпретация тех возможностей которые предоставляют новые приложения &lt;/span&gt;&lt;/span&gt;Metro&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Это похоже на революцию? Можно привести мнение Стивена Синофски (&lt;/span&gt;Steven&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Sinofsky&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;), президента подразделения &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;и &lt;/span&gt;&lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Live&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Он говорит, что &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;8 &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;это попытка “придать новый облик &lt;/span&gt;&lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;”.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Microsoft&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;не может игнорировать существующие приложения и потребности пользователей &lt;/span&gt;&lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 7. Поэтому, для того, что бы всецело перейти на новый пользовательский интерфейс, и сделать его единственно возможным вариантом для взаимодействия с пользователем в новой версии &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, необходимо приложить чрезвычайно много усилий и осущесвить очень много изменений. Поэтому &lt;/span&gt;Microsoft&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;пошла на компромисное решение, принимающее в расчет наличие двух режимов.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Будет ли переход на &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8 чем то похожим на изменения которые в свое время принесла &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;95? &lt;/span&gt;&lt;/span&gt;Win&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 95 обновила существовавшие тогда программы заместив собой устаревшую в то время консольную операционную систему &lt;/span&gt;MS&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;-&lt;/span&gt;DOS&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. В то время это было начало новой вехи в развитии области операционных систем. &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;является новой вехой в развитии только лишь платформы &lt;/span&gt;&lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Новшества, которые придут вместе с &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8 будут значительно проще и менее глобальны.&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="RU"&gt;Вызов для разработчиков&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Существующие приложения &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;не нужно портировать под &lt;/span&gt;&lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;и разработчики программного обеспечения могут по прежнему писать свои программы используя классические приемы, средства разработки и применяемые технологии – фреймворк .&lt;/span&gt;&lt;/span&gt;NET&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; и соответствующие языки программирования.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Приложения &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;потребуют нового подхода к процессу разработки, нового &lt;/span&gt;&lt;/span&gt;API&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; и новой системы рантайм, но использоваться будут уже знакомые языки программирования и средства разработки. Например можно использовать &lt;/span&gt;HTML&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;5 в связке с &lt;/span&gt;JavaScript&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;и &lt;/span&gt;&lt;/span&gt;CSS&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;3. Также можно использовать &lt;/span&gt;C&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;++, &lt;/span&gt;Visual&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Basic&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;и &lt;/span&gt;&lt;/span&gt;C&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;#. Во всех случаях, &lt;/span&gt;XAML&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;остается одним из вариантов для разработки пользовательского интерфейса.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В терминах функциоанальности, &lt;/span&gt;API&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;для приложений &lt;/span&gt;&lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;имеет много общего с &lt;/span&gt;&lt;/span&gt;API&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;для приложений .&lt;/span&gt;&lt;/span&gt;NET&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;: некоторые пространства имен будут переименованы и некоторые классы&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;перемещены в другие компоненты. Важным моментом, который нельзя упустить из виду, является тот факт, что приложения &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;выполняются с использованием нового рантайма, который является оберткой над сервисами ядра &lt;/span&gt;&lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; в манере похожей на &lt;/span&gt;Win&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;32. Фреймворк .&lt;/span&gt;NET&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;общается с системой через &lt;/span&gt;&lt;/span&gt;P&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;/&lt;/span&gt;Invoke&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;вызовы функций &lt;/span&gt;&lt;/span&gt;Win&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;32. &lt;/span&gt;WinRT&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;– рантайм использоуемый &lt;/span&gt;&lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;– обращается к нативным сервисам системы более непостредственно, и использует другие подходы для их инкапсуляции.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Приложения &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;следуют логике мобильных приложений. Они никогда не выполняются непонятно как, не зависают. Говоря далее, нужно отметить, что приложения &lt;/span&gt;&lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;распространяются через специальный маркет, благодаря чему каждое приложение проходит через процесс получения сертификата качества &lt;/span&gt;&lt;/span&gt;Microsoft&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Получение лицензии на использование программы осуществляется с привязкой к конкретному пользователю, а не к машине. Настройки по умолчанию используют облако для хранения данных. И, наконец, приложение &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;должно содержать информацию о аппаратном обеспечении, на котором оно может выплнятся.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Таким образом, написание приложения &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;похоже на написание приложений под мобильные платфрмы, такие, как, скажем, &lt;/span&gt;&lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Phone&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 7. Природа и структура приложений также отличается от традиционных .&lt;/span&gt;NET&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;приложений, поскольку приложения &lt;/span&gt;&lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;призваны быть более простыми, более интерактивными и сконцентрироваными на содержимом.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Ну что? Несет ли &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8 в себе большие изменения для пользователей и разработчиков? Являются ли &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8 и приложения &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;тем, на что нужно немедленно сконцентрировать все свое внимание и воспринимать как догму? Очевидно, ответ на оба вопроса будет один – нет, я так не думаю. &lt;/span&gt;&lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8 – эволюционное развитие платформы &lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. &lt;/span&gt;Metro&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;– новшество, которое приходит вместе с &lt;/span&gt;&lt;/span&gt;Windows&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; 8. Для разработчика – это очередная новая платформа, которая возможно получит развитие в будущем.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-6645893136454308054?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/6645893136454308054/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=6645893136454308054' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/6645893136454308054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/6645893136454308054'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2011/11/windows-8.html' title='Так что же нам готовит Windows 8?'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-1127201154532383900</id><published>2011-10-07T16:11:00.001+02:00</published><updated>2011-10-07T16:18:00.817+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='obfuscation'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Orange Heap - Еще один бесплатный обфускатор для .NET</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;В последнее время я активно занимался изучением принципов обфускации и существующих приемов модификации кода, направленных на затруднение процесса реверс-инжиниринга .&lt;/span&gt;NET &lt;span lang="RU"&gt;программ. Отчасти, результатом всего этого процесса исследования стал цилк статей “Как работают обфускаторы” (&lt;a href="http://sharcus.blogspot.com/2011/07/blog-post.html"&gt;часть 1&lt;/a&gt; (Переименование и шифрование), &lt;a href="http://sharcus.blogspot.com/2011/08/blog-post.html"&gt;часть 2&lt;/a&gt; (Изменения внутренней логики), &lt;a href="http://sharcus.blogspot.com/2011/09/blog-post.html"&gt;часть 3&lt;/a&gt; (Дополнительные возможности)). Данным циклом я занимался несколько последних месяцев. Если вы интересуетесь вопросами обфускации, крайне рекомендую его к прочтению. &amp;nbsp;Статьи легко читаются и содержат много полезной и наглядной информации. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Однако одним только циклом дело не закончилось. Для того что бы прочувствовать все нюансы, которые возникают с процессе создания средства обфускации я пошел немного дальше и решил написать свой собственный .&lt;/span&gt;NET &lt;span lang="RU"&gt;обфускатор. Результат не заставил себя долго ждать и уже в начале сентября я выпустил первый публичный релиз, спустя четыре с половиной месяца после начала работы над проектом. А через две недели выпустил небольшое обновление с исправлениями ошибок, которые были найдены и исправлены после релиза. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;На самом деле на реализацию конечного продукта было потрачено с апреля по сегодняшний день всего лишь чуть более 160 часов. Поскольку у меня есть основная работа, времени на собственные проекты не так то и много. В связи с этим реализация обфускатора растянулась на несколько месяцев. Уверен, если бы я занмался проектом фул-тайм, мне бы с лихвой хватило трех-четырех недель на доведения проекта с нуля до того состояния которое есть сегодня.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Посмотреть на результат моих трудов и даже воспользоваться ими можно зайдя на сайт поддержки продукта. Ссылка на сайт: &lt;/span&gt;&lt;a href="http://orangeheap.blogspot.com/"&gt;http&lt;span lang="RU"&gt;://&lt;/span&gt;orangeheap&lt;span lang="RU"&gt;.&lt;/span&gt;blogspot&lt;span lang="RU"&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;span lang="RU"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;А теперь немного о том, как получилось то, что получилось, и, собственно, что же все таки получилось?&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;span lang="RU"&gt;***&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;В основу работы обфускатора &lt;/span&gt;Orange Heap &lt;span lang="RU"&gt;положен фреймворк &lt;/span&gt;CCI&lt;span lang="RU"&gt; (&lt;/span&gt;Common Compiler Infrastructure &lt;span lang="RU"&gt;– &lt;/span&gt;&lt;a href="http://ccimetadata.codeplex.com/"&gt;http&lt;span lang="RU"&gt;://&lt;/span&gt;ccimetadata&lt;span lang="RU"&gt;.&lt;/span&gt;codeplex&lt;span lang="RU"&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;span lang="RU"&gt;) С помощью него осуществляется доступ к метаданным программы и производятся необходимые изменения. Для таких целей, помимо &lt;/span&gt;CCI &lt;span lang="RU"&gt;существует еще как минимум один доступный инструмент: &lt;/span&gt;Mono&lt;span lang="RU"&gt;.&lt;/span&gt;Cecil&lt;span lang="RU"&gt;. Однако мой выбор пал именно на &lt;/span&gt;CCI&lt;span lang="RU"&gt;. Я не знаю лучше ли он чем &lt;/span&gt;Mono&lt;span lang="RU"&gt;.&lt;/span&gt;Cecil &lt;span lang="RU"&gt;и если лучше то чем. В тот момент, когда я только начинал заниматься проектом, для меня оба фреймворка былы чем-то неизвестным и в процессе выбора я руководствовался принципом «пальцем в небо». Единственное что я знал, так это то, что на базе &lt;/span&gt;Mono&lt;span lang="RU"&gt;.&lt;/span&gt;Cecil &lt;span lang="RU"&gt;уже существуют решения, в том числе и коммерческие, которые позволяют осуществлять обфускацию. Фреймворк &lt;/span&gt;CCI &lt;span lang="RU"&gt;был менее исследован, и отзывов о его использовании было гораздо меньше. Но, наверное, тот факт, что &lt;/span&gt;CCI &lt;span lang="RU"&gt;разрабатывался &lt;/span&gt;Microsoft Research&lt;span lang="RU"&gt; подтолкнул меня к выбору именно этого фреймворка.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Ну, хватит лирики, лучше продолжим дальше разговор об &lt;/span&gt;Orange Heap&lt;span lang="RU"&gt;. Продукт состоит из двух частей: консольное приложение и &lt;/span&gt;Windows&lt;span lang="RU"&gt;-приложение. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;С помощью &lt;/span&gt;Windows&lt;span lang="RU"&gt;-приложения, можно осуществлять конфигурацию процесса обфускации. Данный процесс конфигурации позволяет указать такие опции как: нужно ли переименовывать публичные элемента и неймспейсы, нужно ли зашифровывать строки, нужно ли склеивать защищаемые сборки в одну монолитную сборку. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Помимо этого можно указать каким образом должно осуществляться переименование элементов. На сегодняшний день существует две политики переименования: нечитаемые символы (&lt;/span&gt;Normal policy&lt;span lang="RU"&gt;) (в дизассемблере или рефлекторе такие имена будут отображаться в виде квадратиков) или имена вида &lt;/span&gt;a&lt;span lang="RU"&gt;1, &lt;/span&gt;a&lt;span lang="RU"&gt;2,.. &lt;/span&gt;a&lt;span lang="RU"&gt;14,.. &lt;/span&gt;a&lt;span lang="RU"&gt;445 (&lt;/span&gt;Developer policy&lt;span lang="RU"&gt;). Наличие двух политик переименования связано лишь с тем, что в процессе обфускации (не только с помощью &lt;/span&gt;Orange Heap &lt;span lang="RU"&gt;но и с любым другим обфускатором, в том числе и коммерческим) программа может сломаться и перестать работать так, как она работала до этого. Если такая ситуация произошла, значит, очевидно, нужно как-то изменить процесс обфускации (например запретить что-то переименовывать или шифровать) &amp;nbsp;и запустить его заново. Но в случае если все переменные, типы и методы отображаются в виде квардатиков – задача становится не очень тривиальной. В этом случае имеет смысл задавать имена в виде &lt;/span&gt;a&lt;span lang="RU"&gt;1, &lt;/span&gt;a&lt;span lang="RU"&gt;2, … Такие имена проще анализировать в процессе поломки программы средствами отладки. После того как причина поломки была устранена, можно вернуть «квадратики», обфусцировать программу и отдать ее на съедение врагам.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Помимо рассмотренных опций с помощью &lt;/span&gt;Windows&lt;span lang="RU"&gt;-приложения можно также указать какие элементы должны быть переименованы, а какие должны остаться нетронутыми, то же самое касается и шифрования строк – для каждого метода, типа и сборки в отдельности можно указать, где нужно шифровать строки, а где не нужно. После того как процесс конфигурирования завершен &lt;/span&gt;Windows&lt;span lang="RU"&gt;-приложение может запустить процесс обфускации на основании полученной конфигурации. При желании эту самую конфигурацию можно сохранить в конфигурационный файл. В этом случае ей можно будет воспользоваться в другой раз для запуска процесса обфускации без необходимости конфигурировать процесс еще раз. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Консольное приложение не имеет возможности конфигурировать процесс обфускации и может только использовать конфигурационный файл полученный в процессе конфигурации с помощью &lt;/span&gt;Windows&lt;span lang="RU"&gt;-приложения. Для эстетов конечно, есть и тернистый путь – можно самому вручную создать или отредактировать конфигурационный файл, благо – это обыкновенный &lt;/span&gt;xml&lt;span lang="RU"&gt;-файл, а &amp;nbsp;в документации &lt;/span&gt;Orange Heap &lt;span lang="RU"&gt;присутствует описание его формата. Однако, мне кажется, что &lt;/span&gt;Windows&lt;span lang="RU"&gt;-приложение позволяет достаточно гибко осуществлять настройку процесса обфускации и вручную править конфигурауционный файл имеет смысл только если очень чешутся руки.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;В процессе обфускации &lt;/span&gt;Orange Heap &lt;span lang="RU"&gt;формирует файл-отчет – в котором содержится информация о старом и новом имени переименованного элемента. В данный момент эта инфорамция из файла будет полезна при анализе и исправлении возникающих проблем в обфусцированной программе. Однако я не исключаю того, что в будущем (и только в том случае если у меня дойдут руки до реализации подобной функциональности) данный файл может быть полезен при осуществлении де-обфускации. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;В данный момент &lt;/span&gt;Orange Heap &lt;span lang="RU"&gt;поддерживает обфускацию &lt;/span&gt;WinForm&lt;span lang="RU"&gt;-приложений. По крайней мере в процессе предрелизного тестирования я успешно и беспрепятственно смог обфусцировать несколько достаточно больших &lt;/span&gt;WinForm&lt;span lang="RU"&gt;-приложений. Если какие-то вопросы с обфускаций &lt;/span&gt;WinForm&lt;span lang="RU"&gt; существуют - я буду очень рад о них узнать. Пока же никто мне подобной информации не предоставил. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;WPF/Silverlight – &lt;span lang="RU"&gt;пока&lt;/span&gt;&lt;span lang="RU"&gt; &lt;/span&gt;terra incognita &lt;span lang="RU"&gt;для&lt;/span&gt;&lt;span lang="RU"&gt; &lt;/span&gt;Orange Heap. &lt;span lang="RU"&gt;Если хотите проверить - даже не пытайтесь. Все равно ничего не получится. Но я не думаю что это большая проблема. Ведь по правилам хорошего тона &lt;/span&gt;UI &lt;span lang="RU"&gt;и логика должны быть разделены. Поэтому можно просто &lt;/span&gt;XAML &lt;span lang="RU"&gt;поместить в одну сборку – логику в другую. В этом случае сборку с логикой можно безболезнено обфусцировать, защитив тем самым вашу интеллектуальную собственность. Собственно сам &lt;/span&gt;Orange Heap &lt;span lang="RU"&gt;так обфусцирован с помощью самого себя (&lt;/span&gt;Windows&lt;span lang="RU"&gt;-приложение базируется на &lt;/span&gt;WPF&lt;span lang="RU"&gt;).&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Хорошая новость заключается в том, что несмотря на то, что подобную ситуацию можно решить описанным выше способом, я все же планирую добавить поддержку &lt;/span&gt;WPF&lt;span lang="RU"&gt;/&lt;/span&gt;Silverlight&lt;span lang="RU"&gt;. Реализация этой функциональности только лишь дело времени.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Вот пожалуй и все об &lt;/span&gt;Orange Heap&lt;span lang="RU"&gt;. Надеюсь данная статья вызвала интерес и вы обязательно посмотрите как он работает на деле. &lt;/span&gt;Orange Heap &lt;span lang="RU"&gt;– абсолютно бесплатный, поэтому не медлите, заходите на сайт поддержки, скачивайте и пользуйтесь. И, разумеется, пишите письма. Ведь только с помощью ваших отзывов я смогу узнать о наличии проблем и попытаться их исправить, а также сделать продукт более удобным и функциональным. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-1127201154532383900?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/1127201154532383900/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=1127201154532383900' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/1127201154532383900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/1127201154532383900'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2011/10/orange-heap-net.html' title='Orange Heap - Еще один бесплатный обфускатор для .NET'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-2783611844777504277</id><published>2011-09-28T13:13:00.000+02:00</published><updated>2011-09-28T13:13:57.545+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='obfuscation'/><title type='text'>Как работают обфускаторы. Дополнительные возможности</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0in; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Введение&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В предыдущих&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;двух статьях я рассказывал о том, как работают обфускаторы. Были рассмотрены методы и приемы, которые используются ими для переименования различных символов программы и для шифрования строк и ресурсов. Далее я привел простейшие примеры нелинейного преобразования кода, которые предназначены для изменения порядка следования инструкций программы. Такие преобразования делали более сложным восприятие кода и практически невозможным преобразование его к исходнму варианту. Собственно все обфускаторы как правило и отличаются качеством подобных преобразований. Чем лучше и качественнее данные преобразования осуществляются, тем выше качество защиты обфусцированного кода и соответственно больше ценится тот или иной обфускатор.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Вместе с тем, нынешние средства обфускации имеют в своем арсенале и ряд других возможностей, которые не связаны непосредственно с такими преобразованиями, а предназначены прежде всего для повышения удобства работы с инструментом и предоставления пользователю дополнительных вспомогательных функций. Как раз о таких возможностях и пойдет речь в данной статье.&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Обработка зависимостей&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В самом простейшем случае приложение, которое требуется защитить состоит из одного файла – единственного исполняемого &lt;/span&gt;exe&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;-модуля. В данном случае при обфускации, как правило, не возникает никаких вопросов – от обфусцированного модуля никто больше не зависит, соответственно все символы (типы, поля, методы, интерфейсы, и т.д.) могут быть беспрепятственно переименованы, в том числе и те которые, имеют публичную область видимости, то есть помеченные как &lt;/span&gt;public&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В случае если защищаемый продукт состоит из нескольких составляющих, скажем, главного исполняемого модуля и двух-трех подключаемых &lt;/span&gt;dll&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;-библиотек, ситуация немного меняется. Дело в том, что безболезненно переименовать все символы без дополнительных действий не получится. И если с приватными (&lt;/span&gt;private&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;) или внутренними (&lt;/span&gt;internal&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;) символами, которые используются только внутри данной сборки проблем по прежнему нету – их можно переименовывать без оглядки на всю остальную систему, то с публичными элементами такой подход неприемлем. Связано это с тем, что одна сборка, которая использует некоторые типы другой, ничего не знает об актуальном именовании типов импортируемой сборки. При связывании на этапе компиляции все имена импортируемых типов сохраняются в специальную таблицу. Позже, в процессе выполнения программы, все обращения к импортируемым типам будут осуществлятся с использованием этой таблицы. А поскольку в сборке, где эти типы объявлены, в процессе обфускации имена этих типов были переименованы, то получить информацию о типе по страму имени будет невзоможно, и в итоге мы получим исключение, информирующее о том, что запрашиваемый тип не найден. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Различные обфускаторы решают подобную проблему различными способами. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Самый простой&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;способ – превентивный. Это значит обфускаторы либо не позволяют изменять имена публичных символов, либо в ультимативной форме делать это крайне не рекомендуют. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Следующий способ – также предполагает решение в лоб. Суть его заключается в том, что прежде чем осуществлять переименование типов, все сборки приложения скливаются в одну. То есть вместо одного исполняемого модуля и нескольких подключаемых, получим один исполняемый модуль, который содержит все типы. После этого процесс обфускации можно проводить точно также, как это было в самом простейшем случае, когда имеется только один файл. Такой способ часто называют склеиванием зависимостей (&lt;/span&gt;Dependencies Merging&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;)&lt;/span&gt;.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Третий способ (и последний в этом обзоре) - самый корректный. Он предполагает обновление таблицы имен импортируемых символов. В данном случае после того, как все типы подключаемого модуля были переименованы, осуществляется обновление таблицы импорта исполняемого модуля, в процессе которого старые имена импортируемых символов заменяются на новые. Такой процесс преобразований получил название &lt;/span&gt;Inter&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;-&lt;/span&gt;Assembly&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;или &lt;/span&gt;&lt;/span&gt;Cross&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Assembly&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;обфускации. Подобный вид обработки зависимостей обладает рядом преимуществ, по сравнению с предыдущими. Так, он позволяет осуществлять более глубокую обфускацию, и вместе с тем не нарушать исходную структру приложения. Это особенно актуально когда к примеру приложение состоит не из одного исполняемого файла а из двух или трех, которые совместно используют подключаемые модули. В таком случае склеивание зависимостей невозможно и стало быть рассматриваемый вид обработки зависимостей&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;- единственный способ обфусцировать публичные символы подключаемого модуля.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Защита от реверс-инжиниринга и модификаций&lt;/span&gt;&lt;/h1&gt;&lt;h2&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Защита от дизассемблирования&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Несмотря на то, что в процессе обфускации структура исполняемого кода программы претерпела серьезные изменения, полученный в результате код все равно является уязвимым для несанкционированного изучения и реверс-инжиниринга. Для этого даже не нужно каких-то специализированных инструментов и знаний. Достаточно открыть исполняемый файл с помощью так называемого рефлектора или дизассемблера. Конечно же, былой очевидности исполняемого кода уже нету, однако если очень нужно исследовать некоторый алгоритм – то это не составит большого труда, Несколько часов анализа кода и цель достигнута. Для более подготовленного злоумышленника достаточно будет десятка минут. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Что бы обезопасить себя от подобных ситуаций, необходимо сделать невозможным загрузку анализируемого исполняемого модуля подобными средствами. Существуют различные варианты реализации подобного защитного механизма. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Одним из простых вариантов является вставка в тело каждого метода дополнительного фрагмента кода, который содержит некоторую некорректную или несуществующую инструкцию. При загрузке метода, у которого добавлен такой фрагмент, дизассемблер не сможет распознать эту инструкцию и соответственно не сможет загрузить тело метода для анализа злоумышленником. А для того, что бы данная инструкция не влияла на процесс выполнения программы ее следует оградить инструкциями безусловных переходов таким образом, что бы она никогда не смогла получить управление.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Более продвинутый способ может выглядеть следующим образом. Код метода шифруется с помощью некоторого алгоритма шифрования и результат шифрации помещается либо в ресурсы, либо вовсе в отдельный &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;файл. Исходное тело метода замещается кодом некоторого загрузчика, который знает где находится зашифрованный фрагмент кода и способ как его расшифровать. При вызове такого метода загрузчик получает управление, он дешифрует реальный код, и выполняет его. Таким образом при дезассемблировании исследовать этот код будет абсолютно невозможно.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Защита от модификаций&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Некоторые обфускаторы предоставляют функциональность, которая способна защитить приложение от модификаций. Такой механизм часто называют &lt;/span&gt;tamper&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;protection&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;или &lt;/span&gt;&lt;/span&gt;tamper&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;defense&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. В этом случае программа будет корректно выполнятся только в том случае если они не была изменена злоумышленником. Если какие то изменения были – программа просто перестанет работать, либо будет выводить некоторое сообщение о недопустимости использования модифицированной программы. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Для того что бы реализовать подобную функциоанльность используется подписывание (&lt;/span&gt;watermarking&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;) исполняемых и подключаемых модулей. Алгоритм подписывания может быть любой. Это может быть и стандартное подписывание (&lt;/span&gt;signing&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;assembly&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;with&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;a&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;strong&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;name&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;) или же некоторый другой алгоритм, основанный на &lt;/span&gt;CRC&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;или &lt;/span&gt;&lt;/span&gt;MD&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;5. Суть такого алгоритма заключается в том, что перед выполнением программы осуществляется анализ существующего кода, в процессе которого на основании существующих инструкций кода формируется некоторое числовое значение или иными словами так называемый хэш, который впоследствии сравнивается с эталонным. Если модификаций не было, эти хеши будут идентичны, если же хеши отличаются – явный признак того, что код был модифицирован. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Кроме того подписывание, может использоваться не только для отслеживания модификации кода, но и для скрытой идентифиакции или маркировки конкретного экземпляра приложения. Подобная маркировка может &lt;span class="hps"&gt;помочь&lt;/span&gt; &lt;span class="hps"&gt;выявить&lt;/span&gt; &lt;span class="hps"&gt;факт несанкционированного использования&lt;/span&gt; &lt;span class="hps"&gt;приложения и&lt;/span&gt; &lt;span class="hps"&gt;определить&lt;/span&gt; &lt;span class="hps"&gt;его владельца, на который рарегистрирована покупка данного экземпляра приложения.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Способы конфигурации и пользовательский интерфейс&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Немалое значение в популярности того или иного обфускатора играет удобство его использования, а также гибкость и интуитивность конфигурации процесса обфускации. Из всех вариантов конфигурирования можно выделить три основных подхода.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Первый подход предполагает наличие специального конфигурационного файла и возможности только ручного конфигурирования процесса обфускации. В этом случае придется изучать формат конфигурационного файла и вручную в текстовом редакторе осуществлять настройку процесса обфускации. Процесс достаточно сложен и утомителен, особенно в случае необходимости конфигурирования большой системы с огромным количеством различных правил.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Следующий подход основан на использовании &lt;/span&gt;Windows&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;приложения для конфигурации процесса обфускации. В данном случае пользователю не нужно владеть знаниями о формате конифигурационного файла, ему достаточно указать, какие опции защиты должны быть активны и правильно настроить правила преобразований для защищаемых модулей, их типов и составных частей.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Третий вариант основан на декларативном конфигурировании защищаемого кода с помощью специальных аттрибутов. Суть данного подхода заключается в том, что на этапе разработки определенным модулям, типам и их составным частям присваиваются специальные аттрибуты, которую содержат информацию о том, как нужно обрабатывать данный элемент в процессе обфускации. Для того, что бы унифицировать процесс декларативного конфигурирования в фреймворке .&lt;/span&gt;NET&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;уже существуют такие аттрибуты. К ним относятся System.Reflection.ObfuscateAssemblyAttribute и System.Reflection.ObfuscationAttribute. Первый предназначен для задания параметров конфигурации для заданной сборки, второй – для конкретного типа или его составных частей. Более подробную информацию об этих аттрибутах можно посмотреть в &lt;/span&gt;&lt;/span&gt;MSDN&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Идеальным обфускатором с точки зрения способов конифигурации процесса обфускации можно считать обфускатор, который позволяет осуществлять конфигурацию всеми тремя способами. Однако на практике такое встречается нечасто, и в большинстве случаев приходится довольствоваться меньшими возможностями. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Помимо гибкости конфигурирования процесса обфускации огромным плюсом будет наличие коммандной строки. Это позволит использовать обфускатор в автоматизированных сценариях, например при создании очередного билда или построении инсталяционного пакета. &lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Завершение&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В данной статье мы рассмотрели существующие варианты обработки зависимостей, когда защищаемое приложение состоит из нескольких модулей, которые связаны между собой. Далее были рассмотрены наиболее распространенные варианты защиты приложения от дизассемблирования и модификаций. И наконец был дан беглый обзор возможных способов конфигурирования процесса обфускации и вариантов поставки обфускатора конечному пользвателю. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Разумеется, в статье я рассмотрел далеко не все, а лишь только самые базовые особенности, присущие большинству существующих обфускаторов. Для того что бы получить больше информации, обращайтесь к документации конкретных обфускаторов или к другим публикациям по данной тематике.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-2783611844777504277?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/2783611844777504277/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=2783611844777504277' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/2783611844777504277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/2783611844777504277'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2011/09/blog-post.html' title='Как работают обфускаторы. Дополнительные возможности'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-2512917926861726602</id><published>2011-08-25T15:32:00.000+02:00</published><updated>2011-08-25T15:32:46.379+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='obfuscation'/><title type='text'>Как работают обфускаторы. Изменения внутренней логики</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable	{mso-style-name:"Table Normal";	mso-tstyle-rowband-size:0;	mso-tstyle-colband-size:0;	mso-style-noshow:yes;	mso-style-priority:99;	mso-style-qformat:yes;	mso-style-parent:"";	mso-padding-alt:0in 5.4pt 0in 5.4pt;	mso-para-margin-top:0in;	mso-para-margin-right:0in;	mso-para-margin-bottom:10.0pt;	mso-para-margin-left:0in;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:"Times New Roman";	mso-fareast-theme-font:minor-fareast;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;}&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;&lt;h1 style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Введение&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В прошлой статье я рассказывал о самых базовых возможностях инструментов обфускации: переименовании типов и их составных частей и шифровании строк и ресурсов программы. Такие приемы могут быть эффективными и сами по себе в простейших случаях, однако они не способны защитить секретные алгоритмы и важные части программы, поскольку весь порядок следования инструкций в коде остался такой же как и был ранее. Да, если обыкновенный неподготовленый зевака откроет обфусцированную программу рефлектором или дизассемблером, то он ничего не сможет разобрать и почти наверняка слегка растроившись прекратит свои попытки понять, как там все внутри устроено. Но если же это более подготовленый человек, которому уж очень нужно разобраться с вашим кодом и он готов потратить на это свое время, то ему не составить труда проследить порядок выполнения инструкций вашей программы.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Сегодня мы пойдем дальше и постараемся разобраться с более сложными приемами, которые своей основной целью ставят изменение логики программы. После подбных преобразований разобраться с вашим кодом будет подсилу разве что матерым проффесионалам. Да и им уже придется изрядно попотеть. К слову, защитить свою программу на 100% абсолютно ото всех – это увы, задача нереализуемая, так как еще не существует такого решения, ни для .&lt;/span&gt;NET&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, ни для неуправляемого кода, которое позволило бы полностю обезопасить прогрммные продукты от взлома и несанкционированного доступа к коду. В наше время ломается все, другой вопрос – какой ценой.&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Обфускация данных&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Обфускация данных подразумевает изменения структуры переменных используемых в программе а также способов их использования. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Первым вариантом обфускации данных может служить &lt;u&gt;изменение видимости переменной&lt;/u&gt;. Так, локальная переменная используемая в коде, может быть преобразована в глобальную переменную, либо поле класса, содержащего данный метод, либо вовсе в публичное поле отдельного вспомогательного класса, который может быть сгенерирован в процессе обфускации программы. В таком случае, для того что бы проследить использование данной переменной в коде, необходимо будет потратить больше времени на определение места объявления этой переменной. Если же переменная будет представлена в виде публичного поля отдельного класса, то в процессе реверс-инжиниринга необходимо будет дополнительно осуществлять проверку где оно еще используется в пределах всей программы. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Более продвинутым методом обфускации является &lt;u&gt;изменение структуры переменных&lt;/u&gt;. Этот метод подразумевает к примеру преобразование двумерного массива к одномерному где это допустимо и наоборот. Такие преобразования усложняют восприятие кода и затрудняют реверс инжиниринг. Также можно осуществить разбивку скалярной переменной на две или более. Допустим и обратный процесс – склеивание нескольких переменных в одну. Для большей ясности можно рассмотреть пример разбивки переменной на несколько. На листинге 1 представлен некоторый метод, который в цикле выводит значения от 1 до 10. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг&lt;/span&gt; 1.&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;char&lt;/span&gt;[] array = ...;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;i&lt;/b&gt; = 1;&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; k = 10;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;while&lt;/span&gt; (&lt;b&gt;i&lt;/b&gt; &amp;lt; k)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(array[&lt;b&gt;i&lt;/b&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;b&gt;i&lt;/b&gt; ++;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Для того что бы затруднить восприятие логики программы, достаточно перменную &lt;/span&gt;i&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;разделить на две переменные &lt;/span&gt;&lt;/span&gt;i&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;и &lt;/span&gt;&lt;/span&gt;j&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, каждая из которых будет инкрементироваться в своем цикле. После подобных преобразований получим код, представленный на листинге 2.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг&lt;/span&gt; 2.&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;char&lt;/span&gt;[] array = ...;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;i&lt;/b&gt; = 0;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; k = 5;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;while&lt;/span&gt;(&lt;b&gt;i&lt;/b&gt; &amp;lt; 2)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;j&lt;/b&gt; = 1;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;while&lt;/span&gt;(&lt;b&gt;j&lt;/b&gt; &amp;lt;= k)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(array[&lt;b&gt;i&lt;/b&gt; * k + &lt;b&gt;j&lt;/b&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;j&lt;/b&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;++;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;i&lt;/span&gt;&lt;/b&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;++;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В случае использования переменных в качестве счетчика для цикла можно использовать так называемое &lt;u&gt;кодирование данных&lt;/u&gt;, которое добавляет дополнительные инструкции для вычисления значения счетчика. Можно рассмотреть данный метод обфускации на примере. В качестве исходного кода возьмем фрагмент представленный на листинге 1, на листинге 3 – код, полученный в результате преобразований.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг 3.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;char&lt;/span&gt;[] array = &lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;...&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;i&lt;/b&gt;=11;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; k = 83;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;while&lt;/span&gt; (&lt;b&gt;i&lt;/b&gt; &amp;lt; k) &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(array[(&lt;b&gt;i&lt;/b&gt; - 3) / 8]);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;b&gt;i&lt;/b&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt; += 8;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Обфускация кода&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Помимо обфускации данных, существует обфускация кода или обфускация следования управляющих инструкций (&lt;/span&gt;control&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;flow&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;obfuscation&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;). Данный вид преобразований предназначен для усложнения восприятия кода защищаемого метода. Как правило все преобразования данного типа подразумевают добавление либо инструкций переходов, предназначенных на запутывание порядка выполнения инструкций, либо всевозможных вспомогательных методов и типов, которые получают управление в процессе выполнения программы. Рассмотрим наиболее распространенные преобразования.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;u&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Добавление запутывающих ветвлений программы&lt;/span&gt;&lt;/u&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Принцип данных преобразований основан на том, что в оригинальный код добавляются инструкции переходов. Рассмотрим ситуацию на примере. После осуществления преобразований кода из листинга 1 получим код, представленный на Листинге 4.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг&lt;/span&gt; 4.&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;char&lt;/span&gt;[] array = &lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;...&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;i&lt;/b&gt; = 1;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; k = 10;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;while&lt;/span&gt; (&lt;b&gt;i&lt;/b&gt; &amp;lt; k)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; j = 10 - &lt;b&gt;i&lt;/b&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;(j &amp;gt; k)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"error"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;i&lt;/b&gt; = 1;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(array[&lt;b&gt;k - j&lt;/b&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;i&lt;/b&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;++;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Если внимательно посмотреть на этот фрагмент, то можно обратить внимание, что выражение &lt;/span&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;if&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;(&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;j&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt; &amp;gt; &lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;k&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;)&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; всегда будет ложно и фрагмент кода, относящийся к этому условию, никогда не выполнится. Такие блоки кода часто называют мертвым кодом (&lt;/span&gt;Dead&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;code&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;). Основное их предназначение заключается в отвлечении внимания, человека, занимающегося реверс-инжинирингом. Другая ветвь ничем не отличается от исходной из листинг 1, за тем исключением, что вместо &lt;/span&gt;&lt;b&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;i&lt;/span&gt;&lt;/b&gt;&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;используется &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;k&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;– &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;j&lt;/span&gt;&lt;/b&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Если посмотреть внимательно на код, то несложно прийти к выводу, что это выражение всегда будет эквивалентно &lt;/span&gt;&lt;b&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;i&lt;/span&gt;&lt;/b&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Итак, после преобразований был получен код, имеющий на первый взгляд мало общего с исходным кодом, однако выполняющего в точности ту же самую работу.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;u&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Добавление классов-оберток для сокрытия вызовов методов стандартных типов&lt;/span&gt;&lt;/u&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Даже после преобразований выполненых ранее, код по прежему остается читаемым. Причиной этому является использование метода &lt;/span&gt;&lt;span style="color: darkblue; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;Console&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: darkcyan; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;WriteLine&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, который переименовать как-то нету никакой возможности, так как это стандартный класс. Для того, что бы запутать код еще больше, можно создать прокси-класс, который иначе называется &lt;/span&gt;Dynamic&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Proxy&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Он будет инкапсулировать в себе вызовы метода &lt;/span&gt;&lt;span style="color: darkblue; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;Console&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: darkcyan; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;WriteLine&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Листинг 5 содержит реализацию класса.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг&lt;/span&gt; 5.&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;internal&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: darkblue;"&gt;llI&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: darkcyan;"&gt;Il&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt; s)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(s);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: darkcyan;"&gt;Il&lt;/span&gt;(&lt;span style="color: blue;"&gt;char&lt;/span&gt; c)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;span style="color: darkblue; font-family: Consolas; font-size: 9.5pt;"&gt;Console&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: darkcyan; font-family: Consolas; font-size: 9.5pt;"&gt;WriteLine&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;(&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;c&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Теперь можно везде, где необходимо вызов метода &lt;/span&gt;&lt;span style="color: darkblue; font-family: Consolas; font-size: 9.5pt;"&gt;Console&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: darkcyan; font-family: Consolas; font-size: 9.5pt;"&gt;WriteLine&lt;/span&gt;&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;заменить на вызов метода прокси &lt;/span&gt;&lt;/span&gt;&lt;span style="color: darkblue; font-family: Consolas; font-size: 9.5pt;"&gt;llI&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: darkcyan; font-family: Consolas; font-size: 9.5pt;"&gt;Il&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. В результате фрагмент из листинга 4, превратиться в фрагмент представленный на листинге 6. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг&lt;/span&gt; 6.&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;char&lt;/span&gt;[] array = ar;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;i&lt;/b&gt; = 1;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;int&lt;/span&gt; k = 10;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;while&lt;/span&gt; (&lt;b&gt;i&lt;/b&gt; &amp;lt; k)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; j = 10 - &lt;b&gt;i&lt;/b&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;(j &amp;gt; k)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;llI&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;Il&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"0xFF"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;i&lt;/b&gt; = 1;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;llI&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;Il&lt;/span&gt;(array[k - j]);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;i&lt;/b&gt;++;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Подобные прокси отлично скрывают «настоящие» вызовы. Они могут использоваться не только со стандартными типами, но и с пользовательскими, или даже с другими прокси-объектами, создавая иерархии прокси-вызовов. Используя в комбинации приемы прокси-объектов и ветвлений можно добится невероятных результатов обфускации кода. Код полученный в результате будет очень сложен для восприятия, особенно учитывая тот факт, что названия всех методов и классов также будут в преобразованы к нечитаемому виду. Главное в этом деле не переусердствовать и вовремя остановится, так как необходимо помнить что с введением каждого нового прокси-объекта, защищаемая нами программа теряет в производительности, так как увеличивается количество избыточных вызовов и используемая глубина стека выполнения программы.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;u&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Добавление новых типов для сокрытия данных используемых в программе&lt;/span&gt;&lt;/u&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Данный тип преобразований сочетает в себе обфускацию и кода и данных. Его предназначение – запутать некоторый код, который по входным данным получает в результате новые данные, которые необходимы для дальнейшего выполнения прграммы. Для ясности, рассмотрим пример, который изображен на листинге 7.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг 7.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;switch&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;(&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;c&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;case&lt;/span&gt; 0x00FF0000:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Red Color"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;case&lt;/span&gt; 0x0000FF00:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Green Color"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;case&lt;/span&gt; 0x000000FF:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Blue Color"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: blue;"&gt;case&lt;/span&gt; 0x00FFFFFF:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;Console&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"White Color"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Этот код по числовому значению &lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;c&lt;/span&gt;&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;определяет текстовое описание цвета и печатает его на консоль. Суть рассматриваемого преобразования заключается в создании нового типа, основной задачей которого будет для каждого значения входных данных ( в нашем случае это переменная &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;c&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;) получить соответствующие выходные данные (в нашем случае – текстовое название цвета). Реализация нового типа представлена на Листинге 8.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинг 8.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;internal&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt; &lt;/span&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;class&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt; &lt;/span&gt;&lt;span style="color: darkblue; font-family: Consolas; font-size: 9.5pt;"&gt;IIl&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;private&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;uint&lt;/span&gt;[] &lt;span style="color: purple;"&gt;_I&lt;/span&gt; = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;uint&lt;/span&gt;[] { 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00FFFFFF};&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;[] &lt;span style="color: purple;"&gt;_l&lt;/span&gt; = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { &lt;span style="color: #a31515;"&gt;"Red"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Green"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Blue"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"White"&lt;/span&gt; };&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; &lt;span style="color: darkcyan;"&gt;ll&lt;/span&gt;(&lt;span style="color: blue;"&gt;uint&lt;/span&gt; c)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;var&lt;/span&gt; i = &lt;span style="color: darkblue;"&gt;Array&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;IndexOf&lt;/span&gt;(&lt;span style="color: purple;"&gt;_I&lt;/span&gt;, c);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;return&lt;/span&gt; i &amp;gt;= 0 ? &lt;span style="color: purple;"&gt;_l&lt;/span&gt;[i] : &lt;span style="color: blue;"&gt;string&lt;/span&gt;.&lt;span style="color: purple;"&gt;Empty&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: RU;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Теперь, используя данный клас можно переписать код, как показано на Листинге 9.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Листинге 9.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;var&lt;/span&gt; I = &lt;span style="color: darkblue;"&gt;IIl&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;ll&lt;/span&gt;(c);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&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="color: blue;"&gt;if&lt;/span&gt;(!&lt;span style="color: blue;"&gt;string&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;IsNullOrEmpty&lt;/span&gt;(I))&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&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; &lt;/span&gt;&lt;span style="color: darkblue;"&gt;llI&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;Il&lt;/span&gt;(I + &lt;span style="color: #a31515;"&gt;" Color"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Обращаю внимание, что в данном примере мы воспользовались &lt;/span&gt;Dynamic&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Proxy&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;из листинга 5 для сокрытия вызова метода &lt;/span&gt;&lt;/span&gt;&lt;span style="color: darkblue; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;Console&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: darkcyan; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;WriteLine&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. В качестве дальнейшего запутывания кода можно добавить аналогичный &lt;/span&gt;Dynamic&lt;span style="mso-ansi-language: RU;"&gt; &lt;/span&gt;Proxy&lt;span style="mso-ansi-language: RU;"&gt; &lt;span lang="RU"&gt;для вызова метода &lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;string&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: RU;"&gt;.&lt;/span&gt;&lt;span style="color: darkcyan; font-family: Consolas; font-size: 9.5pt; line-height: 115%;"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;, а также осуществить переименование всех переменных и шифтрацию строк. После этого уж наверняка будет не очевидно что на самом деле он реализует функцуиональность кода из листинга 7.&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Способы отпимизации&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;После всех этих преобразований, код действительно становится намного запутаннее, чем это было сразу после переименования полей и шифрования строк. Что бы в нем разобраться, теперь придется изрядно потрудится. К сожалению, платой за добавленную сложность стало увеличение размера кода, которое произошло за счет добавления новых типов, дополнительных инструкций переходов и мертвого кода и падения скорости приложения ввиду добавления необходмости вызовов прокси-методов.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В целях возмещения подобных издержек в большинстве обфускаторов применяется ряд преобразований направленных на оптимизацию размера и скорости выполнения кода. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Так, в целях повышения скорости работы программы часто применяется подход, называемый &lt;u&gt;запечатыванием типов&lt;/u&gt;. Он сводится к тому, что любой тип, который не имеет наследников помечается ключевым словом &lt;/span&gt;sealed&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;. Это может способствовать повышению производительности за счет уменьшения издержек при вызове методов такого типа.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Так же, одним из способов уменьшения размера программы может служить &lt;u&gt;удаление неиспользуемых фрагрментов кода&lt;/u&gt;. В процессе выполнения преобразований обфускатор может проанализировать всевозможные ветви выполнения кода и найти фрагменты, которые никогда не получат управление. Соответственно, они могут быть безболезненно удалены из программы. Это положительно отразится на размере программы.&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Заключение&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;После всех преобразований, которые были рассмотренных в этой и предыдущей статьях, код стал действительно трудно воспринимаемым и сложным для анализа. Строки и ресурсы зашифрованы, имена переменных, типов, их методов и полей приведены к неотображаемому виду, код методов также модифицирован, и теперь сложно определить что же в действительности он делает. Можно сказать, что наш код теперь защищен от несанкционированного использования и реверс-инжиниринга. Дальнейшие улучшения защиты возможны только посредством оптимизации рассмотренных приемов и более удачном комбинировании различных преобразований. Разумеется, существуют и более сложные паттерны модификаций, направленных на еще большее запутывание защищаемого кода, но ввиду большого количества таких приемов они не будут рассматриваться в нашем цикле.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;В следующей статье я расскажу о том, какие еще дополнительные возможности существуют у современных обфускаторов и как они реализованы.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-2512917926861726602?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/2512917926861726602/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=2512917926861726602' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/2512917926861726602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/2512917926861726602'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2011/08/blog-post.html' title='Как работают обфускаторы. Изменения внутренней логики'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-4513580709772998398</id><published>2011-07-29T11:15:00.001+02:00</published><updated>2011-07-29T11:18:54.155+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='obfuscation'/><title type='text'>Как работают обфускаторы. Переименование и Шифрование</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Это первая статья из цикла “Как работают обфускаторы”. Основной целью этой и последующих статей прежде всего является систематизация и описание возможностей современных обфускаторов. Я попытаюсь не только описать что в них реализовано, но и объяснить неискушенному читателю, зачем оно там и как оно все работает. Я приложу все усилия для того, что бы не загружать читателя трудновоспринимаемым текстом, сложносформулированными оборотами и выражениями. Для этого материал будет преподнесен в максимально простой и доступной форме. Однако в некоторых случаях без использования сложных терминов и выражений однозначно не обойтись. Я постараюсь сделать это настолько аккуратно, что бы на качество материала это не повлияло никоим образом.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;&amp;nbsp;Мне ближе всего платформа .&lt;/span&gt;NET&lt;span lang="RU"&gt;, поэтому при подготовке материала я рассматривал обфускаторы, предназначенные для защиты .&lt;/span&gt;NET&lt;span lang="RU"&gt;-кода. Ввиду этого в обзоре не будут учтены особенности, которые имеют место в обфускаторах предназначенных других областей, например для защиты кода скриптовых языков, таких как &lt;/span&gt;JScript&lt;span lang="RU"&gt;. Хотя вряд ли там присутствуют существенные отличия – основные возможности обфускаторов из разных областей мало чем отличаются друг от друга. Поэтому статья может оказаться полезной даже если вы абсолютно не знакомы с .&lt;/span&gt;NET&lt;span lang="RU"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;И еще один важный момент, на который я хочу обратить внимание, прежде чем мы пойдем дальше. Ни в этой статье, ни в последующих, насколько это будет возможно я постараюсь не упоминать явно или косвенно, какую то конкретную реализацию обфускатора, дабы не сделать из статьи рекламу того или иного продукта. Возможно в отдельных случаях это было бы и полезно – на живом примере объяснить или рассказать, как все то, о чем будет идти речь, устроено и работает. Однако я уверен, что качество материала от отсутствия подобных примеров если и пострадает, то незначительно. Если вам будет интересно узнать о существующих реализациях обфускаторов, вы наверняка сможете сами найти подобную информацию сами используя поисковую систему, или же обратившись к &lt;/span&gt;&lt;a href="http://sharcus.blogspot.com/2010/02/net.html"&gt;&lt;span lang="RU"&gt;моей публикации&lt;/span&gt;&lt;/a&gt;&lt;span lang="RU"&gt;, где был проведен небольшой обзор, какие обфускаторы существуют и что они умеют. Обзор уже не свежий, и сегодня наверняка появилось много других решений, которые в момент написания обзора были мною упущены из вида, поэтому отнеситесь к обзору только как к отправной точке и не более того.&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU"&gt;Введение&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Это первая статья из цикла “Как работают обфускаторы”. В ней я остановлюсь на базовых возможностях обфускаторов. Будут рассмотрены операции переименования и шифрования составных частей программы. Я постараюсь на понятых примерах рассказать, что присходит в процессе обфускации с кодом и его составляющими, и как модифицируются текстовые строки и ресурсы приложения в форму, сложную для визуального восприятия. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU"&gt;Итак, приступим.&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU"&gt;Переименование &lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Самой базовой возможностью обфускторов является переименование составных частей программы. Это, пожалуй, самое первое что приходит на ум, при упоминании термина обфускация. И, возможно, самое важное. Другой термин, которым называется процесс переименования - &lt;/span&gt;&lt;b&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;Name&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;mangling&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;. Основной задачей процесса является приведения названия переменных, классов и их составляющих к форме, которая как минимум не позволила бы понять их предназначение, а максимум – лишила бы возможность визуально проследить использование данного объекта в коде. &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;Предназанчение переменной, как правило проще всего определить по ее названию – стало быть преназначение переменной &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;itemCount&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; &lt;span lang="RU"&gt;говорит само за себя – эта переменная предназначена для хранения количества некоторых элементов, а вот предназначение &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;aabc&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; – не настолько понятно. Стало быть в самом простейшем случае изменение имени &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;itemCount&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; на &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;aabc&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; уже уменьшает восприятие кода, хотя проследить использование переменной и выяснить для чего она используется не так уж и сложно.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;Однако, если взять пять различных переменных, например &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;itemCount&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;firstItem&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;lastItem&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;currentItem&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;items&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; &amp;nbsp;и переименовать их скажем вот так: &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;IIli&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;lilI&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;IiIl&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;iilI&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;Illl&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; &lt;span lang="RU"&gt;– то задача не кажется такой простой – названия переменных стали трудно различимы между собой и теперь нужно хорошенько напрячь зрение и внимание, что бы проследить использование каждой из переменных.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;В действенности приведенного преобразования вы можете убедится изучив листинги, &amp;nbsp;приведенные ниже. В первом листинге показана реализация некоторго метода до преобразований, во втором - тот же метод, но после модификации.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;Листинг&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; 1.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: darkblue;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; &lt;span style="color: darkcyan;"&gt;SampleMethod&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt; firstItem, &lt;span style="color: blue;"&gt;int&lt;/span&gt; lastItem, &lt;span style="color: darkblue;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; items)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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; filteredItems = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: darkblue;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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; itemsCount = items.&lt;span style="color: purple;"&gt;Count&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;i&lt;/b&gt; = 0; &lt;b&gt;i&lt;/b&gt; &amp;lt; itemsCount; &lt;b&gt;i&lt;/b&gt;++)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (items[&lt;b&gt;i&lt;/b&gt;] &amp;lt; firstItem || items[&lt;b&gt;i&lt;/b&gt;] &amp;gt; lastItem)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;continue&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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; filteredItems.&lt;span style="color: darkcyan;"&gt;Add&lt;/span&gt;(items[&lt;b&gt;i&lt;/b&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;return&lt;/span&gt; filteredItems;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;Листинг&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt; 2.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: darkblue;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; &lt;span style="color: darkcyan;"&gt;SampleMethod&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt; IIli, &lt;span style="color: blue;"&gt;int&lt;/span&gt; lilI, &lt;span style="color: darkblue;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; IiIl)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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; iilI = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: darkblue;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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; Illl = IiIl.&lt;span style="color: purple;"&gt;Count&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;IlIl&lt;/b&gt; = 0; &lt;b&gt;IlIl&lt;/b&gt; &amp;lt; Illl; &lt;b&gt;IlIl&lt;/b&gt;++)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (IiIl[&lt;b&gt;IlIl&lt;/b&gt;] &amp;lt; IIli || IiIl[&lt;b&gt;IlIl&lt;/b&gt;] &amp;gt; lilI)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;continue&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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; iilI.&lt;span style="color: darkcyan;"&gt;Add&lt;/span&gt;(IiIl[&lt;b&gt;IlIl&lt;/b&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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 lang="RU" style="font-family: Consolas; font-size: 9.5pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt;"&gt;&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="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;return&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;iilI&lt;/span&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;Можно пойти еще дальше, и в качестве имени переменной использовать неотображаемые символы. В таком случае вместо таких символов пользователь в зависимости от используемого инструмента будет либо видеть череду квадратов, либо вовсе ничего, пустоту на месте использования переменной. Согласитесь, выражение вида “&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt; . += ;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;” или “&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-weight: normal;"&gt;□□.□□+=□□□;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="RU" style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;"&gt;” любого поставит в тупик.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Еще одним приемом запутывания кода является приведения имени разных методов с различным набором аргументов к одному имени. Например имеется два метода: &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;AddItem&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;item&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;)&lt;/span&gt;&lt;span lang="RU"&gt; и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;GetItemByIndex&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;index&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;)&lt;/span&gt;&lt;span lang="RU"&gt;. Параметр первого метода –– это некоторый класс, параметр второго – целое число. Поскольку типы агрументов различные – оба метода могут вполне законно иметь одно и то же имя. И теперь после переименования методов и аргументов можно получить примерно следующее: &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;II&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Il&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;)&lt;/span&gt;&lt;span lang="RU"&gt; и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;II&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;lI&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;)&lt;/span&gt;&lt;span lang="RU"&gt;. Попробуйте догадайтесть что первый метод добавляет элемент, а второй возвращает по индексу. Если пойти и здесь немного дальше и тем же именем которым были названы методы, назвать переменные, классы и типы защищаемой программы (ну разумеется только в тех случаях где это допустимо) то задача усложниться до неузнаваемости. Обратите внимание на листинг 3 и все станет понятно, о чем идет речь.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Листинг 3.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: darkcyan;"&gt;a&lt;/span&gt;(&lt;span style="color: darkblue;"&gt;a&lt;/span&gt; b)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;while&lt;/span&gt; (b.&lt;span style="color: darkcyan;"&gt;a&lt;/span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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; &lt;span style="color: darkcyan;"&gt;a&lt;/span&gt; = b.&lt;span style="color: darkcyan;"&gt;a&lt;/span&gt;(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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; &lt;span style="color: darkcyan;"&gt;a&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;a&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&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; &lt;span style="color: darkcyan;"&gt;a&lt;/span&gt;(&lt;span style="color: darkcyan;"&gt;a&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&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;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Данный паттерн часто называют &lt;/span&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;Overload&lt;/i&gt;&lt;i style="mso-bidi-font-style: normal;"&gt; Induction&lt;/i&gt;&lt;span lang="RU"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Существующие обфускаторы используют все эти приемы. Вместе с этим во многих из них существует возможность выбора набора символов которые будут применятся при переименовании или задания паттерна имени для переименования.&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Обфускатор может осуществлять переименование либо всех классов и переменных приложения, либо только тех, которые не являются публичными, либо только тех элементов программы, которые указал пользователь перез запуском обфускации в процессе конфигурации процесса. При переименовании публичного метода можно нажить проблему, так как другие сборки проекта, использующие этот метод, никогда не смогут получить доступ к нему, поскольку они могут обратиться к методу только используя старое имя. Такая ситуация может быть просто и эффективно решена большинством обфускаторов, но о решении я расскажу в последующих статьях цикла, когда будет идти разговор о обработке зависимостей. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Некоторые обфускаторы помимо переименования переменных и классов могут осуществлять также переименования элементов разметки &lt;/span&gt;XAML&lt;span lang="RU"&gt;/&lt;/span&gt;BAML&lt;span lang="RU"&gt;. Сама разметка находится в ресурсах защищаемого приложения и она также может пролить свет на понимание злоумыленником того, как работает программа или хотя бы как устроены составные части программы, относящиеся к пользовательскому интерфейсу. В целом, при переименовани элементов разметки вполне подойдут приемы описанные выше, за тем исключением что для новых имен элементов вряд ли подойдут неотображаемые символы.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;В завершение необходимо добавить, что многие обфускаторы по окончанию обфускации при необходимости генерируют отчет, в котором содержится информация о переименованных элементах программы. Такой отчет может оказаться полезным как и для пользователя, если ему требуется осуществить отладку или исследовать обфусцированную программу, так и для самого обфускатора, поскольку некоторые из них умеют осуществлять деобфускацию. То есть осуществлять преобразования, обратные обфускации. Для таких целей им необходим сгенерированный ранее отчет, так как иначе обфускатор не будет иметь ни малейшего представления о первоначальном имени элемента.&lt;/span&gt;&lt;/div&gt;&lt;h1&gt;&lt;span lang="RU"&gt;Шифрование&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;После того как все необходимые элементы программы переименованы, задача исследования программы усложняется, однако по прежнему назвать ее сложно нельзя. Причиной тому, является тот факт, что все текстовые строки программы по прежнему присутствуют в коде в своем первозданном виде. Они являются замечательными помощниками в идентификации фрагментов программы, которые интересуют злоумышленников. Очевидно, что если где-то в коде встретилась строчка “&lt;/span&gt;Enter your password&lt;span lang="RU"&gt;”, будте уверены –&amp;nbsp; где-то рядом есть переменная, в которой этот самый введенный пользователем пароль и находится. Определив эту переменную, задача по обходу системы защиты, для которой этот пароль предназначен уже не выглядит такой сложной. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Для того что бы сделать жизнь злоумышленнику несколько сложнее, очевидно, что с текстовыми строками нужно что-то делать. Разные обфускаторы используют различные приемы и механизмы для защиты текстовых данных, однако среди всех этих приемов можно выделить общий принцип. Если кратко, то суть защиты сводится к замене текстовой строки в коде, на некоторый метод, который в качестве параметра получает предварительно зашифрованную исходную строку, дешифрует ее и в качестве результата возвращает исходную строку. То есть, если изначально было выражение вида:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;someString&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt; = “&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Some&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;text&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;”;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;То после всех преобразований обфускатора получим что то вроде:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Il&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt; = &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;ll&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;lIl&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;(“□□□□□□□□□”)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Где &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Il&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt; &lt;span lang="RU"&gt;– &lt;/span&gt;&lt;/span&gt;&lt;span lang="RU"&gt;это переименованая &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;someString&lt;/span&gt;&lt;span lang="RU"&gt;,&lt;/span&gt;&lt;span lang="RU"&gt; а&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;ll&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;lIl&lt;/span&gt; &lt;span lang="RU"&gt;– вызов метода дешифрации. В данном случае мы имеем дело со статическим методом &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;lIl&lt;/span&gt; &lt;span lang="RU"&gt;некоторго вспомогательного класса &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;ll&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;. &lt;/span&gt;&lt;span lang="RU"&gt;В качестве параметра метод получает предварительно зашифрованную строку, которая в процессе дешифрации станет эквивалентной исходной. &amp;nbsp;В самом простейшем случае данный метод может одновременно использоваться как для шифрации строки, так и для ее дешифрации. То есть если методу передать незашифрованную строку – он ее зашифрует и вернет зашифрованный эквивалент. Если передать методу зашифрованную строку, то на выходе получим исходную незашифрованный текст. Ниже на листинге 4 представлен один из возможных вариантов реализации такого метода. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Листинг&lt;/span&gt; 4.&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;public&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; &lt;span style="color: darkcyan;"&gt;Encrypt&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt; str)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; length = str.&lt;span style="color: purple;"&gt;Length&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; array = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;char&lt;/span&gt;[length];&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt; &lt;b&gt;i&lt;/b&gt; = 0; &lt;b&gt;i&lt;/b&gt; &amp;lt; array.&lt;span style="color: purple;"&gt;Length&lt;/span&gt;; &lt;b&gt;i&lt;/b&gt;++)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; c = str[&lt;b&gt;i&lt;/b&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; b = (&lt;span style="color: blue;"&gt;byte&lt;/span&gt;)(c ^ length - &lt;b&gt;i&lt;/b&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; b2 = (&lt;span style="color: blue;"&gt;byte&lt;/span&gt;)((c &amp;gt;&amp;gt; 8) ^ &lt;b&gt;i&lt;/b&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[&lt;b&gt;i&lt;/b&gt;] = (&lt;span style="color: blue;"&gt;char&lt;/span&gt;)(b2 &amp;lt;&amp;lt; 8 | b);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;.&lt;span style="color: darkcyan;"&gt;Intern&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;(array));&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="RU" style="font-family: Consolas; font-size: 9.5pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Если для шифрации использовать подобный метод, то тогда сам процесс шифрования текстовых строк в процессе обфускации сводится к последовательности действий описанной ниже.&lt;/span&gt;&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;span lang="RU"&gt;Сгенерировать и добавить в код защищаемой программы метод дешифрации.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU"&gt;Найти в коде инструкцию загрузки текстовой строки в стек.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU"&gt;Зашифровать строку.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU"&gt;Заменить в коде инструкцию загрузки строки на вызов метода дешифрации (пп.1), передав ему в качестве параметра зашифрованную строку которую мы получили в пп.2.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Эти действия необходимо выполнить для каждой строки используемой в коде. Вуаля! Не так уж все и сложно. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Однако есть один момент который потребует небольшой доработки, для того что бы наши изменения не нарушили работу всей программы. Проблема заключается в том, что выполнив преобразования, описанные выше, мы изменили суммарный объем кода каждого метода. Поясню. Инструкция загрузки текстовой строки занимает 5 байт: 1 байт – это сама инструкция и 4 байта – это адресс строки которую нужно загрузить. После преобразований у нас получится уже 10 байт: 1 байт – инструкция загрузки зашифрованной строки в стек, 4 байта – адрес этой строки, далее 1 байт интрукция вызова метода и наконец еще 4 байта, это собственно адрес этого метода.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Если в методе, где осуществляется сокрытие текстовых строк, присутствуют инструкции условных или безусловных переходов, то метод не будет работать так, как он работал ранее. Дело в том что адрес переходов указывается в форме смещения относительно начала метода, и после наших изменений, это значение будет указано неверно. Рассмотрим ситуацию на примере. На листинге 5 показана последовательность пседво-инструкций, которая была в программе изначально. Первая колонка это смещение инструкции относительно начала метода, вторая колонка – сама инструкция. Для простоты адрес смещения я указал в виде десятичного числа.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Листинг 5.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0000 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;instruction&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;_1 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;param&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0005 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;jump&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt; 0015&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0010 load_string “some string”&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0015 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;instruction&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;_2 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;param&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;После того, как мы произведем изменения необходимые для шифрования строки, получим последовательность, представленную на листинге 6.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Листинг 6.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0000 instruction_1 param&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0005 jump 0015&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0010 load_string [cryped_string]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0015 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;call&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;decrypt&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;_&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;method&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormalCxSpMiddle" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0020 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;instruction&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;_2 &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;param&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Как видим, после проведенной модификации смещение перехода указано неверно. И изза этого программа работать не будет. Для того что бы исправить ситуацию необходимо изменить смещение на актуальное значение, в данном случае это будет &lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;0020&lt;/span&gt;&lt;span lang="RU"&gt;. Подобную корректировку при необходимости следует осуществить для каждой инструкции перехода. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Принцип шифрования встроенных в программу ресурсов немного отличается от шифрования строк. Хотя суть та же. То есть сначала необходимо осуществить шифрование ресурса и заменить исходный ресурс зашифрованным аналогом. После этого необходимо произвести модификацию всех мест в коде, где осуществляется обращение к данному ресурсу. По аналогии со строками, вместо непосредственного обращения к ресурсу, необходмо осуществлять вызов метода, который выполнит дешифрацию и вернет уже расшифрованный ресурс. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;В одтельных случаях, когда в качестве ресурса использутеся файл *.&lt;/span&gt;bmp &lt;span lang="RU"&gt;или вовсе файл, представленный в текстовом формате, будет разумно предусмотреть в методе шифрации возможность сжатия ресурса. Таким образом будет осуществлена и защита ресурса от посторонних глаз и оптимизация программы в форме уменшения ее размера.&lt;/span&gt;&lt;/div&gt;&lt;h1 style="font-weight: normal;"&gt;&lt;b&gt;&lt;span lang="RU"&gt;Заключение&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU"&gt;Сегодня мы рассмотрели возможные приемы переименования элементов программы, которые используются в современных обфускаторах и получили общую картину того, как осуществляется шифрование тестовых строк и ресурсов в программе. Оба процесса являются неотъемлимой чертой любого обфукатора и предназначены для затруднения визуального восприятия кода. В следующей статье я расскажу о том, какие бывают паттерны изменения управляющей логики программы (&lt;/span&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;Control&lt;/i&gt;&lt;i style="mso-bidi-font-style: normal;"&gt; flow&lt;/i&gt;&lt;i style="mso-bidi-font-style: normal;"&gt; modification&lt;/i&gt;&lt;span lang="RU"&gt;). Эти паттерны подразумевают изменение следования инструкций, и предназначены для усложнения логического восприятия кода, делая процесс реверс-инжиниринга обфусцированной программы еще более сложным.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-4513580709772998398?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/4513580709772998398/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=4513580709772998398' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/4513580709772998398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/4513580709772998398'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2011/07/blog-post.html' title='Как работают обфускаторы. Переименование и Шифрование'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-5638305721358026596</id><published>2011-06-29T13:44:00.005+02:00</published><updated>2011-06-29T14:09:30.890+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='translates'/><category scheme='http://www.blogger.com/atom/ns#' term='obfuscation'/><title type='text'>Обфускация, взгляд изнутри</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;В данной статье я хочу рассмотреть существующие приемы по обфускации кода. Статья содержит анализ различных подходов, применяемых в процессе обфускации. Рассматриваемые приемы используются как для защиты интеллектуальной собственности, так и для сокрытия вредоносного кода от антивирусных сканеров. Дополнительно, обфускация может использоваться для защиты от внедрения вредоносного кода и всевозможных несанкционированных атак. Несмотря на то, что преобразования осуществляемые в процессе обфускации могут защитить код, они также имеют ряд ограничений, связанные в первую очередь с увеличением размера кода и падением общей производительности защищаемого продукта.&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span lang="RU" style="font-size: large;"&gt;Введение&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;В последнее десятилетие все большую долю рынка программного обчеспечения стали занимать программные продукты, рапространяемые в промежуточном архитектурно-независимом коде или иначе в байт-коде. Это спровоцировало увеличение рисков получения и несанкционированного использования исходного кода из исполняемых модулей. Подбная проблема беспокоит большое количество комапний-разработчиков программного обеспечения, они заинтересованы в защите своей интелектуальной собственности и своих продуктов от несанкционированного реверс-инжиниринга. Хотя закон об авторском праве и препятствует нелицензионному использованию программного продукта, разработчики обеспокоены возможностью воровства проприетарных структур данных и алгоритмов. Несмотря на наличие некоторых методов защиты программных продуктов, таких как шифрование, выполнение на стороне сервера и использование машинного кода, обфускация является пожалуй самым дешевым и простым способом решения данной проблемы [6]. Обфускация кода – это процесс создания нечитаемого кода, или, сильно затрудняющий его анализ. Процесс обфускации включает в себя трансформацию кода, которая меняет представление кода оставляя его логику прежней. В данной статье будет проведен обзор различных примеов обфускации, используемых в настоящее время в существующих специализированных инструментах.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Промимо всего прочего обфускация кода также может быть использована не только для защиты интелектуальной собственности. Обфускация может быть использована авторами вредоностного кода для сокрытия и маскировки небезопасного кода. Многие вирусы используют различные техники обфускации для защиты от антивирусных сканеров. С помощью всевозможных преобразований они постоянно изменяют сигнатуры своего кода. В данной статье будут рассмотрены типы вирусов, которые используют обфускацию и всевозможные приемы преобразования кода.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Статья состоит из следующих разделов: &lt;/span&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;«Общие методы обфускации» - обзор общих базовых методов используемых повсеместно в инструментах обфускации; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;«Обфускация препятствующая статическому анализу программ» - обсущаются приемы блокирующие статический анализ.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;«Обфускация в фазе дизасемблирования» - обзор подходов обфускации на этапе дизассемблирования.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;«Обфускация относящаяся к вирусам» - обзор примеов используемых создателями вирусов. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;span lang="RU" style="font-size: large;"&gt;Общие методы обфускации&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Основной целью общих методов обфускации кода является запутывание кода таким образом, что было бы сложно понять как данный код работает. Сам процес запутывания может быть как очень простым, как например какие-то базовые преобразования, так и чрезвычайно сложным, изменяющим управляющую логику (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;control&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;flow&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;) и потоки данных. Приемы описанные ниже являются обобщением работы Коллбегра [4].&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Качество обфускации&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Качество преобразований осуществляемых в процессе обфускации определяется с помощью следующих критериев:&lt;/span&gt;&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Эффективность: Насколько программа становится нечитабельной.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Устойчивость: Насколько сложно взломать программу автоматизированными средствами деобфускации.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Прозрачность: Насколько хорошо обфусцированный код взаимодействует с остальным кодом.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Стоимость: Насколько велик объем избыточного кода в обфусцированном проиложении. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Преобразования управляющей логики&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Преобразования управляющей логики, используемые в процессе обфускации, могут рассматриваться как преобразования, оказывающие влияние на аггрегацию, порядок и выполнение операций управляющей логики. Преобразования аггрегации изменяют порядок выполнения логически связанной последовательности операций и объединяют последовательности операций, которые связанными не являются. Преобразования групировки делают порядок выполнения вычислений спонтанным. Трансформации выполнения операций добавляют новый код или вносят изменения в алгоритм исходного приложения. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Ключевым условием успешности подбных преобразований является устойчивость неочевидных и сложных для понимания конструкций и переменных [5]. Такие конструкции понятны обфускатору, но сложны для восприятия при деобфускации сторонними инструментами. Сложные для понимания конструкции являются тривиальными, если деобфускаторы могут установить их происхождение в процессе статического локального анализа, и слабыми, в случае их прослеживания в процессе глобального анализа. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Преобразования вычислений&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Есть строгая зависимость между сложностью кода и числом конструкций, которое содержится в коде. С увеличиением числа конструкций в коде, добавить дополнительный запутывающий код становиться проще. Поэтому, наличие конструкций, сложных для восприятия предоставляет возможность для последующей обфускации программы. Например, базовый блок кода, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;B&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; можно разделить на две части путем вставки некоторого запутывающего условия &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;P&lt;sup&gt;T&lt;/sup&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; (которое всегда возвращает &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;True&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;) в середину блока &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;B&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;. После этого для каждого из получившихся блоков можно применять различную технику обфускации. Также можно обфусцировать цикл путем изменения условия выхода из цикла некоторым сложно воспринимаемым выражением. Это может быть осуществлено с помощью добавления сложных блоков условий &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;P&lt;sup&gt;T&lt;/sup&gt;&lt;/span&gt;&lt;sup&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/sup&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;(всегда возвращает &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;True&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;) и&lt;sup&gt; &lt;/sup&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;P&lt;sup&gt;F&lt;/sup&gt;&lt;/span&gt;&lt;sup&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/sup&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;(всегда возвращает &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;False&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;) которые не влияют на то, сколько раз будет выполняться тело цикла.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Обфускация абстракций данных&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;В последующих секциях будут описаны преобразования, которые затрудняют восприятие абстракций данных, используемых в исходном коде. Всего существует два типа таких преобразований: собственно, модификация связей наследования и реструктуризация массивов данных. &lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Данная информация базируется на соответствующей работе Коллбегра [7].&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Модификация связей наследования&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;В соответствии с метрикой Чидамбера (Метрика Чидамбера определяет сложность класса основываясь на количестве методов класса, глубине дерева наследования класса, количества прямых производных классов, количество прочих классов, с которыми данный класс связан, количества методов, которые могут быть выполнены в результате получения некоторого сообщения классом и т.д.) сложность программы увеличивается с увеличением глубины дерева наследования. Вместе с этим, можно исскуственно увеличить сложность программы либо путем разделения класса на несколько частей, либо путем добавления дополнительного фиктивного класса. Полагая, что класс &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;C&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; – это класс который будет разделен на &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;C&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;1 и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;C&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;2, необходимо убедиться в том, что данное разделене не повредит область видимости всех переменных класса &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;C&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;. Другими словами, если разделить класс на две части, в одной части может ошибочно нехватать каких то переменных, которые оказались только во второй части. Кроме того, связи наследования могут быть искажены после ложного рефакторинга. Рефакторинг имеет место в следующих случаях. Во-первых, при идентификации двух классов, реализующих одинаковую логику. Во-вторых, перемещение логики, общей для двух классов в родительский класс. Ложный рефакторинг похож на обычный рефакторинг, за тем исключением, что ложный рефакторинг выполняется над двумя незвисимыми классами, которые не имеют общей логики.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Реструктуризация массивов&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Существует много различных типов преобразований, которые могут применяться для сокрытия операций выполняемых над массивами. Эти преобразования включают в себя: разбивку массивов на несколько частей, склеивание нескольких массивов, уменьшение и увеличение размерности массивов (приведение массивов к плоскому или наоборот многомерному представлению).&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Обфускация процедурных абстракций&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;В последующих секциях будет рассмотрены различные виды преобразований, усложняющие восприятие процедурных абстракций программы. Это разрушает абстракции созданные пользователем или вводит новые абстракции, которые изменяют оригинальную структуру исходного кода.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Табличная интерпретация&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Это одни из наиболее эффективных, но также чрезвычайно дорогостоящие преобразования, используемые при обфускации кода. Основная идея преобразования заключается в конвертации части кода в другой машинный код. Новый код выполняется новым интерпретатором виртуальной машины, включенным в обфусцированный код. Как правило в подобных случаях наблюдается существенное замедление выполнения кода, поэтому преобразования подобного рода должны использоваться только для фрагментов кода, которые требуют небольшие интервалы времени для своего выполнения.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Несмотря на то что подобные преобразования чрезвычайно эффективны, они имеют и недостатки. Например, деобфускатор может выследить и вставить реальный код еще до этапа декомпиляции. Одим из вариантов блокирования такой возможности может быть замена строк с байт-кодом программой, которая его создает, или даже обфусцированной программой, в которой буду содержатся дополнительные фиктивные условия и отвлекающий код.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Встраиваемые и невстраиваемые методы&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Встраивание – прием оптимизации кода, который также нашел применение и в обфускации кода. Как только код становится встроенным (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;inlined&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;), содержащий его метод ликвидируется, абстракция которую он представлял перестает существовать. Обратный процесс сводится к групировке определенного набора операций и формированию из нее отдельного метода. Примером встраивания и групировки может быть встраивание двух методов &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;A&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;B&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; которые вызываются друг за другом, и таким образом могут быть объединены в один новый метод.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Клонирующие методы&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;При исследовании отдельного фрагмента кода, человек занимающийся реверс инжинирингом будет смотреть прежде всего на тело метода и его сигнатуру. Окружение, где осуществляется вызов исследуемых методов, также играет очень важную роль в формировании понимания того, как работает код. Этот процесс можно сделать более запутанным, заменив вызовы реальных методов, вызовами других методов.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Обфускация встроенных типов данных&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;В последующих секциях будут рассмотрены различные преобразования, направленые на затруднение восприятия использования базовых типов данных в исходном приложении. Проектирование подобных преобразований, процесс весьма сложный, так как рассматриваемые типы данных являются неотъемлимой частью языков программирования. Эти преобразования являются чрезвычайно дорогостоящими и достаточно очевидными. Высокая стоимость обусловлена тем, что осуществляется воздействие на типы данных, а очевидность – потому что данные преобразования легко идентифицировать.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Разделение переменных&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Некоторые переменные могут быть разделены на две или несколько переменных. В процессе разбивки переменной &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;V&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; типа &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;T&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; на две переменные &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;p&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;q&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; типа &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;U&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;, необходимо обеспечить реализацию следующих элементов:&lt;/span&gt;&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Функция &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;f&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;p&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;,&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;q&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;), которая отображает значения &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;p&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;q&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; на соответствующее значение переменной &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;V&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Функция &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;g&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;V&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;) которая отображает значение &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;V&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; на соответствующие значения p и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;q&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Новые операции приведения в терминах операций над &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;p&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; и &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;q&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Эффективность, надежность и стоимость данного вида преобразований увеличиваются с увеличением количества переменных, на которые осуществляется разбивка исходных переменных.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;u&gt;&lt;i&gt;&lt;span lang="RU" style="font-size: small;"&gt;Конвертация статических и процедурных данных&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Статические строки содержат много полезной информации для человека, занимающегося реверс инжинирингом. Простой способ обфускации таких элементов может быть их конвертация в отдельную программу, который вычисляет их значение. Можно реализовать вычисления для всех статических строк в одной функции, однако, это может упростить реверс инжиниринг. Генерация отдельных фрагментов кода для каждой строки и встраивание их в оригинальные код наверняка увеличит надежность и защищенность кода.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;u&gt;&lt;i&gt;&lt;span lang="RU" style="font-size: small;"&gt;Склеивание скалярных переменных&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Этот прием обфускации основан на объединении двух или более скалярных переменных в одну. Переменные &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;v&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;1, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;v&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;2…&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;vk&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; могут быть объединены в одну переменную &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Vm&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;, которая содержит в себе все диапазоны значений переменных &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;v&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;1, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;v&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;2…&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;vk&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;. Арифметические операции которые выполнялись над переменными также подвергнутся преобразованию, сфокусированном на операциями над &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Vm&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;. Однако степень эффективность подобных преобразований так же невысока, а стало быть подобные преобразование так же не являются панацеей.&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span lang="RU" style="font-size: large;"&gt;Обфускация препятствующая статическому анализу программ&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Нахождение эффективных решений данного типа обфускации задача непростая и предполагает &amp;nbsp;разработку комплексных решений, которые могут привести к замедлению работы или потере точности данных. Преобразования, обсуждаемые в данном разделе описывают решения, которые затрудняют анализ программы посредством модификации управляющей логики программы (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;control&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;flow&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;). В процессе рассмотрения существующих методик, будет акцентировано внимание на приемах затрудняющих статический анализ программы. Статический анализ может быть как чувствительным к управляющей логике, так и независящим от нее.&amp;nbsp; Последний вариант не способен предоставить столько информации, сколько это возможно благодаря статическому анализу зависящему от управляющей логики. Поскольку в случае наличия такой зависимости, в процессе анализа будет построен граф управляющего потока программы и&amp;nbsp; данных. Приемы препятствующие статическому анализу увеличивают зависмость данных от графа управляющей логики. Это приводит к увеличение сложности и уменьшению точности анализа. Информация предоставленная в последующих секциях базируется на работе Вонга [13].&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Преобразования управляющей логики&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Преобразования управляющей логики осуществляются в два этапа. Первый этап осуществляет декомпозицию высокоуровневых переходов в серию выражений «&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;if&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;-&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;then&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;-&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;goto&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;». Следующий этап подразумевает модификацию выражений &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;goto&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; таким образом, что бы адресс перехода вычислялся динамически а не был задан в коде явно. Это может быть выполнено с помощью разветвления кода в соответствии с используемыми переменными. В процессе выполнения преобразований будет осуществлена замена непосредственных адресов переходов на динамически вычисляемые исходя из значений переменных, которые доступны в данном блоке кода и в результате упрощения графа управляющей логики. После проведения преобразований, явно указаные адреса переходов будут отсутствовать, а стало быть задача построения дерева переходов усложнится – теперь придется анализировать и запоминать последнее определение каждой переменной до выполнения каждого перехода.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Преобразования потока данных&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;После применения преобразований управляющей логики, проблема построения дерева напрямую зависит от анализа потока данных, что также является трудоемкой задачей. Фундаментальная сложность&amp;nbsp; анализа потока данных свяазана с наличием иерархий данных в программе. Целью данного типа преобразований является создание дополнительных уровней данных в программе, которые будут определять вычисление, и соответственно анализ адресов переходов. Преобразования выполняются в следующем порядке:&lt;/span&gt;&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;В каждый метод добавить произвольное число переменных указателей.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Вставить исскуственные блоки или кода в существующих блоках, которые устанавливают значения для этих переменных-указателей.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Заменить ссылки на переменные и элементы массива этими указателями. Вычислния, использующие данные переменные должны быть обновлены таким образом, что бы они осуществлялись через указатели.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Определение указателей должно находится в других блоках, а не в тех где происходит их использование.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Эффектом подобных преобразований станет ситуация, когда статический анализатор будет не в состоянии определить какой блок выполнять. А поскольку определение указателей и их использование находится в разных местах, анализатор не сможет определить какое определение указателя соотностится с его использованием. Данный подход запутывания статического дизассемблирования приводит к увеличению времени анализа и уменьшению точности анализа до уровня бесполезности.&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span lang="RU" style="font-size: large;"&gt;Обфускация кода на этапе дизассемблирования&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Большинство рассмотренных приемов обфускации применяются на этапе декомпиляции. Но мы можем обфускировать код и на этапе дизассемблирования. В данной секции будут рассмотрены два наиболее широко применяемые алгоритма статического дизассемблирования и приемы для предотвращения каждого из них. Существует два метода дизассемблирования: статическое дизассемблирование, когда файл, подвергаемый дизассемблированию с помощью дизассемблера не выполняется в процессе дизассемблирования; и динамическое дизассемблирование, когда файл выполняется с использованием некоторых входных данных в процессе дизассемблирования. В данной секции рассматриваются только приемы, предотвращающие статическое дизассемблирование. Существует два вида статического дизассемблирования: линейная развертка и рекурсивный проход. При линейной развертке дизассемблер осуществляет обработку инструкций программы в порядке их следования в коде. При рекурсивном проходе дизассемблер обрабатывает инструкции в соответствии с управляющей логикой программы. То есть, когда встречается инструкция ветвления, дизассемблер определяет возможные варианты выполнения программы и осуществляет обработку этих ветвей. Методы описанные далее описаны в работе Линна [9].&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Предотвращение дизассемблирования&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Файл с машинным кодом состоит из различных секций, которые содержат различную информацию о программе. Одним из таких элементов информации является точка входа в программу, то есть местоположение машинного кода, где находится начало машинных инструкций. Для предотвращения дизассемблирования, необходимо насколько это возможно запутать восприятие того, где находятся границы машинного кода программы. Некоторые множества инструкций подвергаются проверке в процессе дизассемблирования. Это значит, что даже в случае некоторых ошибок дизассемблирования, дизассемблер выполняет синхронизацию с актуальным следованием инструкций программы. Таким образом, этот момент должен быть принят во внимание еще на этапе реализации запутывания. Некоторые приемы, используемые для предотвращения дизассемблирования описаны ниже.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Вставка мусора&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Можно предотвратить дизассемблирование путем вставки мусорных байтов в определенное место потока инструкций. Для того, что бы запутать дизассемблер мусорные инструкции должны быть частичными и в порядке сохранения работоспособности кода, не должны выполняться в момент выполнения программы, то есть должны быть недоступны. Для того что бы это реализовать необходимо выбрать блок, где эти инструкции должны быть размещены и при этом не будут влиять на остальные части программы. Для того что бы убедится что вставляемые инструкции будут недоступны в процессе выполнения программы, блок, куда инструкции вставляются, не должен иметь возможности выполнения инструкций вовсе. Как только это сделано, необходимо определиться с тем, какие инструкции следует вставить для запутывания дизассемблера настолько, насколько это возможно и что бы процесс синхронизации состояния дизассемблера был как можно более продолжительным.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Предотвращение линейной развертки&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Дизассемблирование методом линейной развертки не может распознать данные в текстовой секции. Этот факт может быть использован для предотвращения дизассемблирования путем вставки мусорных байтов в определенном месте следования инструкций. Эти байты могут быть вставлены перед блоком, который никогда не будет выполняться в том порядке, в котором он находится относительно других инструкций. В программах, которые оптимизированы компилятором подобные блоки могут содержать до 30 инструкций. Для того, что бы поместить большее число мусорных данных, можно воспользоваться следующим преобразованием инструкций ветвления. Исходный блок условия&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;b&lt;sub&gt;cc&lt;/sub&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Addr&lt;/span&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;где &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;cc&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; представляет условие, преобразовать к виду:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: CMMI10;"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;u&gt;&lt;span style="font-family: CMMI8; font-size: 8pt;"&gt;cc&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: CMMI8; font-size: 8pt;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: CMR10;"&gt;L’&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: CMR10;"&gt;jmp Addr&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: CMR10;"&gt;L’:&lt;/span&gt;&lt;/i&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;где &lt;/span&gt;&lt;u&gt;&lt;span style="font-family: CMMI8; font-size: 8pt;"&gt;cc&lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style="font-size: 8pt;"&gt; &lt;/span&gt;&lt;/u&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;это дополнение к предыдущему условию&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Предотвращение рекурсивного прохода&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Рекурсивный проход базируется на тщательном разборе управляющей логики, и именно здесь можно внести модификации для предотвращения дизасемблирования. Как только одно из ветвлений оббработано, процесс рекурсивного прохода продолжает процесс разбора одного из возможных блоков, на которые ссылается данная ветвь. Этот процесс предполагает, что это нормальное ветвление и вызовы методов работают соответственно. Условное ветвление имеет две возможные цели перехода и вызов метода для возврата в ту точку откуда вызов был осуществлен. Другим аспектом рекурсивного прохода является сложность идентификации возможных целей перехода при неявном перемещении управления внутри методов.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Функции ветвления&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Предположение, что вызов функции возвращает управления инструкции следующей непосредственно за инструкцией вызова можно использовать в корыстных целях. Предположим имеется конечная карта переходов в программе:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Φ&lt;/span&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; = {&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;sub&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;1&lt;/span&gt;&lt;/sub&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; → &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;sub&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;1&lt;/span&gt;&lt;/sub&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;,&lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;sub&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;2&lt;/span&gt;&lt;/sub&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; → &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;sub&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;2&lt;/span&gt;&lt;/sub&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; ... &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;a&lt;sub&gt;n&lt;/sub&gt;&lt;/span&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; → &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;b&lt;sub&gt;n&lt;/sub&gt;&lt;/span&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Функция ветвления &lt;i&gt;ƒ&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;sub&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Φ&lt;/span&gt;&lt;/sub&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; – это функция, вызываемая из &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;a&lt;sub&gt;i&lt;/sub&gt;&lt;/span&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; и в результате ее вызова управление передается &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;b&lt;sub&gt;i&lt;/sub&gt;&lt;/span&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;. Данную функцию ветвления можно заменить на выражение с &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;n&lt;/span&gt;&lt;/i&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; условиями:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;A1:jmp &lt;i&gt;b&lt;sub&gt;1&lt;/sub&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;A2:jmp &lt;i&gt;b&lt;sub&gt;2&lt;/sub&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;An:jmp &lt;i&gt;b&lt;sub&gt;n&lt;/sub&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;А это в свою очередь можно преобразовать следующим образом:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;A1:jmp &lt;i&gt;ƒ&lt;sub&gt;Φ&lt;/sub&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;A2:jmp &lt;i&gt;ƒ&lt;sub&gt;Φ&lt;/sub&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;An:jmp &lt;i&gt;ƒ&lt;sub&gt;Φ&lt;/sub&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Подобная функция ветвтения имеет два предназначения. Первое – это предотвращение определения адреса перехода внутри функции ветвления, и второе – это создание возможности для введения запутывающей логики для дизассемблера. Подобная функция ветвления может быть реализована несколькими способами. Одна реализация может использовать адреса из некой таблицы. Другое решение, предполагает вычисление адреаса перехода через смещение относительно инструкции, следующей за той которая содержит вызов данного метода.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU"&gt;Преобразование вызова&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Изменение схемы функции ветвления может использоваться для вставки мусорных байтов непосредственно после инструкций вызова. Это осуществляется посредством изменения маршрутизации в специальной функции ветвления, которая занимается управлением переходов к целевым функциям, и корректирует смещение инструкций куда нужно передать управление по возвращению из функции. Такой механизм может затруднить анализ управляющей логики сторонними инструментами дизассемблирования и усложнить поиск точки входа в программу. &lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Запутывающие предикаты&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Предположение, что условное ветвление может иметь два выхода, может использоваться для преобразование безусловных ветвей кода к условным, котоыре всегда выполняются в заданном порядке. Это может быть достигнуто с использованием так называемых запутывающих предикатов. Как только безусловная ветка кода заменяется на условную, которая содержит некоторый запутывающий предикат, непосредственно перед этим предикатом появляется возможность вставить мусорные байты для ликвидации возможности дизассемблирования.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;u&gt;&lt;i&gt;&lt;span lang="RU" style="font-size: small;"&gt;Сокрытие таблице переходов&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Для ликвидации возможности дизассемблирования, помимо вставки мусорных байтов, можно также вставить таблицу исскуственных переходов для того что бы воспрепятствовать дизасемблированию с использованием рекурсивного прохода. Данный метод дизассемблирования будет&amp;nbsp; пытаться определить размер таблицы переходов для тогго что бы идентифицировать возможные цели неявных переходов. Это поведение дизассемблера можно использовать, сделать таблицу переходов недоступной в момент выполнения.&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span lang="RU" style="font-size: large;"&gt;Обфускация кода используемая в вирусах&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Обфускация кода используется не только создателями коммерческого программного обеспечения для предотвращения возможности реверс инжиниринга; создатели вредоносного кода также могут использовать обфускацию для того что бы спрятать свои творения от антивирусных сканеров. В конечном счете, обе области использования обфускация имеют одну общую цель – сделать программу нечитаемой для третьего лица. Разумеется, различные области применения используют свои специфические особоенности. Вирусы должы учитывать тот факт, что их методы обфускации должны постоянно изменятся, иначе сканер будет способен из различить по постоянной сигнатуре. Это вносит ограничения по времени и пространству.&amp;nbsp; Комерческое программное обеспечение ставит на первое место вопрос производительности, который органичивает использование многих возможных типов обфускации. В данном разделе будут рассмотрены различия между типами и приемами обфускации для коммерческого программного обеспечения и для защиты вредоносного кода. Первым делом стоит рассмотреть типы вирусов, которые могут использовать приемы обфускации, далее следует обратить внимание на преобразования, которые используются ими для предотвращения обнаружения. И наконец, будут рассмотрены возможности подбных приемов и варианты их использования в коммерческом программном обеспечении. В целях экономии времени исследование методик обфускации для вирусов будет предоставлено поверхностно.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Типы вирусов&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Два основые типа вредоносных програм, которые используют приемы обфускации для собственной защиты от антивирусных сканеров это полиморфные и метаморфные вирусы. Простые вирусы не изменяют свое тело при каждой генерации, и поэтому сканеры способны выявить был ли заражен такими вирусами проверемый файл простым сопоставлением с некой постоянной сигнатурой. Полиморфные и метаморфные вирусы разрабатываются изначально с защитой от сканера. Такая защита базируется на приемах, которые изменяют сигнатуру кода вирусов при каждой генерации, выполняемой при заражении файла, что делает невозможным выявление вирусов по сигнатуре.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU"&gt;Полиморфные вирусы&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Полиморфные вирусы являются расширениями шифрованных вирусов [1, 14]. Шифрованные вирусы просто зашифровывают свое тело и после этого присоединяют к себе ключ для расшифровки, который меняется от генерации к генерации. Полиморфные вирусы также зашифровывают свое тело, однако помимо этого они случайным образом изменяют свой алгоритм шифрования каждый раз, когда осуществляется инфицирование вирусом исполняемого файла-жертвы. А поскольку схема расшифровывания никогда не бывает защищена шифрованием и как правило добавляется всегда в конец файла, то это может послужить хорошую службу антивирусному сканеру. Поэтому, когда полиморфный вирус изменяет свой код дешифрации, он изменяет часть своей сигнатуры, которая является основным инструментов для сканера на распознавание вируса. Сканер в свою очередь может быть достаточно умным и подождать пока вирус осуществит деобфускацию. Также сканер может иметь возможность осуществлять выполнение вируса в «песочнице» или эмуляторе, которые позволяют вирусу выполняться без опасности для остального окружения. Как только вирус начинает выполнятся, он должен осуществить дешифрование своего тела для того что бы иметь возможность заразить жертву и поэтому эмулятор может просканировать исполняемый код на соответствие известным сигнатурам вирусов. Очевидно, данный прием имеет ограничения, одним из которых является незнание того сколько по времени необходимо выполнять код когда станет возможным проводить соспоставление по сигнатуре.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;i&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Метаморфные вирусы&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Метаморфные вирусы, подобно полиморфным, осуществляют шифрование своего тела для того что бы спятать сигнатуру используемую анивирусным сканером. Метаморфные вирусы, однако, могут изменять свой исходный код и после этого осуществлять перекомиляцию самих себя если на машине-жертве доступен компилятор. Это позволяет вирусу добавить или удалить мусорный запутываюший код, который каждый раз оказвает влияние на сигнатуру кода. Метаморфные вирусы более продвинуты, нежели полиморфные. В то время как полиморфные вирусы дешифруют свое тело и после этого осуществляют заражение жертвы, метаморфные ведут себя иначе. Они никогда не раскрывают свое тело, что делает процес определения вируса практически невозможным для достаточно простого сканера. Как результат, сканеру приходится использовать различные эвристические приемы для идентификации метаморфного вируса. Среди основных приемов по прежнему используются эмуляторы, виртуальные машины которые эмулируют некоторую функциональность операционной системы. Вызовы системы слежения – это техника которая усиленно исследовалась последние годы [12, 8]. М Христодореску и другие недавно разработали прием статического анализа для выявления метаморфных вирусов [3]. Все приемы как правило основаны приемах, известных реверс-инжинерам коммерческого программного обеспечения. Статический анализ, декомпиляция и такогих приемов, котоыре в терминах теории обфускации можно назвать вставками «мертвого» кода.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Приемы &lt;/span&gt;&lt;span lang="RU" style="font-size: small; line-height: 115%;"&gt;обфускации&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Обфускация используемая создателями вирусов как правило используется для возможности изменения сигнатуры кода, то есть изменения последовательности инструкций, изза чего антивирусный сканер&amp;nbsp; будет не в состоянии использовать строки поиска для определения наличия вируса. Основные приемы обфускации, изменяющие представление кода, это: вставки «мертвого» кода (также назваемый мусорными вставками), транформации кода, перераспределение регистров и замещения инструкций. Все эти виды обфускации кратко описаны ниже, хотя они все были описаны, правда немного под другим углом, раньше при описании преобразований кода.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;u&gt;&lt;i&gt;&lt;span lang="RU" style="font-size: small;"&gt;Вставка «мертвого» кода&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Этот вид преобразований представляет собой имено то, что гласит его название, он использует вставку бессмысленных инструкций вперемешку с существующими инструкциями. Это могут быть инструкции которые ничего не делают (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;nop&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;), или которые изменяют состояние программы, но потом возвращают предыдущее состояние обратно, или же инструкции переходов корые не позволяют вставленным инструкциям получить управление во время выполнения программы. С помощью всех этих изменений невозможно запутать человека, осуществляющего реверс инжиниринг, как это было показано М. Христодореску в [3], но вполне возможно воспрепятствовать нормальной работе антивирусных сканеров.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;u&gt;&lt;i&gt;&lt;span lang="RU" style="font-size: small;"&gt;Трансформация кода&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Трансформация кода это просто косметическое перемещение фрагмента кода внутри файла. Например местоположение процедуры может быть изменено, или изменено местоположение некоторых инструкций внутри процедуры, причем эти изменения не влияют на работу приложения.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;u&gt;&lt;i&gt;&lt;span lang="RU" style="font-size: small;"&gt;Перераспределение регистров&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Перераспределение регистров предполагает изменение решистров используемых реальными переменными. Если отдельный регистр &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;R&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;1 не используется в какой-то момент некоторым множеством переменных, но другой регистр &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;R&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;2 используется в данное время для хранения актуального значения некоторой переменной, то его можно заменить на &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;R&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;1. Снова стоит повториться, что эти преобразования никоим образом не не изменяют логику программы, но оказывают влияние на сигнатуру программы.&lt;/span&gt;&lt;/div&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;u&gt;&lt;i&gt;&lt;span lang="RU" style="font-size: small;"&gt;Замещения инструкций&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Если сравнивать данное преобразование с теми которые были описаны выше, то данный прием является наиболее эфективным, даже если смотреть с точки зрения реверс инжиниринга. Замещение инструкций реализуется с помощью некоторого списка соответствия инструкций. В этом случае, инструкция в теле кода заменяется на другую, но аналагичную. Данный подход коренным образом изменяет сигнатуру кода, и практически не возможно осуществить деобфускацию, особенно если список соответствий недоступен.&lt;/span&gt;&lt;span lang="RU"&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small; line-height: 115%;"&gt;Сравнения&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Создатели вирусов осуществляют обфускацию кода для того что бы изменить сигнатуру кода вируса, таким образом, что бы антивирусные сканеры былы не в состоянии их идентифицировать. Это имеет смысл поскольку сканеры могут искать факт заражения вирусом даже там, где его нету. Это очевидное отличие от той обфускации, которая используется для затруднения реверс инжиниринга. В последнем случае обфускация используется для защиты и сокрытия некоторой чувствительной информации, о наличии которой знает человек, занимающийся реверс инжинирингом программы. Вцелом, приемы обфускации используемые вирусописателями не настолько эффективны, как приемы используемые в коммерческом програмном обеспечении. Однако, существуют примеры когда создатели вредоносного кода могут использовать методы обфускации, коорые вполне годятся и для комерческих программ. Таким примером может быть прием используемый вирусом, который называется &lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Zmist&lt;/span&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;, для того что бы спрятать свой полиморфный дешифратор [12]. Код дешифрации помещается в код жертвы небольшими фрагментами, которые соединены между собой инстркуциями безусловных переходов. Такой прием можно использовать в коммерческих решениях. Важные и чувствительные алгоритмы могут быть разбиты на фрагменты и разбросаны по всему остальному коду. Главным образом, преобразования применяемые к вирусам не защищают от атак реверс инжиниринга и поэтому не могут применятся для защиты коммеческих продуктов.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;u&gt;&lt;span lang="RU" style="font-size: small;"&gt;Взгляд под другим улом&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;На обфускацию можно посмотреть еще под одним углом, который до этого еще&amp;nbsp; не рассматривался в данной публикации. Это обфускация, которая используется для предотвращения вредоносных встраиваний кода направленных изменения функционирования комерческих прогрудктов..Подобные атаки, как правило реализуются путем вставки вредоносного кода в существующую программу с целью получения управления этим вставленым кодом [10]. Очевидно, что для того что бы вставить подобный вредоносный код и успешно его выполнить необязательно иметь четкое представление обо всех нюансах работы кода программы-жертвы. Для предотвращения подобных атак, имеет смысл запутать программу настолько, что бы было сложно понять куда нужно вставлять вредоносный код для получения управления. И для таких целей обфускация также придет на помощь. В данный момент проводятся исследования вопросов обфускации, основной целью которой является динамическое изменение местоположения данных и выполняемого кода во время выполнения програмы [11, 2]. Подобные приемы призваны не только усложнить восприятие программы, но также и реализовать защиту от повторяющихся атак, которые не смогут успешно завершится изза того, что структура программы будет постоянно изменяться. Это особено интересный прием, так как он может оказывать влияние на то, как вирусы могут мутировать для того что бы избежать идентификации сканерами.&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;&lt;span lang="RU" style="font-size: large;"&gt;Заключение&lt;/span&gt;&lt;span lang="RU"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;С помощью обфускации кода можно избержать большого количества всевозможных атак, и увеличить затрачиваемое время и усилия на реверс инжиниринг защищаемого продукта. Еще не существует таких приемов обфускации, которые полностью защитили бы программу от реверс инжиниринга. В дополнение к этому нельзя забывать и о том, что обфускация увеличивает объем кода, уменьшает производительность и может препятствовать оптимизациям компиляторов. Несмотря на эти органичения, приемы обфускации, при разумном и правильном использовании добавляют дополнительный слой защиты от несанкционированного исследования алгоритмов и вставки вредоносного кода. В данной статье были раскрыты причины, почему приемы обфускации используемые при создании вирусов не могут использоваться для защиты коммерческих прогрммных продуктов. Несмотря на то, что основные моменты защиты от заражения вирусами были описаны, этот вопрос однозначно требует дальнейшего рассмотрения и остается открытым для изучения новых приемов, способных предоставить еще большую защиту.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;span lang="RU" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;В основу данной статьи положена публикация Arini Balakrishnan и Chloe Schulze «Code Obfuscation Literature Survey». &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;&lt;span style="font-size: large;"&gt;Литература&lt;/span&gt;&lt;/h2&gt;&lt;ol start="1" type="1"&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Understanding and managing polymorphic      viruses, 1996.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Sandeep Bhatkar, Daniel C.      DuVarney, and R. Sekar. Address obfuscation: an efcient approach to combat      a broad range of memory error exploits.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;M. Christodorescu and S. Jha.      Static analysis of executables to detect malicious patterns. In 12th      USENIX Security Symposium, pages 169–186, August 2003.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Christian Collberg, Clark      Thomborson, and Douglas Low. A taxonomy of obfuscating transformations,      July 1997.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Christian Collberg, Clark      Thomborson, and Douglas Low. Manufacturing cheap, resilient, and stealthy      opaque constructs. In Principles of Programming Languages 1998, POPL’98,      pages 184–196, 1998.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Christian S. Collberg and Clark      Thomborson. Watermarking, tamper–proofing, and obfuscation — tools for      software protection. In IEEE Transactions on Software Engineering, volume      28, pages 735–746, August 2002.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Christian S. Collberg, Clark D.      Thomborson, and Douglas Low. Breaking abstractions and unstructuring data      structures. In International Conference on Computer Languages, pages      28–38, 1998.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;A. Lakhotia and E. U. Kumar.      Abstract stack graph to detect obfuscated calls in binaries. In IEEE      International Workshop on Source Code Analysis and Manipulation, September      2004.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;C. Linn and S. Debray.      Obfuscation of Executable Code to Improve Resistance to Static      Disassembly, 2003.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;C. M. Linn, M. Rajagopalan, S.      Baker, C. Collberg, S. K. Debray, J. H. Hartman, and P. Moseley. A      multi–faceted defence mechanism against code injection attacks.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;M. Madou, B. Anckaert, P.      Moseley, S. Debray, B. De Sutter, and K. De Bosschere. Software protection      through dynamic code mutation.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Peter Szor and Peter Ferrie.      Hunting for Metamorphic, September 2001.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Chenxi Wang, Jonathan Hill,      John Knight, and Jack Davidson. Software tamper resistance: Obstructing      static analysis of programs. Technical Report CS–2000–12, 12 2000.&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="line-height: normal; mso-list: l3 level1 lfo5; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; tab-stops: list .5in; text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;T. Yetiser. Polymorphic      Viruses: Implementation, Detection, and Protection. VDS Advanced Research      Group, January 1993.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3251957072749834367-5638305721358026596?l=sharcus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharcus.blogspot.com/feeds/5638305721358026596/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3251957072749834367&amp;postID=5638305721358026596' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/5638305721358026596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3251957072749834367/posts/default/5638305721358026596'/><link rel='alternate' type='text/html' href='http://sharcus.blogspot.com/2011/06/blog-post.html' title='Обфускация, взгляд изнутри'/><author><name>Mikalai Kalpinski</name><uri>http://www.blogger.com/profile/09555025908673583521</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/_KVUzIxXxJ4o/S4GEqVFTamI/AAAAAAAAAN0/KIi8QgLJ_Bs/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3251957072749834367.post-6968552581094846454</id><published>2011-05-30T12:41:00.000+02:00</published><updated>2011-05-30T12:41:18.844+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revelation'/><category scheme='http://www.blogger.com/atom/ns#' term='translates'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>Улучшаем перечисления</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;    &lt;w:UseFELayout/&gt;   &lt;/w:Compatibility&gt;   &lt;w:DoNotOptimizeForBrowser/&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0in; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}&lt;/style&gt; &lt;![endif]--&gt;  &lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;В&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt; &lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;основу&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt; &lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;публикации&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt; &lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;положена&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt; &lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;статья&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt; &lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;&lt;a href="http://www.codeproject.com/script/Membership/View.aspx?mid=3026871"&gt;Dieter Deysel&lt;/a&gt; &lt;a href="http://www.codeproject.com/Tips/103497/Using-Attributes-Reflection-and-Generics-To-Increa.aspx"&gt;Using Attributes, Reflection and Generics To Increase The Usability Of Enums&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Данная статья описывает решение, используемое нашей командой в разрабатываемых проектах. В решении используются кастомные аттрибуты, механизм отражения и дженерики. С их помощью мы получаем максимальную отдачу от использования перечислений, наделяя каждый элемент перечисления дополнительными метаданными. Надеюсь многим будет интересно познакомиться с нашим решением. Уверен, оно позволит упростить и улучшить разрабатываемый код.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;В текущем проекте нам приходится использовать большое количество разнообразным перечислений различных типов. Использование перечислений само по себе очень упрощает код и избавляет от всякого хардкода. Однако, иногда элементы перечисления очень хочется дополнить экстра данными, как например строковое описание элемента или что то еще. Ниже я хочу продемонстрировать, как мы решили этот момент. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Многие разработчики наверняка видели реализации подобной функциональности с использованием самодельного аттрибута &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;EnumDescription&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;, который может к элементу перечисления привязать строковое описание поясняющее его суть. Вот пример такого использования аттрибута:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;public&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;enum&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Institution&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;EnumDescription&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;(“&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Bank&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;A&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;”)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;BankA,&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[EnumDescription (“Shop B”)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ShopB,&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;[&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;EnumDescription&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;(“&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Library&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;C&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;”)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;LibraryC&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Наше решение основано на похожей концепции. Мы используем расширенные аттрибуты, которые содержат не просто одно строковое поле для описания элемент, а множество всех необходимых свойств. Помимо этого мы используем не один, а несколько кастомных аттрибутов, для семантического разделения их предназначений. Такой подход, позволяет более гибко декорировать те или иные элементы перечислений.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Вот пример реализации наших аттрибутов:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;public sealed class InstituteAttribute: Attribute&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public InstituteAttribute(string Desc, string Phone)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Description = Desc;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Telephone=Phone;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;span&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; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public string Description {get;set;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public string Telephone {get;set;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;public sealed class AddressAttribute: Attribute&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public AddressAttribute (string Add1, string Add2, string City, string ZipCode)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.Address1 = Add1;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.Address2 = Add2;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.City = City;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.ZipCode = ZipCode;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;span&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; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public string Address1 {get;set;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public string Address2 {get;set;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public string City {get;set;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public string ZipCode {get;set;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Для того что бы связать дополнительные данные с элементом перечисления, мы используем подход схожий с тем, который который применяется в случае описанном выше с аттрибутом &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;EnumDescription&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;. Но применение наших аттрибутов не является таким же гибким, так как мы должны знать, с каким типом мы работаем, и какие свойства аттрибутов доступны.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Вот пример использования наших аттрибутов.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;public enum Institution&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[Institute (“Bank A”,&lt;span&gt;&amp;nbsp; &lt;/span&gt;”(856) 745-1546”)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[Address(“123 Street”, “Some town”, “Some City” , ”1452”)] &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;BankA,&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[Institute (“Shop B”,&lt;span&gt;&amp;nbsp; &lt;/span&gt;“(012) 154-1456”)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ShopB,&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;[&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Institute&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; (“&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Library&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;C&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;”,&lt;span&gt;&amp;nbsp; &lt;/span&gt;“(123) 147-4567”)]&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;LibraryC&lt;/span&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Для того что бы получить данные из аттрибутов, мы реализовали метод расширения, который используя средства рефлексии, получает дополнительую информацию из свойств аттрибутов, которые есть у данного элемента перечисления.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Ниже представлена реализация подобного метода:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;/// &lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;/// Use this extension method to obtain any property in an attribute used to decorate the fields of an Enum.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;/// &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;/// &lt;typeparam name="T"&gt;Type of attribute containing the wanted properties&lt;/typeparam&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;/// &lt;param name="value" /&gt;This will be the Enum value&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;/// &lt;param name="AttributeProperty" /&gt;The property of the specified attribute that must be returned.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;/// &lt;returns&gt;The property value specified&lt;/returns&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;public static string GetPropertyValue&lt;t&gt;(this Enum value, string AttributeProperty)&lt;/t&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//Get the enum value&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;FieldInfo fi = value.GetType().GetField(value.ToString());&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;T[] atts = fi.GetCustomAttributes(typeof(T), false) as T[];&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//if there is any attributes of the specified type&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (atts.Length == 0)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return string.Empty;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//find propertyname&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PropertyInfo pi = atts[0].GetType().GetProperty(AttributeProperty);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (pi == null)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;throw new ArgumentException(String.Format("{0} is not a valid property name.", AttributeProperty));&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//return value of property&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return pi.GetValue(atts[0],null).ToString();&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span lang="RU" style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Теперь, обладая подобным методом, мы без труда можем получить дополнительные данные элемента перечисления.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Ниже представлен пример получения данных:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;string shopPhone = Institution.ShopB.GetPropertyValue&lt;instituteattribute&gt;(“Telephone”);&lt;/instituteattribute&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Выражение в примере выше вызовет метод расширения &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;GetPropertyValue&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt; &lt;span lang="RU"&gt;для элемента перечисления &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;ShopB&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt; &lt;span lang="RU"&gt;и вернет значение свойства &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Telephone&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt; аттрибута &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Institute&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;, который есть у элемента &lt;/span&gt;&lt;span style="color: #4f81bd; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;ShopB&lt;/span&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="font-size: 12pt;"&gt;Вот и все. Надеюсь описанное здесь решение окажется полезным и для вас.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
