<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Security News &#187; C#</title> <atom:link href="http://www.secnews.pl/category/programowanie/c-programowanie/feed/" rel="self" type="application/rss+xml" /><link>http://www.secnews.pl</link> <description>Reverse engineering, ochrona oprogramowania.</description> <lastBuildDate>Mon, 30 Jan 2012 14:41:10 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Kompresja aplikacji .NET</title><link>http://www.secnews.pl/2012/01/29/kompresja-aplikacji-net/</link> <comments>http://www.secnews.pl/2012/01/29/kompresja-aplikacji-net/#comments</comments> <pubDate>Sat, 28 Jan 2012 22:42:02 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[C#]]></category> <category><![CDATA[Narzędzia]]></category> <category><![CDATA[Programowanie]]></category> <category><![CDATA[Reversing]]></category> <category><![CDATA[.netshrink]]></category> <category><![CDATA[dll binder]]></category> <category><![CDATA[dotnete]]></category> <category><![CDATA[exe-packer]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=1232</guid> <description><![CDATA[.netshrink v2.2 .netshrink to kompresor (tzw. exe-packer) aplikacji .NET-owych, wykorzystujący kompresję LZMA, DLL binder pozwalający scalić aplikację oraz jej dodatkowe moduły DLL do jednego pliku EXE, .netshrink pozwala także na ochronę aplikacji na hasło przed uruchomieniem. W zaktualizowanej wersji poprawione zostało uruchamianie skompresowanych aplikacji ze ścieżek UNC (zasoby sieciowe) z linii komend i zachowywanie oryginalnej [...]]]></description> <content:encoded><![CDATA[<h1>.netshrink v2.2</h1><p><a href="http://www.pelock.com/products/netshrink">.netshrink</a> to kompresor (tzw. <em>exe-packer</em>) aplikacji .NET-owych, wykorzystujący kompresję LZMA, DLL binder pozwalający scalić aplikację oraz jej dodatkowe moduły DLL do jednego pliku EXE, .netshrink pozwala także na ochronę aplikacji na hasło przed uruchomieniem.</p><p><a href="http://www.secnews.pl/wp-content/uploads/2012/01/netshrink_main1.png"><img class="alignnone size-full wp-image-1233" title="Okno główne .netshrink v2.2" src="http://www.secnews.pl/wp-content/uploads/2012/01/netshrink_main1.png" alt="" width="551" height="621" /></a></p><p>W zaktualizowanej wersji poprawione zostało uruchamianie skompresowanych aplikacji ze ścieżek UNC (zasoby sieciowe) z linii komend i zachowywanie oryginalnej architektury CPU dla skompresowanych plików.</p><p>Strona domowa:<br /> <a href="http://www.pelock.com/products/netshrink">http://www.pelock.com/products/netshrink</a></p><p>Wersje demonstracyjną można ściągnąć z:</p><p>Setup:<br /> <a href="http://www.pelock.com/download.php?f=netshrink.exe">http://www.pelock.com/download.php?f=netshrink.exe</a> (701 kB)</p><p>Archiwum zip:<br /> <a href="http://www.pelock.com/download.php?f=netshrink.exe">http://www.pelock.com/download.php?f=netshrink.exe</a> (415 kB)</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2012/01/29/kompresja-aplikacji-net/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>.netshrink v2.1 &#8211; kompresor i DLL binder dla aplikacji .NET</title><link>http://www.secnews.pl/2012/01/21/netshrink-v2-1-kompresor-i-dll-binder-dla-aplikacji-dotnet/</link> <comments>http://www.secnews.pl/2012/01/21/netshrink-v2-1-kompresor-i-dll-binder-dla-aplikacji-dotnet/#comments</comments> <pubDate>Sat, 21 Jan 2012 14:53:48 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[C#]]></category> <category><![CDATA[Narzędzia]]></category> <category><![CDATA[Programowanie]]></category> <category><![CDATA[Reversing]]></category> <category><![CDATA[.netshrink]]></category> <category><![CDATA[dll binder]]></category> <category><![CDATA[dotnete]]></category> <category><![CDATA[exe-packer]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=1201</guid> <description><![CDATA[.netshrink v2.1 Właśnie ukazała się nowa wersja mojego małego narzędzia do kompresji aplikacji .NET. .netshrink to kompresor (tzw. exe-packer)  aplikacji .NET-owych, wykorzystujący kompresję LZMA. DLL Binder W nowej wersji została dodana opcja dołączania bibliotek dynamicznych DLL do aplikacji, dzięki czemu można swoją aplikację i jej pomocnicze biblioteki skompresować do pojedynczego pliku wykonywalnego. Wykrywanie narzędzi do łamania [...]]]></description> <content:encoded><![CDATA[<h1>.netshrink v2.1</h1><p>Właśnie ukazała się nowa wersja mojego małego narzędzia do <strong>kompresji aplikacji .NET</strong>.</p><p><strong><a href="http://www.pelock.com/products/netshrink">.netshrink</a></strong> to kompresor (tzw. <em>exe-packer</em>)  aplikacji .NET-owych, wykorzystujący kompresję LZMA.</p><h2>DLL Binder</h2><p>W nowej wersji została dodana opcja <strong>dołączania bibliotek dynamicznych DLL</strong> do aplikacji, dzięki czemu można swoją aplikację i jej pomocnicze biblioteki <strong>skompresować do pojedynczego pliku wykonywalnego</strong>.</p><p><img title="Scalanie aplikacji i jej bibliotek do jednego pliku" src="http://www.secnews.pl/wp-content/uploads/2012/01/netshrink_dll_binder.png" alt="" width="357" height="324" /></p><h2>Wykrywanie narzędzi do łamania aplikacji</h2><p>Zaktualizowana wersja pozwala również skompresowanym aplikacjom na <strong>wykrywanie popularnych narzędzi do łamania i rozpakowywania</strong> oprogramowania poprzez stałe monitorowanie systemu na ich obecność, w razie ich wykrycia, <strong>skompresowana aplikacja zostanie zamknięta</strong>.</p><h2>Ochrona na hasło</h2><p>.netshrink pozwala także na zaszyfrowanie aplikacji hasłem, bez poprawnego hasła nie można uruchomić skompresowanej aplikacji. Zabezpieczenie na hasło wykorzystuje weryfikację bazującą na funkcji skrótu <strong>SHA256</strong> i szyfrowanie danych algorytmem <strong>AES / Rijndael</strong> z kluczem 256 bitowym bazującym na wartości hash z hasła.</p><p><a href="http://www.secnews.pl/wp-content/uploads/2012/01/netshrink_main.png"><img class="alignright size-full wp-image-1202" title=".netshrink kompresor i DLL binder dla aplikacji .NET" src="http://www.secnews.pl/wp-content/uploads/2012/01/netshrink_main.png" alt=".netshrink kompresor i DLL binder dla aplikacji .NET" width="541" height="618" /></a></p><p>Nowości obejmują także:</p><ul><li>tworzenie <strong>kopii zapasowej</strong> kompresowanych aplikacji</li><li>tworzenie skryptu wsadowego .BAT pozwalającego na <strong>szybkie przywrócenie</strong> oryginalnego pliku z kopii zapasowej</li><li><strong>zachowywanie oryginalnych atrybutów</strong> kompresowanego assembly (nazwa aplikacji, dane firmy etc.)</li></ul><p>Strona domowa:<br /> <a href="http://www.pelock.com/products/netshrink">http://www.pelock.com/products/netshrink</a></p><p>Wersje demonstracyjną można ściągnąć z:</p><p>Setup:<br /> <a href="http://www.pelock.com/download.php?f=netshrink.exe">http://www.pelock.com/download.php?f=netshrink.exe</a> (692 kB)</p><p>Archiwum zip:<br /> <a href="http://www.pelock.com/download.php?f=netshrink.exe">http://www.pelock.com/download.php?f=netshrink.exe</a> (405 kB)</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2012/01/21/netshrink-v2-1-kompresor-i-dll-binder-dla-aplikacji-dotnet/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Patcher dla C#</title><link>http://www.secnews.pl/2012/01/12/patcher-dla-c-sharp/</link> <comments>http://www.secnews.pl/2012/01/12/patcher-dla-c-sharp/#comments</comments> <pubDate>Thu, 12 Jan 2012 13:23:01 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[C#]]></category> <category><![CDATA[Programowanie]]></category> <category><![CDATA[c++]]></category> <category><![CDATA[patcher]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=1194</guid> <description><![CDATA[Czekałem na koniec świata, ale jakoś go nie było, tymczasem mała klasa w C# do patchowania plików z paroma przydatnymi opcjami jak np. patchowanie stringow Delphi. using System; using System.IO; using System.Collections.Generic; using System.Text; &#160; namespace NetPatcher &#123; class Patcher &#123; public FileStream inputFile; &#160; public Patcher&#40;&#41; &#123; &#125; &#160; ~Patcher&#40;&#41; &#123; CloseFile&#40;&#41;; &#125; &#160; [...]]]></description> <content:encoded><![CDATA[<p>Czekałem na koniec świata, ale jakoś go nie było, tymczasem mała klasa w C# do patchowania plików z paroma przydatnymi opcjami jak np. patchowanie stringow Delphi.</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.IO</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> NetPatcher
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Patcher
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> FileStream inputFile<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> Patcher<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        ~Patcher<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            CloseFile<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> OpenFile<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> filePath<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">try</span>
            <span style="color: #008000;">&#123;</span>
                inputFile <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> FileStream<span style="color: #008000;">&#40;</span>filePath, FileMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Open</span>, FileAccess<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadWrite</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF; font-weight: bold;">return</span> inputFile <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">null</span> <span style="color: #008000;">?</span> <span style="color: #0600FF; font-weight: bold;">false</span> <span style="color: #008000;">:</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0600FF; font-weight: bold;">catch</span> <span style="color: #008000;">&#40;</span>Exception e<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">//return false;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> CloseFile<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>inputFile <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            inputFile <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">long</span> PatchArray<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">long</span> fileOffset, <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> patchBytes<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Seek</span><span style="color: #008000;">&#40;</span>fileOffset, SeekOrigin<span style="color: #008000;">.</span><span style="color: #0000FF;">Begin</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;">&#40;</span>patchBytes, <span style="color: #FF0000;">0</span>, patchBytes<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Position</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">long</span> PatchByte<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">long</span> fileOffset, <span style="color: #6666cc; font-weight: bold;">byte</span> patchByte<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Seek</span><span style="color: #008000;">&#40;</span>fileOffset, SeekOrigin<span style="color: #008000;">.</span><span style="color: #0000FF;">Begin</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteByte</span><span style="color: #008000;">&#40;</span>patchByte<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Position</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">long</span> PatchString<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">long</span> fileOffset, <span style="color: #6666cc; font-weight: bold;">string</span> patchString<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #000000;">System.<span style="color: #0000FF;">Text</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Encoding</span> asciiEncoding <span style="color: #008000;">=</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Text</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Encoding</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ASCII</span><span style="color: #008000;">;</span>
            <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> encodedPatchString <span style="color: #008000;">=</span> asciiEncoding<span style="color: #008000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;">&#40;</span>patchString<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> PatchArray<span style="color: #008000;">&#40;</span>fileOffset, encodedPatchString<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">long</span> PatchDelphiString<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">long</span> fileOffset, <span style="color: #6666cc; font-weight: bold;">string</span> patchString<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #000000;">System.<span style="color: #0000FF;">Text</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Encoding</span> asciiEncoding <span style="color: #008000;">=</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Text</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Encoding</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetEncoding</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">1250</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> encodedPatchString <span style="color: #008000;">=</span> asciiEncoding<span style="color: #008000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;">&#40;</span>patchString<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            PatchByte<span style="color: #008000;">&#40;</span>fileOffset, <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#41;</span>encodedPatchString<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            PatchArray<span style="color: #008000;">&#40;</span>fileOffset <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span>, encodedPatchString<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Position</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">long</span> PatchInt32<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">long</span> fileOffset, Int32 patchInt32<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> encodedInt32 <span style="color: #008000;">=</span> BitConverter<span style="color: #008000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;">&#40;</span>patchInt32<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            PatchArray<span style="color: #008000;">&#40;</span>fileOffset, encodedInt32<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Position</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">long</span> PatchFill<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">long</span> fileOffset, <span style="color: #6666cc; font-weight: bold;">long</span> Length, <span style="color: #6666cc; font-weight: bold;">byte</span> patchByteFill<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span>Length<span style="color: #008000;">--</span> <span style="color: #008000;">!=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                PatchByte<span style="color: #008000;">&#40;</span>fileOffset<span style="color: #008000;">++</span>, patchByteFill<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> inputFile<span style="color: #008000;">.</span><span style="color: #0000FF;">Position</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2012/01/12/patcher-dla-c-sharp/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Wykrywanie VMware w C#</title><link>http://www.secnews.pl/2011/12/01/wykrywanie-vmware-w-c-sharp/</link> <comments>http://www.secnews.pl/2011/12/01/wykrywanie-vmware-w-c-sharp/#comments</comments> <pubDate>Thu, 01 Dec 2011 00:42:28 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[C#]]></category> <category><![CDATA[Programowanie]]></category> <category><![CDATA[detekcja]]></category> <category><![CDATA[vmware]]></category> <category><![CDATA[wykrywanie]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=1149</guid> <description><![CDATA[Jak wykryć VMware VMware jest często wykorzystywane w celu uruchamiania złamanego oprogramowania lub aby ominąć zabezpieczenia autora oprogramowania. Często to wygląda tak, że kupujący po zakupie oprogramowania otrzymuje licencję zablokowaną na sprzętowy identyfikator jednego komputera, który okazuje się być obrazem VMware i tak później oprogramowanie jest dystrybuowane (czytaj sprzedawane) dalej. Wersji natywnych, wykorzystujących systemowe różnice w [...]]]></description> <content:encoded><![CDATA[<h1><a href="http://www.secnews.pl/wp-content/uploads/2011/12/vmware.png"><img class="alignright size-full wp-image-1155" title="VMware" src="http://www.secnews.pl/wp-content/uploads/2011/12/vmware.png" alt="" width="43" height="155" /></a>Jak wykryć VMware</h1><p><a href="http://www.vmware.com">VMware</a> jest często wykorzystywane w celu uruchamiania złamanego oprogramowania lub aby ominąć zabezpieczenia autora oprogramowania.</p><p>Często to wygląda tak, że kupujący po zakupie oprogramowania otrzymuje licencję zablokowaną na <a href="http://www.secnews.pl/2011/11/26/sprzetowy-identyfikator-w-c-sharp/">sprzętowy identyfikator jednego komputera</a>, który okazuje się być <strong>obrazem VMware</strong> i tak później oprogramowanie jest <em>dystrybuowane</em> (czytaj <strong><em>sprzedawane</em></strong>) dalej.</p><p>Wersji natywnych, wykorzystujących systemowe różnice w działaniu na wykrywanie VMware są dziesiątki, chciałem przedstawić krótki snippet w C# do wykrywania może nie samego VMware, ale narzędzi <strong>VMware Tools</strong>, które instaluje się na wirtualnej maszynie, aby zapewnić komfortową pracę między wirtualną maszyną, a maszyną użytkownika (np. zapewnić funkcje <em>drag&amp;drop</em> plików etc.), jest to zwykle jedna z pierwszych czynności jakie robi się po zainstalowaniu systemu na wirtualnej maszynie.</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Runtime.InteropServices</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// potrzebne importy</span>
