<?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; crackme</title> <atom:link href="http://www.secnews.pl/tag/crackme/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>Rozwiązania konkursu Pimp My Crackme</title><link>http://www.secnews.pl/2011/07/01/rozwiazania-konkursu-pimp-my-crackme/</link> <comments>http://www.secnews.pl/2011/07/01/rozwiazania-konkursu-pimp-my-crackme/#comments</comments> <pubDate>Fri, 01 Jul 2011 21:57:06 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[Reversing]]></category> <category><![CDATA[crackme]]></category> <category><![CDATA[konkurs]]></category> <category><![CDATA[pimp my crackme]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=1048</guid> <description><![CDATA[Zgodnie z obietnicą, trochę spóźnioną, ale zawsze, publikuję opisy i rozwiązania wszystkich CrackMe z konkursu Pimp My Crackme. SecurityNews &#8211; Pimp My Crackme (Solutions + Sources).zip W międzyczasie powstało rozwiązanie oraz częściowy opis mechanizmu CrackMe j00ru na jego blogu. Pozostałe CrackMe nie zostały od czasu ich opublikowania rozwiązane.]]></description> <content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1049" title="Find" src="http://www.secnews.pl/wp-content/uploads/2011/07/find.png" alt="" width="128" height="128" />Zgodnie z obietnicą, trochę spóźnioną, ale zawsze, publikuję opisy i rozwiązania wszystkich CrackMe z konkursu <a href="http://www.secnews.pl/2011/04/28/konkurs-pimp-my-crackme/">Pimp My Crackme</a>.</p><p><a href="http://www.secnews.pl/wp-content/uploads/2011/07/SecurityNews%20-%20Pimp%20My%20Crackme%20(Solutions%20+%20Sources).zip">SecurityNews &#8211; Pimp My Crackme (Solutions + Sources).zip</a></p><p>W międzyczasie powstało <a href="http://gdtr.wordpress.com/2011/06/24/solving-pimp-crackme-by-j00ru-and-gynvael-coldwind/">rozwiązanie</a> oraz częściowy opis mechanizmu <a href="http://j00ru.vexillium.org/?p=866">CrackMe j00ru na jego blogu</a>.</p><p>Pozostałe CrackMe nie zostały od czasu ich opublikowania rozwiązane.</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2011/07/01/rozwiazania-konkursu-pimp-my-crackme/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Wyniki konkursu Pimp My Crackme</title><link>http://www.secnews.pl/2011/05/16/wyniki-konkursu-pimp-my-crackme/</link> <comments>http://www.secnews.pl/2011/05/16/wyniki-konkursu-pimp-my-crackme/#comments</comments> <pubDate>Mon, 16 May 2011 21:48:41 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[Reversing]]></category> <category><![CDATA[CONFidence]]></category> <category><![CDATA[crackme]]></category> <category><![CDATA[konkurs]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=960</guid> <description><![CDATA[Konkurs Pimp My Crackme doczekał się finału, nagrodą w konkursie na stworzenie ciekawego CrackMe była wejściówka na konferencję CONFidence 2011. Wyniki Otrzymałem łącznie 3 zgłoszenia, po przeanalizowaniu nadesłanych prac, wyniki prezentują się następująco: Miejsce 1 &#8211; Mateusz &#8220;j00ru&#8221; Jurczyk &#38; Gynvael Coldwind Za ciekawe podejście do problemu weryfikacji numeru seryjnego, techniczne aspekty związane z funkcjonowaniem [...]]]></description> <content:encoded><![CDATA[<p>Konkurs <a href="http://www.secnews.pl/2011/04/28/konkurs-pimp-my-crackme/">Pimp My Crackme</a> doczekał się finału, nagrodą w konkursie na stworzenie ciekawego <strong>CrackMe</strong> była wejściówka na <a href="http://2011.confidence.org.pl/">konferencję CONFidence 2011</a>.</p><h1>Wyniki</h1><p>Otrzymałem łącznie <strong>3 zgłoszenia</strong>, po przeanalizowaniu nadesłanych prac, wyniki prezentują się następująco:</p><h4><img class="alignright size-full wp-image-964" title="Gold" src="http://www.secnews.pl/wp-content/uploads/2011/05/1305580703_Trophy_Gold.png" alt="" width="128" height="128" />Miejsce 1 &#8211; Mateusz &#8220;j00ru&#8221; Jurczyk &amp; Gynvael Coldwind</h4><p>Za ciekawe podejście do problemu weryfikacji numeru seryjnego, techniczne aspekty związane z funkcjonowaniem CrackMe oraz nietypowy interfejs.</p><h4>Miejsce 2 - hasherezade</h4><p>Za custom encryptora (i trud włożony w jego poprawne funkcjonowanie) oraz interesujący algorytm weryfikujący.</p><h4>Miejsce 3 &#8211; Grzegorz &#8220;haker500&#8243; Jastrzębski</h4><p>Za sam fakt chęci uczestnictwa w konkursie oraz stworzenie CrackMe w assemblerze.</p><h1>Nagrody</h1><p><img class="alignright size-full wp-image-966" title="Gift" src="http://www.secnews.pl/wp-content/uploads/2011/05/1305581012_box2.png" alt="" width="128" height="128" />Chciałbym w tym miejscu <strong>podziękować wszystkim uczestnikom</strong> za to, że dają jeszcze nadzieję przetrwania dziedzinie jaką jest <em>reverse-engineering</em> i w ramach podziękowania, udało mi się namówić organizatorów konferencji <strong>CONFidence</strong> (podziękowania należą się panu <strong>Sławomirowi Jabsowi</strong>, który podzielił moje zdanie, że warto wspierać takie inicjatywy i ludzi, którzy w nich uczestniczą) do przyznania <strong>wszystkim uczestnikom nagrody w postaci 3 wejściówek</strong>!</p><h1>Download</h1><p>Wszystkie CrackMe są do ściągnięcia poniżej:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2011/05/SecurityNews-Pimp-My-Crackme.zip">SecurityNews-Pimp-My-Crackme.zip</a> (2,46 MB)</p><h1>Rozwiązania</h1><p>Rozwiązania CrackMe zostaną opublikowane po około miesiącu czasu wraz z komentarzami autorów oraz ich kodami źródłowymi.</p><h1>Fin</h1><p>Dziękuję wszystkim uczestnikom konkursu i zachęcam do brania udziału w innych konkursach, które wkrótce ruszą na stronie.</p><p><a href="http://2011.confidence.org.pl"><img class="size-full wp-image-968 aligncenter" title="CONFidence 2011 Kraków" src="http://www.secnews.pl/wp-content/uploads/2011/05/confidence2011.jpg" alt="" width="254" height="53" /></a></p><p>Pozostałych czytelników <strong>zachęcam do uczestnictwa w konferencji CONFidence</strong>, bo zostało już niewiele czasu, będzie można na niej spotkać m.in. naszych laureatów (i jedną laureatkę).</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2011/05/16/wyniki-konkursu-pimp-my-crackme/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Konkurs Pimp My CrackMe</title><link>http://www.secnews.pl/2011/04/28/konkurs-pimp-my-crackme/</link> <comments>http://www.secnews.pl/2011/04/28/konkurs-pimp-my-crackme/#comments</comments> <pubDate>Thu, 28 Apr 2011 18:49:59 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[Reversing]]></category> <category><![CDATA[CONFidence]]></category> <category><![CDATA[crackme]]></category> <category><![CDATA[konkurs]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=943</guid> <description><![CDATA[Serwis SecurityNews organizuje konkurs na stworzenie wyjątkowego CrackMe. Do wygrania wejściówka na konferencję CONFidence 2011 odbywającą się w Krakowie w dniach 24-25 maja o wartości 700 zł. Wymagania: tylko Windows 32 bit 1 plik PE exe dowolny język programowania Co będzie oceniane: skala trudności pomysłowość innowacyjność wizualne walory Co nie jest akceptowane: użycie publicznych pakerów [...]]]></description> <content:encoded><![CDATA[<p><a href="http://www.secnews.pl/wp-content/uploads/2011/04/money_bag.png"><img class="alignright size-full wp-image-944" title="Kasa" src="http://www.secnews.pl/wp-content/uploads/2011/04/money_bag.png" alt="" width="128" height="128" /></a>Serwis <strong>SecurityNews</strong> organizuje konkurs na stworzenie wyjątkowego <strong>CrackMe</strong>. Do wygrania wejściówka na konferencję <a href="http://2011.confidence.org.pl/">CONFidence 2011</a> odbywającą się w Krakowie w dniach 24-25 maja <strong>o wartości 700 zł</strong>.</p><p>Wymagania:</p><ul><li>tylko Windows 32 bit</li><li>1 plik PE exe</li><li>dowolny język programowania</li></ul><p><img class="alignright size-full wp-image-946" title="Pomysł" src="http://www.secnews.pl/wp-content/uploads/2011/04/idea.png" alt="" width="128" height="128" />Co będzie <strong>oceniane</strong>:</p><ul><li>skala trudności</li><li>pomysłowość</li><li>innowacyjność</li><li>wizualne walory</li></ul><p><img class="alignright size-full wp-image-949" title="Error" src="http://www.secnews.pl/wp-content/uploads/2011/04/dialog-error.png" alt="" width="128" height="128" />Co <strong>nie jest</strong> akceptowane:</p><ul><li>użycie publicznych pakerów / protektorów / obfuscatorów (custom jak najbardziej, z tym, że trzeba będzie podać opis techniczny jego działania, jako dodatkowego narzędzia użytego do zabezpieczenia)</li><li>z założenia niełamliwe CrackMe odpadają (czyli bez RSA-2048 itp.)</li></ul><p><img class="alignright size-full wp-image-951" title="Checklist" src="http://www.secnews.pl/wp-content/uploads/2011/04/check.png" alt="" width="128" height="128" />Co <strong>należy</strong> dostarczyć:</p><ul><li>plik binarny CrackMe</li><li>pliki źródłowe CrackMe</li><li>krótki opis CrackMe w pliku tekstowym (wymagania sprzętowe, cel CrackMe)</li><li>rozwiązanie wraz z opisem mechanizmu zabezpieczenia (krótki)</li></ul><p>CrackMe należy wysłać <strong>do 14 maja 2011</strong> na <a href="http://www.secnews.pl/kontakt/">redakcyjny adres e-mail</a>. Autor <strong>zwycięskiego</strong> CrackMe zostanie ogłoszony <strong>16 maja</strong> i otrzyma darmową wejściówkę na konferencję <strong>CONFidence 2011</strong> (imienna, nie można jej sprzedać!).</p><p>Wszystkie zgłoszone CrackMe będą później stopniowo <strong>publikowane</strong> na łamach naszego serwisu niosąc rozrywkę wszystkim czytelnikom, a po miesiącu czasu będzie publikowane oficjalne rozwiazanie do kolejnego CrackMe.</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2011/04/28/konkurs-pimp-my-crackme/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Crackme .NET &#8211; Rozwiązania</title><link>http://www.secnews.pl/2009/06/22/crackme-net-rozwiazania/</link> <comments>http://www.secnews.pl/2009/06/22/crackme-net-rozwiazania/#comments</comments> <pubDate>Mon, 22 Jun 2009 21:32:40 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[Artykuły]]></category> <category><![CDATA[Reversing]]></category> <category><![CDATA[.net]]></category> <category><![CDATA[crackme]]></category> <category><![CDATA[dotnet]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=498</guid> <description><![CDATA[Jakiś czas temu napisałem o konkursie na crackme dla .net zorganizowanym przez Krakowska Grupa Developerów .NET, dzisiaj z ciekawości tam zajrzałem i zobaczyłem, że jest tylko 1 rozwiązanie, więc postanowiłem zadziałać. 1. NemCrackMe # 1 by Pawlos Standardowy schemat name/serial: Szybka wrzutka do Reflectora i dekompilacja kodu po kliknięciu &#8220;Please Crack Me&#8221;: Mówiąc w skrócie, kod [...]]]></description> <content:encoded><![CDATA[<p>Jakiś czas temu <a href="http://www.secnews.pl/2009/01/06/konkurs-na-crackme-w-net/">napisałem</a> o konkursie na crackme dla .net zorganizowanym przez <a href="http://ms-groups.pl/kgd.net/Konkurs_CrackMe/default.aspx">Krakowska Grupa Developerów .NET</a>, dzisiaj z ciekawości tam zajrzałem i zobaczyłem, że jest tylko 1 rozwiązanie, więc postanowiłem zadziałać.</p><h3>1. NemCrackMe # 1 by Pawlos</h3><p>Standardowy schemat name/serial:</p><p><img class="alignnone size-full wp-image-499" title="NemCrackMe # 1 by Pawlos" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm1.png" alt="NemCrackMe # 1 by Pawlos" width="389" height="176" /></p><p>Szybka wrzutka do <a href="http://www.red-gate.com/products/reflector/">Reflectora</a> i dekompilacja kodu po kliknięciu<em> &#8220;Please Crack Me&#8221;</em>:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm1_check_serial.png"><img class="alignnone size-medium wp-image-501" title="cm1_check_serial" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm1_check_serial-300x217.png" alt="cm1_check_serial" width="300" height="217" /></a></p><p>Mówiąc w skrócie, kod na powyższym obrazku, wywołuje jakąś magiczną funkcję (która jest dynamicznie tworzona) z 2 parametrami, którymi są teksty z kontrolek edycyjnych:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> button1_Click<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Type type <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">tBuilder</span><span style="color: #008000;">.</span><span style="color: #0000FF;">CreateType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    type<span style="color: #008000;">.</span><span style="color: #0000FF;">GetMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;o&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Invoke</span><span style="color: #008000;">&#40;</span>Activator<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateInstance</span><span style="color: #008000;">&#40;</span>type<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">object</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">textBox1</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span>, <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">textBox2</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>Jak nietrudno zgadnąć jest to właściwa metoda sprawdzająca poprawność hasła. Ok, tylko gdzie ona jest hmm? Bez większego doświadczenia w programowaniu w C#, po prostu kliknąłem w inne metody crackme, w tym w konstruktor formy i wszystko stało się jasne:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm1_dynamic_code.png"><img class="alignnone size-medium wp-image-505" title="cm1_dynamic_code" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm1_dynamic_code-300x217.png" alt="cm1_dynamic_code" width="300" height="217" /></a></p><p>Crackme generuje funkcję sprawdzającą poprawność wpisanego hasła w konstruktorze formy, funkcja generowana jest <strong>dynamicznie w pamięci</strong> wykorzystując składnię języka <a href="http://en.wikipedia.org/wiki/Common_Intermediate_Language">IL</a>.</p><p>Składnia języka IL może nie jest jakaś szczególnie zawiła, ale zrozumienie tego kodu bez jakiegokolwiek doświadczenia może być trudne, idealnie byłoby gdybyśmy mogli skorzystać z Reflectora do zdekompilowania kodu.</p><p>Aby to zrobić, utworzyłem pomocniczy program, który tworzy assembly .net-we z powyższą procedurą i zapisuje je do pliku DLL, dzięki czemu można go wgrać do Reflectora i pokaże nam wszystko ładnie na tacy. Po dekompilacji otrzymałem taki algorytm:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> MyDynamicType
<span style="color: #008000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// Fields</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> coes<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span> num1<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span> num2<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// Methods</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> MyDynamicType<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> o<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span>, <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// konstruktor</span>
<span style="color: #0600FF; font-weight: bold;">public</span> MyDynamicType<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;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">num1</span> <span style="color: #008000;">=</span> 0x654321<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">num2</span> <span style="color: #008000;">=</span> 0x123456<span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">coes</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> 0x21, <span style="color: #FF0000;">12</span>, 0x5d3, <span style="color: #FF0000;">110</span>, <span style="color: #FF0000;">5</span>, 0x610, <span style="color: #FF0000;">8</span> <span style="color: #008000;">&#125;</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> o<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> text1, <span style="color: #6666cc; font-weight: bold;">string</span> text2<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">long</span> num <span style="color: #008000;">=</span> 0x73L<span style="color: #008000;">;</span>
    <span style="color: #6666cc; font-weight: bold;">int</span> num2 <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">char</span> ch <span style="color: #0600FF; font-weight: bold;">in</span> text1<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        num <span style="color: #008000;">+=</span> Math<span style="color: #008000;">.</span><span style="color: #0000FF;">Abs</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#40;</span>ch <span style="color: #008000;">*</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">coes</span><span style="color: #008000;">&#91;</span>num2<span style="color: #008000;">++</span> <span style="color: #008000;">%</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">coes</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
    num <span style="color: #008000;">+=</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">num1</span><span style="color: #008000;">;</span>
    num <span style="color: #008000;">-=</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">num2</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>text2 <span style="color: #008000;">==</span> num<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;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        MessageBox<span style="color: #008000;">.</span><span style="color: #0000FF;">Show</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Udało się&quot;</span>, <span style="color: #666666;">&quot;NemCrackMe&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #008000;">&#125;</span></pre></div></div><p>Name: <strong>bartosz</strong> Password: <strong>5779531</strong></p><p>No i to by było na tyle. Użyte zabezpieczenie raczej nie jest dobrym przykładem, gdyż nawet bez większego doświadczenia można zrozumieć zasadę jego działania, myślę, że dodatkowym utrudnieniem byłaby obfuskacja instrukcji sprawdzających numer seryjny, choćby seria zmieniająca codeflow (swoją drogą to niezła baza do takich eksperymentów).</p><p>Generator kluczy oraz pomocniczy program tworzący assembly dostępny jest na końcu artykułu wraz z innymi rozwiązaniami.</p><p>Dzisiaj przeglądałem <a href="http://www.codeplex.com/reflectoraddins">kolekcję wtyczek do Reflectora</a> i jest tam plugin o nazwie <a href="http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=ReflectionEmitLanguage">ReflectionEmitLanguage</a>, który z kodu IL generuje kod w HLL generujący dynamiczny kod IL wskazanej metody i chyba (głowy nie dam) właśnie to zostało użyte do wygenerowania funkcji sprawdzającej hasło w tym crackme.</p><h3>2. PIJA CrackMe 1</h3><p>Chyba najciekawsze crackme i zarazem stosujące dobre zabezpieczenia. Ale od początku:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm2.png"><img class="alignnone size-medium wp-image-528" title="PIJA CrackMe 1" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm2-300x125.png" alt="PIJA CrackMe 1" width="300" height="125" /></a></p><p>Crackme wymaga wpisania numeru seryjnego i kodu aktywacyjnego, jednocześnie wyświetla kod identyfikacyjny (jak nietrudno zgadnąć, będzie to mieć coś wspólnego z identyfikatorem naszego sprzętu).</p><p>Szybka dekompilacja pod Reflectorem metody na naciśniecie buttona sprawdzającego:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> enter_Click<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<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: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> buffer3<span style="color: #008000;">;</span>
        <span style="color: #6666cc; font-weight: bold;">string</span> text <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">txtSerial</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// generuj klucz deszyfrujacy</span>
        <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> key <span style="color: #008000;">=</span> Utils<span style="color: #008000;">.</span><span style="color: #0000FF;">GetKey</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">regKey</span>, text<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// generuj wektor inicjujacy</span>
        <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> iV <span style="color: #008000;">=</span> Utils<span style="color: #008000;">.</span><span style="color: #0000FF;">GetIV</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        Rijndael rijndael <span style="color: #008000;">=</span> Rijndael<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>
        rijndael<span style="color: #008000;">.</span><span style="color: #0000FF;">Padding</span> <span style="color: #008000;">=</span> PaddingMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Zeros</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// otworz plik crackmelib.dll</span>
        <span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008000;">&#40;</span>FileStream stream <span style="color: #008000;">=</span> File<span style="color: #008000;">.</span><span style="color: #0000FF;">Open</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;crackmelib.dll&quot;</span>, FileMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Open</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            buffer3 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span>stream<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">new</span> CryptoStream<span style="color: #008000;">&#40;</span>stream, rijndael<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateDecryptor</span><span style="color: #008000;">&#40;</span>key, iV<span style="color: #008000;">&#41;</span>, CryptoStreamMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;">&#40;</span>buffer3, <span style="color: #FF0000;">0</span>, <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span> stream<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><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;">// wywolaj funkcje A() z odszyfrowanej (w pamieci) biblioteki crackmelib.dll</span>
        <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>IA<span style="color: #008000;">&#41;</span> Assembly<span style="color: #008000;">.</span><span style="color: #0000FF;">Load</span><span style="color: #008000;">&#40;</span>buffer3<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">CreateInstance</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;crackmelib.B&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">A</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">txtActivationCode</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">&#41;</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;">&#123;</span>
        MessageBox<span style="color: #008000;">.</span><span style="color: #0000FF;">Show</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Uuuups! Try again&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>Dla rozjaśnienia kolejne kroki:</p><ol><li>Generowany jest klucz deszyfrujący <a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard">AES</a> na podstawie <em>&#8220;Activation request&#8221;</em> i <em>&#8220;Serial&#8221;</em></li><li>Generowany jest <a href="http://en.wikipedia.org/wiki/Initialization_vector">wektor inicjujący</a> dla AES</li><li>Plik <em>&#8220;crackmelib.dll&#8221;</em> zostaje odszyfrowany w pamięci według ustawionych parametrów</li><li>Odszyfrowana biblioteka<em> &#8220;crackmelib.dll&#8221;</em> zostaje załadowana do pamięci</li><li>Z biblioteki <em>&#8220;crackmelib.dll&#8221;</em> zostaje wywołana funkcja <strong>A()</strong> z parametrem jakim jest kod <strong>kod aktywacyjny</strong></li></ol><p>Użycie wychwytywania wyjątków z użyciem <em>try{}</em> <em>catch{}</em> sugeruje, że albo klucz deszyfrujący będzie poprawny i nastąpi poprawne odszyfrowanie i załadowanie assembly z pliku <em>&#8220;crackmelib.dll&#8221;</em>, albo nastąpi wyjątek.</p><h4>Activation request</h4><p>Wyświetlany po uruchomieniu crackme identyfikator generowany jest w konstruktorze głównej formy crackme:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_request_code.png"><img class="alignnone size-medium wp-image-530" title="cm2_request_code" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_request_code-300x250.png" alt="cm2_request_code" width="300" height="250" /></a></p><p>Za jego generację odpowiada biblioteka <em>&#8220;CommonInterface.dll&#8221;</em>:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><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> GetRequestCode<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;">return</span> <span style="color: #008000;">&#40;</span>GetProcessorID<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">+</span> GetBIOSSerialNumber<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</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;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> GetProcessorID<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    ManagementObjectSearcher searcher <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ManagementObjectSearcher<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;select * from Win32_Processor&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>ManagementObject obj2 <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>
        <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>PropertyData data <span style="color: #0600FF; font-weight: bold;">in</span> obj2<span style="color: #008000;">.</span><span style="color: #0000FF;">Properties</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>data<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToUpper</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;PROCESSORID&quot;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span> data<span style="color: #008000;">.</span><span style="color: #0000FF;">Value</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: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">return</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;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> GetBIOSSerialNumber<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    ManagementObjectSearcher searcher <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ManagementObjectSearcher<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;select * from Win32_BIOS&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>ManagementObject obj2 <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>
        <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>PropertyData data <span style="color: #0600FF; font-weight: bold;">in</span> obj2<span style="color: #008000;">.</span><span style="color: #0000FF;">Properties</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>data<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToUpper</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;SERIALNUMBER&quot;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span> data<span style="color: #008000;">.</span><span style="color: #0000FF;">Value</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: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>Odczytywanie danych o procesorze i danych BIOS odbywa się poprzez klasy interfejsu <a href="http://msdn.microsoft.com/en-us/library/aa394582.aspx">WMI</a> (przykłady użycia na <a href="http://www.codeproject.com/info/search.aspx?artkw=WMI">CodeProject</a>).</p><h4>Wektor inicjujący AES</h4><p>Wektor generowany jest w kodzie biblioteki <em>&#8220;CommonInterface.dll&#8221;</em>:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><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;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> GetIV<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;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> obj2 <span style="color: #0600FF; font-weight: bold;">in</span> Assembly<span style="color: #008000;">.</span><span style="color: #0000FF;">GetExecutingAssembly</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Evidence</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>obj2 <span style="color: #008000;">is</span> Hash<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>Hash<span style="color: #008000;">&#41;</span> obj2<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">MD5</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;">return</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>Kilka słów wyjaśnienia, metoda <a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getexecutingassembly.aspx">GetExecutingAssembly</a>() zwraca assembly, w którym znajduje się aktualnie wykonywany kod, czyli w tym przypadku będzie to assembly &#8220;CommonInterface.dll&#8221;.</p><p>Następnie enumerowane są wszystkie elementy assembly określone jako <a href="http://msdn.microsoft.com/en-us/library/system.reflection.assembly.evidence.aspx">Evidence</a>, które są obiektem typu Hash. Może to troche skomplikowane, bo dokumentacja też tego jakoś prosto nie wyjaśnia, ale debugging wykazał, że obliczana jest po prostu suma MD5 z pliku <em>&#8220;CommonInterface.dll&#8221;</em>.</p><p>Czyli wektor inicjujący stanowi sumę kontrolną pliku crackme, jest to zapewne zabezpieczenie przed patchowaniem pliku, bo jakakolwiek zmiana, spowoduje wygenerowanie błędnego wektora inicjującego.</p><h4>Klucz deszyfrujący AES</h4><p>Klucz deszyfrujący generowany jest w funkcji <em>GetKey()</em> znajdującej się w tej samej bibliotece <em>&#8220;CommonInterface.dll&#8221;</em>:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><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;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> GetKey<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> reques, <span style="color: #6666cc; font-weight: bold;">string</span> serial<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> buffer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #FF0000;">0</span>, <span style="color: #FF0000;">5</span>, <span style="color: #FF0000;">7</span>, 0x59, 0x38, 0x22, 0x4e, 0x22, 0x38, 0x4e, 0x17, 0x2d, <span style="color: #FF0000;">9</span>, <span style="color: #FF0000;">12</span>, 0x38, 0x4e,
        0x22, 0x57, <span style="color: #FF0000;">90</span>, 0x6f, 0x17, 0x4e, 0x62, 0x17, 0x38, <span style="color: #FF0000;">12</span>, 0x5f, 0x2c, 0x43, 0x43, <span style="color: #FF0000;">12</span>, 0x17
     <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// pobierz 1 czesc identyfikatora sprzetowego (o dlugosci polowy buffer)</span>
    <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> bytes <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>reques<span style="color: #008000;">.</span><span style="color: #0000FF;">Substring</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span>, buffer<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">/</span> <span style="color: #FF0000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// numer seryjny z base64 zamien na bajty</span>
    <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> buffer3 <span style="color: #008000;">=</span> Convert<span style="color: #008000;">.</span><span style="color: #0000FF;">FromBase64String</span><span style="color: #008000;">&#40;</span>serial<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// klucz deszyfrujacy = pierwsza_czesc_hardware_id[] + numer_seryjny[]</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;">&amp;</span>lt<span style="color: #008000;">;</span> <span style="color: #008000;">&#40;</span>buffer<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">/</span> <span style="color: #FF0000;">2</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>
        buffer<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#40;</span>bytes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #008000;">+</span> buffer3<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</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;">return</span> buffer<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>O sile tego crackme świadczy właśnie ta powyższa procka, otóż cała reszta kodu znajdująca się w <em>crackmelib.dll</em> jest zaszyfrowana <a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.createdecryptor.aspx">algorytmem AES z kluczem o długości 32 bajtów</a> (256 bitów), klucz deszyfrujący tworzony jest z pary identyfikatora sprzętowego i numeru seryjnego (+reszta tablicy <em>buffer</em>) i musi być poprawny, inaczej odszfrowany kod będzie nieprawidłowy i nie będzie można załadować tego assembly.</p><p>Krótko mówiąć bez znajomości poprawnej pary identyfikator + serial nie można odszyfrować reszy kodu potrzebnego do pracy. Można próbować brute forcem znaleźć poprawną kombinację pierwszych 16 bajtów tablicy <em>buffer</em> (128 bitów), jednak jak przypuszczam taka próba zajęłaby więcej czasu niż czekanie przeze mnie na prezenty od świętego mikołaja za dobre zachowanie <img src='http://www.secnews.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p>Schemat ten przypomina stosowane w exe-protektorach makra szyfrujące kod według danych licencyjnych, ma to swoje zalety i wady, ale z pewnością można powiedzieć, że to dobre zabezpieczenie z punktu widzenia łamiącego.</p><p>Po tej szybkiej analizie miałem już sobie odpuścić, jednak z ciekawości zajrzałem jeszcze raz na stronę konkursową i mój wzrok przykuło rozwiązanie własnie do tego crackme i <a href="http://ms-groups.pl/kgd.net/Konkurs_CrackMe/Lists/Forum%20konkursowe/Flat.aspx?RootFolder=%2Fkgd%2Enet%2FKonkurs%5FCrackMe%2FLists%2FForum%20konkursowe%2FPIJA%20CrackMe%201&amp;FolderCTID=0x0120020070660992493BC44DA19C94BED291A957">temat na konkursowym forum</a>, gdzie było zamieszczone ogłoszenie o umieszczeniu crackme oraz HA! autor podaje poprawną serię kodu identyfikatora sprzętowego, numeru seryjnego oraz kodu aktywacyjnego. No to teraz z górki <img src='http://www.secnews.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p><p>Mając te dane można stworzyć dekoder (w samym crackme nie można wpisać tego podanego identyfikatora sprzętowego), który wykorzystując podane parametry odszyfruje plik <em>crackmelib.dll</em>:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        <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;">void</span> DecodeAssembly<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Assembly asmCrackme<span style="color: #008000;">;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span> asmFile <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;CommonInterface.dll&quot;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// sciezka, gdzie znajduje sie crackme</span>
            <span style="color: #6666cc; font-weight: bold;">string</span> asmPath <span style="color: #008000;">=</span> Path<span style="color: #008000;">.</span><span style="color: #0000FF;">Combine</span><span style="color: #008000;">&#40;</span>Directory<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCurrentDirectory</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, asmFile<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;[i] Loading {0} assembly.&quot;</span>, asmFile<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// zaladuj assembly z pliku</span>
            asmCrackme <span style="color: #008000;">=</span> Assembly<span style="color: #008000;">.</span><span style="color: #0000FF;">LoadFile</span><span style="color: #008000;">&#40;</span>asmPath<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>asmCrackme <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>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;[!] Cannot load assembly!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// dekoduj tak jak to robi crackme</span>
            <span style="color: #0600FF; font-weight: bold;">try</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">// zestaw poprawnych seriali podanych przez autora na forum konkursowym:</span>
                <span style="color: #008080; font-style: italic;">// http://ms-groups.pl/kgd.net/Konkurs_CrackMe/Lists/Forum%20konkursowe/Flat.aspx?RootFolder=%2Fkgd%2Enet%2FKonkurs%5FCrackMe%2FLists%2FForum%20konkursowe%2FPIJA%20CrackMe%201&amp;amp;FolderCTID=0x0120020070660992493BC44DA19C94BED291A957</span>
                <span style="color: #008080; font-style: italic;">// (inaczej pozostaje brute force 128 bitowej wartosci)</span>
                <span style="color: #6666cc; font-weight: bold;">string</span> validRequest <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;BFEBFBFF00010676BPSHY3J&quot;</span><span style="color: #008000;">;</span>
                <span style="color: #6666cc; font-weight: bold;">string</span> validSerial <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;9gfHIoPHxMVLJzPk+QKHeg==&quot;</span><span style="color: #008000;">;</span>
                <span style="color: #6666cc; font-weight: bold;">string</span> validActivation <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;+1XY8HQBb8KmSaMS/X8RUDafoZOIhHZb9bpgiYwW78Cpnz1j9WfdwpQ+5Yq8RU9l&quot;</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> buffer3<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> key <span style="color: #008000;">=</span> GetKey<span style="color: #008000;">&#40;</span>validRequest, validSerial<span style="color: #008000;">&#41;</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> iV <span style="color: #008000;">=</span> GetIV<span style="color: #008000;">&#40;</span>asmCrackme<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;[i] Decryption key:<span style="color: #008080; font-weight: bold;">\r</span><span style="color: #008080; font-weight: bold;">\n</span><span style="color: #008080; font-weight: bold;">\r</span><span style="color: #008080; font-weight: bold;">\n</span>{0}&quot;</span>, HexDump<span style="color: #008000;">&#40;</span>key<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;[i] Initialization vector:<span style="color: #008080; font-weight: bold;">\r</span><span style="color: #008080; font-weight: bold;">\n</span><span style="color: #008080; font-weight: bold;">\r</span><span style="color: #008080; font-weight: bold;">\n</span>{0}&quot;</span>, HexDump<span style="color: #008000;">&#40;</span>iV<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                Rijndael rijndael <span style="color: #008000;">=</span> Rijndael<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>
                rijndael<span style="color: #008000;">.</span><span style="color: #0000FF;">Padding</span> <span style="color: #008000;">=</span> PaddingMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Zeros</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008000;">&#40;</span>FileStream stream <span style="color: #008000;">=</span> File<span style="color: #008000;">.</span><span style="color: #0000FF;">Open</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;crackmelib.dll&quot;</span>, FileMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Open</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    buffer3 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span>stream<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">new</span> CryptoStream<span style="color: #008000;">&#40;</span>stream, rijndael<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateDecryptor</span><span style="color: #008000;">&#40;</span>key, iV<span style="color: #008000;">&#41;</span>, CryptoStreamMode<span style="color: #008000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;">&#40;</span>buffer3, <span style="color: #FF0000;">0</span>, <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>stream<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><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;">// zapisz zdekodowany plik</span>
                File<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteAllBytes</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;crackmelib.decoded.dll&quot;</span>, buffer3<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;[i] Assembly decoded successfully.&quot;</span><span style="color: #008000;">&#41;</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;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;[!] Cannot decode file (invalid keys?)!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span></pre></div></div><p>Po odpaleniu tego kodu, otrzymamy ładne assembly z ostatnim fragmentem crackme.</p><h4>Analiza crackmelib.dll</h4><p>Pamiętacie, po odszyfrowaniu tej biblioteki, wywoływana była metoda <em>A()</em> z parametrem, jakim był kod aktywacyjny:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_crackmelib.png"><img class="alignnone size-medium wp-image-532" title="cm2_crackmelib" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_crackmelib-300x217.png" alt="cm2_crackmelib" width="300" height="217" /></a></p><p>Metoda na początku porównuje hash pliku <em>&#8220;PIJA_Crackme.exe&#8221;</em> z zakodowaną wartością i jeśli się nie pokrywają, kasowany jest plik <em>crackmelib.dll</em>, a następnie tworzona jest jego kopia z losową zawartością:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> MessFile<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">int</span> count <span style="color: #008000;">=</span> 0x1800<span style="color: #008000;">;</span>
    File<span style="color: #008000;">.</span><span style="color: #0000FF;">Delete</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;crackmelib.dll&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    FileStream stream <span style="color: #008000;">=</span> File<span style="color: #008000;">.</span><span style="color: #0000FF;">Create</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;crackmelib.dll&quot;</span><span style="color: #008000;">&#41;</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> buffer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span>count<span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
    Random random <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Random<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</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;">&amp;</span>lt<span style="color: #008000;">;</span> count<span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        buffer<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#41;</span> random<span style="color: #008000;">.</span><span style="color: #0000FF;">Next</span><span style="color: #008000;">&#40;</span>0xff<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
    stream<span style="color: #008000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;">&#40;</span>buffer, <span style="color: #FF0000;">0</span>, count<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    stream<span style="color: #008000;">.</span><span style="color: #0000FF;">Flush</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    stream<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></pre></div></div><p>Jeśli ktoś zpatchuje główny plik crackme, nadpisana zostanie zaszyfrowana biblioteka sprawdzająca poprawność kodu aktywacyjnego i wszelkie następne próby rejestracji skończą się niepowodzeniem.</p><p>Keygen i pomocnicza aplikacja dekodująca znajduje się na końcu artykułu, jeszcze dla jasności:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_cracked.png"><img class="alignnone size-medium wp-image-533" title="cm2_cracked" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_cracked-300x160.png" alt="cm2_cracked" width="300" height="160" /></a></p><p>Było to najlepsze crackme ze wszystkich, a użyte zabezpieczenia znakomicie sprawdzają się w <strong>warunkach bojowych</strong>,  wzajemnie sprawdzane sumy kontrolne są doskonałą metodą na ochrone przed patchowaniem (oczywiście bardziej ukryte), a zastosowany algorytm szyfrujący sprawia, że złamanie tak zabezpieczonej aplikacji bez poprawnego klucza jest praktycznie niemożliwe.</p><p>Na koniec jeszcze małe <em>TheDailyWTF</em>, które wyświetliło się podczas debugowania crackme pluginem <a href="http://www.codeplex.com/deblector">Deblector</a> (który i tak się do niczego raczej nie przydał):</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_zombie.png"><img class="alignnone size-medium wp-image-538" title="cm2_zombie" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm2_zombie-300x166.png" alt="cm2_zombie" width="300" height="166" /></a></p><p><a href="http://www.google.pl/search?q=zombies+ahead">Zombies ahead</a>?</p><h3>3. MKS CrackMe 1</h3><p>Bardzo proste crackme, dodatkowo opublikowane razem z rozwiązaniem (WTF?) .</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm3_unlocked.png"><img class="alignnone size-medium wp-image-516" title="MKS CrackMe 1" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm3_unlocked-300x207.png" alt="MKS CrackMe 1" width="300" height="207" /></a></p><p>W zasadzie, jedynym problemem jest to, że domyślnie wyłączony jest button do sprawdzania hasła:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> Form1_Load<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">button1</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Enabled</span> <span style="color: #008000;">=</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>W rozwiązaniu zaproponowanym przez autora crackme (hehe nie moge <img src='http://www.secnews.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) użyty jest plugin Reflectora o nazwie <a href="http://sebastien.lebreton.free.fr/reflexil/">Reflexil</a> do spatchowania tego kodu, my jednak będziemy oryginalni i użyjemy IDA do znalezienia kodu wyłączającego button:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm3_patch.png"><img class="alignnone size-medium wp-image-517" title="cm3_patch" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm3_patch-300x217.png" alt="cm3_patch" width="300" height="217" /></a></p><p>Jak widać na obrazku powyżej, mamy tam instrukcje <em>&#8220;ldc.i4.0&#8243;</em> (flaga FALSE), która sprawia, że button jest wyłączany, trzeba tam wrzucić instrukcję <em>&#8220;ldc.i4.1&#8243;</em>, problemem może być znalezienie jej hexadecymalnego odpowiednika, ale wystarczy przewinąć deadlisting w IDA (albo zajrzeć na stronę <a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes_members.aspx">MSDN z listą opcodów</a> albo <a href="http://www.koders.com/c/fid52F88B563EF2F997D579601831CEE125DFBB629F.aspx">tutaj</a>), żeby znaleźć jakiś inny kod, w którym ją znajdziemy, potem tylko szybki patch i button do sprawdzania hasła będzie włączony.</p><p>Algorytm sprawdzania hasła jest banalnie prosty:</p><div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> button1_Click<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<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><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">textBox1</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> <span style="color: #008000;">&#40;</span>Convert<span style="color: #008000;">.</span><span style="color: #0000FF;">ToBase64String</span><span style="color: #008000;">&#40;</span>Encoding<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Default</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">textBox1</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">textBox2</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Text</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        MessageBox<span style="color: #008000;">.</span><span style="color: #0000FF;">Show</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;You are great&quot;</span>, <span style="color: #666666;">&quot;Registration&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">else</span>
    <span style="color: #008000;">&#123;</span>
        MessageBox<span style="color: #008000;">.</span><span style="color: #0000FF;">Show</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;You failed. Try again.&quot;</span>, <span style="color: #666666;">&quot;Registration&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>Name: <strong>bartosz</strong> Password: <strong>YmFydG9zeg==</strong></p><p>Crackme może nie jest oryginalne, ale naprowadziło mnie na plugin Reflexil, który przyda się w przyszłości (pozwala na manipulację .net-owych assemblies i zapisywanie zmian do plików), tak więc zawsze jakis plus <img src='http://www.secnews.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><h3>4. SimpleCrackMe</h3><p>Chyba najprostsze crackme z całej listy (w wersji widnieje nazwa firmy Comarch).</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm4.png"><img class="alignnone size-full wp-image-520" title="SimpleCrackMe" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm4.png" alt="SimpleCrackMe" width="247" height="117" /></a></p><p>Do złamania wystarczy zmusić crackme do włączenia buttona. Jak to zrobić? Posłużymy się opisanym wyżej pluginem <strong>Reflexil</strong>. Kod wyłączający buttona zwykle znajduje się w procedurach ładowania okna lub inicjowania komponentów.</p><p>Po jego znalezieniu, z menu <em>Tools</em>, wybieramy Reflexil i w prawym panelu, na dole, pojawia się okno Reflexila z kodem IL bieżącej procedury:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_patch.png"><img class="alignnone size-medium wp-image-521" title="cm4_patch" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_patch-300x217.png" alt="cm4_patch" width="300" height="217" /></a></p><p>Mamy podobną sytuację jak w przypadku poprzedniego crackme. Należy zmodyfikować flagę FALSE, która wykorzystana jest do wyłączenia buttona. Aby to zrobić, klikamy prawym przyciskiem myszki na zaznaczony opcode i wybieramy <strong>EDIT</strong>, wyświetli się nam okno z opcją podmiany instrukcji:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_edit_op.png"><img class="alignnone size-medium wp-image-522" title="cm4_edit_op" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_edit_op-300x95.png" alt="cm4_edit_op" width="300" height="95" /></a></p><p>Na liście combo znajdują się wszystkie dostępne instrukcje, wybieramy więc <em>&#8220;ldc.i4.1&#8243;</em> (dokładnie tak jak w poprzednim crackme). Teraz, aby zapisać zmiany, należy kliknąć w drzewku Reflectora ikonkę modułu <strong>SimpleCrackme.exe</strong> i w oknie Reflexila pojawi się opcja zapisu:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_save.png"><img class="alignnone size-medium wp-image-523" title="cm4_save" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_save-300x217.png" alt="cm4_save" width="300" height="217" /></a></p><p>Tutaj wystąpuje jeden problem. Otóż crackme jest podpisane cyfrowo (tzw. <a href="http://msdn.microsoft.com/en-us/library/wd40t7ad(VS.80).aspx">StrongNamed Assemblies</a>) i zapisanie zmodyfikowanej wersji crackme spowoduje jego zawieszenie podczas uruchamiania.</p><p>Przy próbie zapisu zmodyfikowanego crackme, Reflexil pozwala wybrać co z tym fantem zrobić:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_signed.png"><img class="alignnone size-full wp-image-526" title="cm4_signed" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_signed.png" alt="cm4_signed" width="337" height="236" /></a></p><p>Z dostępnych opcji należy wybrać opcję usunięcia sygnatury strong name a następnie wybrać <em>&#8220;Cancel and keep it delay signed&#8221;</em>, albo jak komuś się chce, to można się pobawić w ponowne podpisywanie, własnym kluczem. Nie jestem do końca obeznany z tematem podpisywania assemblies, więc jeśli popełniłem jakiś błąd, skorygujcie mnie.</p><p>W każdym razie, po tych zmianach crackme się ładnie uruchamia i można klikać w button:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_cracked.png"><img class="alignnone size-full wp-image-527" title="cm4_cracked" src="http://www.secnews.pl/wp-content/uploads/2009/06/cm4_cracked.png" alt="cm4_cracked" width="247" height="117" /></a></p><h3>Finał</h3><p>Na tle wszystkich crackme, wyróżniło się crackme <strong>PIJA CrackMe 1</strong>. Wniosek jaki mi się jednak nasuwa jest taki, że jakiekolwiek zabezpieczenia .net nie mają sensu bez zastosowania obfuscatorów (i to dobrych).</p><h3>Keygeny</h3><p>Paczka z kodami dodatkowych narzędzi i generatorów kluczy:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/konkurs_dotnet_crackme.zip">konkurs_dotnet_crackme.zip</a> (4.51 MB)</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2009/06/22/crackme-net-rozwiazania/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>ESET crackme</title><link>http://www.secnews.pl/2009/06/19/eset-crackme/</link> <comments>http://www.secnews.pl/2009/06/19/eset-crackme/#comments</comments> <pubDate>Fri, 19 Jun 2009 20:04:57 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[Artykuły]]></category> <category><![CDATA[Reversing]]></category> <category><![CDATA[crackme]]></category> <category><![CDATA[ESET]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=472</guid> <description><![CDATA[ESET vs ME Na tegorocznej edycji konferencji CONFidence 2009 ukazało się CrackMe przygotowane przez dzielnych pracowników polskiego oddziału firmy antywirusowej ESET. Jako, że nie uczeszczam na tego typu zloty, dowiedziałem się o tym CrackMe ze wpisu na blogu Gynvaela, który opisał metodę jego złamania. Zachęcony usunięciem moich negatywnych komentarzy z blogu Gynvaela, dotyczących metod zabezpieczeń [...]]]></description> <content:encoded><![CDATA[<h3><a href="http://www.eset.pl"><img class="alignright size-full wp-image-479" title="ESET" src="http://www.secnews.pl/wp-content/uploads/2009/06/eset.png" alt="ESET" width="105" height="45" /></a>ESET vs ME</h3><p>Na tegorocznej edycji konferencji <a href="http://2009.confidence.org.pl/">CONFidence 2009</a> ukazało się CrackMe przygotowane przez dzielnych pracowników polskiego oddziału firmy antywirusowej <strong>ESET</strong>.</p><p>Jako, że nie uczeszczam na tego typu zloty, dowiedziałem się o tym CrackMe ze wpisu na <a href="http://gynvael.coldwind.pl/?id=194">blogu Gynvaela</a>, który opisał metodę jego złamania.</p><p>Zachęcony usunięciem moich negatywnych komentarzy z blogu Gynvaela, dotyczących metod zabezpieczeń zastosowanych w CrackMe, postanowiłem w ramach rozrywki i jednocześnie zemsty za cenzurę, opublikować moją analizę i jednocześnie dekompilację CrackMe.</p><h3>Opis ogólny</h3><p>CrackMe zostało stworzone w assemblerze pod MASMem w wersji 5 (czyli dość starej), celem jest odnalezienie właściwego hasła (samego, bez pary name/serial).</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme.png"><img class="alignnone size-medium wp-image-483" title="ESET crackme" src="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme-300x85.png" alt="ESET crackme" width="300" height="85" /></a></p><h3>Użyte zabezpieczenia</h3><p>Największym zabezpieczeniem CrackMe jest jego <strong>niekompatybilność</strong> ze wszystkimi innymi wersjami systemu Windows oprócz Windows XP. Na starszych wersjach systemu Windows nawet nie ma co go odpalać (brak mechanizmu obsługującego <em>TLS Callbacks</em>), Windows 2000 wisi, a na nowszych występuje problem z prawami administracyjnymi. Ale może od początku.</p><p>Dodatkowym zabezpieczeniem są debug messages, które zostawił programista (zapewne dla zmyłki), choć jak czytam na blogu Gyna, po prostu ich chłopaczyna zapomniał usunąć — biedne, zagubione dziecko.</p><h5>TLS Callbacks</h5><p>CrackMe po uruchomieniu wykorzystuje funkcje TLS Callbacks do pobrania adresów swoich funkcji API. Są one wywoływane przez loadera Windows przed wejśćiem w entrypoint, mechanizm ten jest wykorzystywany m.in. przez protektor <em>ExeCryptor</em>. Adresy funkcji API (tylko z biblioteki KERNEL32.dll) pobierane są poprzez liczenie sum kontrolnych wszystkich eksportowanych funkcji z KERNEL32.dll i porównywanie ich z zapisanymi sumami funkcji wykorzystywanych przez CrackMe.</p><p>Procedura obliczająca sumę kontrolną wydała mi się na tyle charakterystyczna, że od razu pomyślałem, żeby sprawdzić z jakiego wirusa została <strong>podprowadzona</strong> przez sprytnego kodera ESET. Po krótkim poszukiwaniu wśród archiwów magazynów <a href="http://vx.netlux.org/">virii</a>, poniżej przedstawiam procedurę z CrackMe oraz 2 procedury CRC32 autorstwa Vecny, znanego twórcy wirusów z grupy 29A:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_crc32.png"><img class="alignnone size-medium wp-image-486" title="ESET crackme CRC32" src="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_crc32-300x223.png" alt="ESET crackme CRC32" width="300" height="223" /></a></p><p>Zmieniona została jedynie wartość inicjalizacyjna CRC_POLY. Wnioski co do korzystania z <strong>kodów wirusów</strong> w CrackMe <strong>firmy antywirusowej</strong> pozostawiam czytelnikom.</p><h4>Tracer</h4><p>Po pobraniu adresów funkcji API, CrackMe uruchamia kopię swojego procesu w <a href="http://msdn.microsoft.com/en-us/library/ms681675(VS.85).aspx">trybie debug</a> (na wzór protektora <em>Armadillo</em>) i oczekuje na wyjątek.</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_tracer.png"><img class="alignnone size-medium wp-image-489" title="ESET crackme tracer" src="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_tracer-192x300.png" alt="ESET crackme tracer" width="192" height="300" /></a></p><h4>Sprawdzanie hasła</h4><p>Uruchomienie kopii swojego procesu w trybie debug wykorzystywane jest w procedurze sprawdzającej hasło, gdzie wpisany tekst jest szyfrowany a następnie porównywany z zaszyfrowanym wzorem poprawnego hasła.</p><p>Tutaj wchodzi do gry 2 kopia procesu, w pętli debugującej oczekuje na wyjątek. Procedura szyfrowania wpisanego hasła, przed przystąpieniem do samego szyfrowania ustawia flagę <a href="http://en.wikipedia.org/wiki/Trap_flag">TRAP FLAG</a> w rejestrze flag (używając instrukcji:</p><div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">pushfd</span> <span style="color: #666666; font-style: italic;">; zapamiętaj stan flag na stosie</span>