<span style="color: #008000;">&#91;</span>DllImport<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;KERNEL32.dll&quot;</span>, SetLastError<span style="color: #008000;">=</span><span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>
<span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #0600FF; font-weight: bold;">extern</span> IntPtr OpenEvent<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">uint</span> dwDesiredAccess, <span style="color: #6666cc; font-weight: bold;">bool</span> bInheritHandle, <span style="color: #6666cc; font-weight: bold;">string</span> lpName<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008000;">&#91;</span>DllImport<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;KERNEL32.dll&quot;</span>, SetLastError<span style="color: #008000;">=</span><span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>
<span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #0600FF; font-weight: bold;">extern</span> IntPtr CreateMutex<span style="color: #008000;">&#40;</span>IntPtr lpMutexAttributes, <span style="color: #6666cc; font-weight: bold;">bool</span> bInitialOwner, <span style="color: #6666cc; font-weight: bold;">string</span> lpName<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008000;">&#91;</span>DllImport<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;KERNEL32.dll&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>
<span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">extern</span> <span style="color: #0600FF; font-weight: bold;">static</span> Boolean CloseHandle<span style="color: #008000;">&#40;</span>IntPtr handle<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">const</span> <span style="color: #6666cc; font-weight: bold;">int</span> ERROR_ALREADY_EXISTS <span style="color: #008000;">=</span> <span style="color: #FF0000;">183</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
<span style="color: #008080; font-style: italic;">/// wykrywanie obecności VMWare po zainstalowanych narzędziach VMWare Tools</span>
<span style="color: #008080; font-style: italic;">/// na wirtualnej maszynie</span>
<span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
<span style="color: #008080; font-style: italic;">/// &lt;returns&gt;true jeśli wykryto zainstalowane narzędzia VMWare Tools&lt;/returns&gt;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">bool</span> IsVMWare<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// otwórz obiekt &quot;VMwareDnDManagerEvent&quot;</span>
    IntPtr eventHandle <span style="color: #008000;">=</span> OpenEvent<span style="color: #008000;">&#40;</span>0x001F0003, <span style="color: #0600FF; font-weight: bold;">false</span>, <span style="color: #666666;">&quot;VMwareDnDManagerEvent&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// jeśli udało się otworzyć event, to znaczy, że obecne są narzędzia VMWare Tools</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>eventHandle <span style="color: #008000;">!=</span> IntPtr<span style="color: #008000;">.</span><span style="color: #0000FF;">Zero</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        CloseHandle<span style="color: #008000;">&#40;</span>eventHandle<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// utwórz mutex o nazwie wykorzystywanej przez VMWare Tools</span>
    IntPtr mutexHandle <span style="color: #008000;">=</span> CreateMutex<span style="color: #008000;">&#40;</span>IntPtr<span style="color: #008000;">.</span><span style="color: #0000FF;">Zero</span>, <span style="color: #0600FF; font-weight: bold;">false</span>, <span style="color: #666666;">&quot;VMwareGuestDnDDataMutex&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// zamknij uchwyt mutexa</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>mutexHandle <span style="color: #008000;">!=</span> IntPtr<span style="color: #008000;">.</span><span style="color: #0000FF;">Zero</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        CloseHandle<span style="color: #008000;">&#40;</span>mutexHandle<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// jeśli mutex o tej nazwie istnieje, to znaczy, że są obecne narzędzia VMware Tools</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>Marshal<span style="color: #008000;">.</span><span style="color: #0000FF;">GetLastWin32Error</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> ERROR_ALREADY_EXISTS<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>Wykrywanie dotyczy <strong>VMware w wersji 7</strong>, w wersji 8 należy już zastosować <strong>inne nazwy obiektów</strong> ze względu na zaktualizowane VMware Tools, jeśli ktoś jest zainteresowany wykrywaniem VMware w najnowszych wersjach (i nie tylko tego środowiska, np. <strong>VirtualBox</strong> etc.), <a href="http://www.secnews.pl/kontakt/">proszę o kontakt</a>.</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2011/12/01/wykrywanie-vmware-w-c-sharp/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Sprzętowy identyfikator w C#</title><link>http://www.secnews.pl/2011/11/26/sprzetowy-identyfikator-w-c-sharp/</link> <comments>http://www.secnews.pl/2011/11/26/sprzetowy-identyfikator-w-c-sharp/#comments</comments> <pubDate>Sat, 26 Nov 2011 14:09:20 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[C#]]></category> <category><![CDATA[Programowanie]]></category> <category><![CDATA[hardware id]]></category> <category><![CDATA[sprzętowy identyfikator]]></category> <category><![CDATA[WMI]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=1141</guid> <description><![CDATA[Sprzętowy identyfikator komputera Krótki snippet w C# dla .NET 4 (jak skorygowali mnie koledzy, zadziała także od .NET 2) pobierający sprzętowy identyfikator maszyny, wykorzystując interfejs WMI, podobne algorytmy stosowane są w aplikacjach, których klucze licencyjne przypisywane są do jednego komputera using System.Management; using System.Security.Cryptography; &#160; /// &#60;summary&#62; /// pobiera sprzętowy identyfikator maszyny korzystając z interfejsu [...]]]></description> <content:encoded><![CDATA[<h1>Sprzętowy identyfikator komputera</h1><p>Krótki snippet w C# dla .NET 4 (jak skorygowali mnie koledzy, zadziała także od .NET 2) pobierający <strong>sprzętowy identyfikator maszyny</strong>, wykorzystując interfejs <a href="http://msdn.microsoft.com/en-us/library/aa394582.aspx">WMI</a>, podobne algorytmy stosowane są w aplikacjach, których klucze licencyjne przypisywane są do jednego komputera</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Management</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Security.Cryptography</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