<span style="color: #00007f; font-weight: bold;">xor</span>     <span style="color: #000000; font-weight: bold;">dword</span> <span style="color: #000000; font-weight: bold;">ptr</span> <span style="color: #00007f;">ds</span><span style="color: #339933;">:</span><span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">esp</span><span style="color: #009900; font-weight: bold;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">100000000b</span> <span style="color: #666666; font-style: italic;">; ustaw flagę TRAP</span>
<span style="color: #00007f; font-weight: bold;">popfd</span> <span style="color: #666666; font-style: italic;">; przywróć stan flag ze stosu</span></pre></div></div><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_trapflag.png"><img class="alignnone size-medium wp-image-490" title="ESET crackme trapflag" src="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_trapflag-300x171.png" alt="ESET crackme trapflag" width="300" height="171" /></a></p><p>Ustawienie flagi TRAP FLAG sprawi, że wykonanie każdej następnej instrukcji spowoduję wyjątek single step exception (EXCEPTION_SINGLE_STEP) i kontrola zostanie przekazana do pętli debugującej.</p><p>O co w tym chodzi? Szyfrowanie wpisanego hasła wykorzystuje serię instrukcji ADD, SUB, XOR i LEA. Jednak przy ustawionej fladze śledzenia krokowego, przed wykonaniem kolejnych instrukcji szyfrujących, kontrola przekazywana jest do pętli debugującej, która sprawdza jaka ma być aktualnie wykonana instrukcja szyfrująca i w zależności co to będzie, dodatkowo modyfikuje wartość przed zaszyfrowaniem.</p><p>Wykrywane są 3 rodzaje instrukcji szyfrujących i przed ich wykonaniem modyfikowany jest rejestr EAX (w którym znajduje się fragment wpisanego hasła):</p><ul><li>XOR EAX, IMM32 -&gt; EAX = EAX &#8211; 2</li><li>SUB EAX,IMM32 -&gt; EAX = EAX + 1</li><li>ADD EAX,IMM32 -&gt; EAX = EAX ^ 0&#215;10101010</li></ul><p>Cała pętla szyfrująca jest na bieżąco śledzona przez drugą kopię programu (cały czas odświeżana jest flaga TRAP FLAG), aż do momentu napotkania specjalnego markera (4 x NOP), który przerywa proces śledzenia, co oznacza, że całe hasło zostało zaszyfrowane, po czym jest porównywane z wzorcem oczekiwanego hasła i na tej podstawie stwierdzana jest jego poprawność.</p><p>Odtworzenie poprawnego hasła wymaga odwrócenia kolejności instrukcji szyfrujących oraz dodania dodatkowych instrukcji modyfikujących stan rejestru EAX (symulacja pętli debugującej), całość klepnąłem w PHP i jest dostępna na końcu.</p><p>Poprawne hasło to <em><strong>&#8220;You talkin&#8217; to me?&#8221;</strong></em>.</p><h4>Bug</h4><p>CrackMe posiada również buga (feature?), który dzięki sprytnym panom z Microsoft jest poprawnie rozpoznawany przez Windows i nie powoduje zwiechy:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_bug.png"><img class="alignnone size-medium wp-image-491" title="ESET crackme bug" src="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_bug-300x142.png" alt="ESET crackme bug" width="300" height="142" /></a></p><h3>Dekompilacja</h3><p>Dekompilacja crackme + dekoder i oryginalne 2 wersje crackme:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme.zip">eset_crackme.zip</a> (102 kB)</p><h3>Fin</h3><p>Wklepując w google frazę <a href="http://www.google.pl/search?q=ESET+Polska">&#8220;ESET Polska&#8221;</a> wyskakuje m.in. strona zapowiadająca:</p><blockquote><p><a href="http://manager.money.pl/hitech/artykuly/artykul/eset;w;polsce;zatrudnimy;wszystkich;najlepszych;specjalistow,236,0,351468.html">ESET w Polsce: zatrudnimy wszystkich najlepszych specjalistów</a></p></blockquote><p>Jeśli u was rzeczywiście pracują <strong>sami najlepsi</strong>, to czy całą resztę macie za idiotów?</p><p>PS.<br /> I jeszcze krótka wiadomość dla panów z ESET, którzy odgrażali się, że zrobią mi CrackMe z jakimś <em>RSA64</em> i zakazem patchowania:</p><p><a href="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_zjadam.png"><img class="alignnone size-medium wp-image-493" title="Zjadam was na śniadanie" src="http://www.secnews.pl/wp-content/uploads/2009/06/eset_crackme_zjadam-300x201.png" alt="Zjadam was na śniadanie" width="300" height="201" /></a></p><p>Jak widzicie, takie mózgi jak wy zjadam na śniadanie <img src='http://www.secnews.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2009/06/19/eset-crackme/feed/</wfw:commentRss> <slash:comments>19</slash:comments> </item> <item><title>Konkurs na Crackme w .NET</title><link>http://www.secnews.pl/2009/01/06/konkurs-na-crackme-w-net/</link> <comments>http://www.secnews.pl/2009/01/06/konkurs-na-crackme-w-net/#comments</comments> <pubDate>Tue, 06 Jan 2009 15:34:38 +0000</pubDate> <dc:creator>bartek</dc:creator> <category><![CDATA[Inne]]></category> <category><![CDATA[.net]]></category> <category><![CDATA[crackme]]></category> <category><![CDATA[konkurs]]></category><guid isPermaLink="false">http://www.secnews.pl/?p=335</guid> <description><![CDATA[W zasadzie nie wiem co mnie opętało, że o tym piszę, może fakt, że nic tu od dawna nie było pisane. No więc tak, konkurs na najbardziej ehem zaawansowane technologicznie zabezpieczenie .NET http://ms-groups.pl/kgd.net/Konkurs_CrackMe/default.aspx Osobiście nie widziałem żadnego polskiego softu do zabezpieczania .NET-ów, więc poziom &#8220;zaawansowania&#8221; tych crackmesów jest równie &#8220;wysoki&#8221; jak wiedza ich autorów o [...]]]></description> <content:encoded><![CDATA[<p>W zasadzie nie wiem co mnie opętało, że o tym piszę, może fakt, że nic tu od dawna nie było pisane.</p><p>No więc tak, konkurs na najbardziej ehem zaawansowane technologicznie zabezpieczenie .NET</p><p><a href="http://ms-groups.pl/kgd.net/Konkurs_CrackMe/default.aspx">http://ms-groups.pl/kgd.net/Konkurs_CrackMe/default.aspx</a></p><p>Osobiście nie widziałem żadnego polskiego softu do zabezpieczania .NET-ów, więc poziom<em> &#8220;zaawansowania&#8221;</em> tych crackmesów jest równie <em>&#8220;wysoki&#8221;</em> jak wiedza ich autorów o tworzeniu crackmesów jak i zabezpieczaniu aplikacji, więc nie spodziewajcie się wodotrysków&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://www.secnews.pl/2009/01/06/konkurs-na-crackme-w-net/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> </channel> </rss>