<span style="color: #008080; font-style: italic;">/// pobiera sprzętowy identyfikator maszyny korzystając z interfejsu WMI</span>
<span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
<span style="color: #008080; font-style: italic;">/// &lt;returns&gt;identyfikator sprzętowy w formie hasha SHA1&lt;/returns&gt;</span>
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">String</span> hardwareId<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// tymczasowy string</span>
    <span style="color: #6666cc; font-weight: bold;">String</span> tempString <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// &quot;baza danych&quot;, z której pobieramy informacje o systemie</span>
    <span style="color: #6666cc; font-weight: bold;">String</span> wmiScope <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;root\CIMV2&quot;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// tabela zapytań WMI i pobieranych elementów</span>
    <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">&#91;</span>,<span style="color: #008000;">&#93;</span> wmiQueries <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">&#91;</span>,<span style="color: #008000;">&#93;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #008000;">&#123;</span> <span style="color: #666666;">&quot;SELECT ProcessorId FROM Win32_Processor&quot;</span>, <span style="color: #666666;">&quot;ProcessorId&quot;</span> <span style="color: #008000;">&#125;</span>,
        <span style="color: #008000;">&#123;</span> <span style="color: #666666;">&quot;SELECT Caption FROM Win32_Processor&quot;</span>, <span style="color: #666666;">&quot;Caption&quot;</span> <span style="color: #008000;">&#125;</span>,
        <span style="color: #008000;">&#123;</span> <span style="color: #666666;">&quot;SELECT Manufacturer FROM Win32_Processor&quot;</span>, <span style="color: #666666;">&quot;Manufacturer&quot;</span> <span style="color: #008000;">&#125;</span>,
        <span style="color: #008000;">&#123;</span> <span style="color: #666666;">&quot;SELECT Caption FROM Win32_BIOS&quot;</span>, <span style="color: #666666;">&quot;Caption&quot;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// wywołujemy kolejne zapytania WMI</span>
    <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> wmiQueries<span style="color: #008000;">.</span><span style="color: #0000FF;">GetLength</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">try</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// wykonaj zapytanie WMI</span>
            ManagementObjectSearcher searcher <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ManagementObjectSearcher<span style="color: #008000;">&#40;</span>wmiScope, wmiQueries<span style="color: #008000;">&#91;</span>i, <span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// zbuduj string z kolejnymi elementami odpowiedzi po zapytaniach WMI</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>ManagementObject obj <span style="color: #0600FF; font-weight: bold;">in</span> searcher<span style="color: #008000;">.</span><span style="color: #0000FF;">Get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                tempString <span style="color: #008000;">+=</span> obj<span style="color: #008000;">&#91;</span>wmiQueries<span style="color: #008000;">&#91;</span>i, <span style="color: #FF0000;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">catch</span> <span style="color: #008000;">&#40;</span>ManagementException exception<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// loguj błąd odczytu danych z WMI</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// generuj hash SHA1 ze wszystkich zebranych danych WMI</span>
    SHA1 hash <span style="color: #008000;">=</span> SHA1CryptoServiceProvider<span style="color: #008000;">.</span><span style="color: #0000FF;">Create</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// ciąg znaków zamień na tablicę bajtów</span>
    <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> plainTextBytes <span style="color: #008000;">=</span> Encoding<span style="color: #008000;">.</span><span style="color: #0000FF;">ASCII</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;">&#40;</span>tempString<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// oblicz hash SHA1</span>
    <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> hashBytes <span style="color: #008000;">=</span> hash<span style="color: #008000;">.</span><span style="color: #0000FF;">ComputeHash</span><span style="color: #008000;">&#40;</span>plainTextBytes<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// konwertuj hash SHA1 na postać tekstową (i usuń zbędne znaki &quot;-&quot;)</span>
    tempString <span style="color: #008000;">=</span> BitConverter<span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span>hashBytes<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Replace</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;-&quot;</span>, <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">return</span> tempString<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>Więcej o WMI na CodeProject:<br /> <a href="http://www.codeproject.com/KB/system/WQLByExample.aspx">http://www.codeproject.com/KB/system/WQLByExample.aspx</a></p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2011/11/26/sprzetowy-identyfikator-w-c-sharp/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>EasyHook v2.0</title><link>http://www.secnews.pl/2008/07/24/easyhook-v20/</link> <comments>http://www.secnews.pl/2008/07/24/easyhook-v20/#comments</comments> <pubDate>Thu, 24 Jul 2008 08:11:11 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[Assembler]]></category> <category><![CDATA[C#]]></category> <category><![CDATA[Programowanie]]></category> <category><![CDATA[Reversing]]></category> <category><![CDATA[apihooking]]></category> <category><![CDATA[easyhook]]></category> <category><![CDATA[hooking]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=242</guid> <description><![CDATA[Ciekawa biblioteka hookująca, pozwalająca na tworzenie hooków z poziomu języków programowania z rodziny .NET dla natywnych aplikacji. Przykłady oraz jej kody źródłowe na stronie: http://www.codeplex.com/easyhook/]]></description> <content:encoded><![CDATA[<p>Ciekawa biblioteka hookująca, pozwalająca na tworzenie hooków z poziomu języków programowania z rodziny .NET dla natywnych aplikacji.</p><p>Przykłady oraz jej kody źródłowe na stronie:<br /> <a href="http://www.codeplex.com/easyhook/">http://www.codeplex.com/easyhook/</a></p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2008/07/24/easyhook-v20/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Błąd kompilatora</title><link>http://www.secnews.pl/2007/10/11/blad-kompilatora/</link> <comments>http://www.secnews.pl/2007/10/11/blad-kompilatora/#comments</comments> <pubDate>Thu, 11 Oct 2007 05:17:35 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[C#]]></category> <category><![CDATA[Programowanie]]></category> <category><![CDATA[bug]]></category> <category><![CDATA[kompilator]]></category><guid isPermaLink="false">http://www.secnews.pl/2007/10/11/blad-kompilatora/</guid> <description><![CDATA[Ciekawy błąd kompilatora, który poprawnie kompiluje kod w C#, który w praktyce nie jest poprawny http://software.ericsink.com/entries/Not_All_Code_Paths_Return_A_Value.html]]></description> <content:encoded><![CDATA[<p>Ciekawy błąd kompilatora, który poprawnie kompiluje kod w C#, który w praktyce nie jest poprawny</p><p><a HREF="http://software.ericsink.com/entries/Not_All_Code_Paths_Return_A_Value.html">http://software.ericsink.com/entries/Not_All_Code_Paths_Return_A_Value.html</a></p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2007/10/11/blad-kompilatora/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
