<?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>Bloog.sk &#187; Disassembling</title>
	<atom:link href="http://www.bloog.sk/category/programovanie/assembler-a-cracking/disassembling/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bloog.sk</link>
	<description>recenzie a kvalitné informácie z digitálneho sveta</description>
	<lastBuildDate>Sun, 26 Jun 2011 20:30:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Disassembling a cracking na príklade v C++, časť 1</title>
		<link>http://www.bloog.sk/2009/08/26/hello-world/</link>
		<comments>http://www.bloog.sk/2009/08/26/hello-world/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 11:01:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Disassembling]]></category>

		<guid isPermaLink="false">http://blog.drozd-computers.sk/?p=1</guid>
		<description><![CDATA[Disassembling a cracking. Techniky pri rozoberaní binárneho kódu.]]></description>
			<content:encoded><![CDATA[<p>Mnoho ľudí si myslí že &#8220;rozobratie&#8221; nejakého exe-čka alebo iného binárneho (kompilovaného) kódu je nemožné alebo skoro nemožné.  Stačí pritom len pár dní venovaných assembleru (pre intel/PC architekturu je assembler x86) a pár nástrojom na disassemblerovanie binárneho kódu, prípadne na odstránenie ochranných techník.</p>
<p>Každý binárny program nie je nič iné ako postupnosť strojových inštrukcií. A každej strojovej inštrukcii odpovedá príkaz v jazyku assembler. To znamená, kto ovláda dokonale assembler a dokáže program zapísaný v assembleri aj čítat, tomu nerobí problém pochopiť ako akýkoľvek binárny program funguje. Samozrejme existuje mnoho ochranných techník ktoré sa snažia čítanie programu čo najviac zkomplikovať ale samozrejme na každú ochrannú techniku existuje technika ktorá ju prelomí.  Okrem samotných techník a nástrojov, celú situáciu může komplikovať aj samotný kompiler ktorý vytvoril tento binárny kód. Na internete však existuje mnoho manuálov, a návodov s ukážkami ako sa preloží (zkompiluje) trieda v C++ do assembleru, prípadne cyklus, switch a ďalšie konštrukcie programovacieho jazyka. Uvediem príklad v C++. Tento program bol zkompilovaný a následne disassemblerovaný.</p>
<h3><strong>Príklad 1</strong>: Funkcie z C++ v assembleri</h3>
<p><b>V jazyku C++</b></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">int</span> a<span style="color: #008080;">;</span>
      func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      a<span style="color: #000080;">=</span><span style="color: #208080;">0x666</span><span style="color: #008080;">;</span>
      func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
func<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">int</span> a<span style="color: #008080;">;</span>
      a<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><b>V jazyku assembler x86</b><br />
Poznámka pre neznalcov assembleru:<br />
Znak <strong>;</strong> je znakom <strong>komentára</strong>, ten sa samozrejme nikde v disassemblerovanom kóde nevyskytuje. Uvádzam ho kvôli prehľadnosti.<br />
Príkaz <strong>call &lt;adresa&gt; </strong>je jump na adresu &lt;adresa&gt;<br />
<strong>Lokálne premenné</strong> sa ukladajú na adresy [ebp-X]. Teda ak premenná zaberá 2 byte (integer), tak prvá definovaná lokálna premenná sa uloží na adresu [ebp-2], ďalšia na adresu [ebp-4] a pod.<br />
Registre <strong>eax, ebx, ecx</strong>&#8230; su 32-bitové registre, tkzv. procesorove premenné. Nie sú uložené v pamäti ale priamo v procesore. Je to najrýchlejší druh pamäte v počítaci. Väčšinou sa používajú ako medzivýsledky a tiež ako iterátory.</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401000</span> <span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ebp</span> <span style="color: #666666; font-style: italic;">; Začiatok funkcie main()</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401001</span> <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebp</span><span style="color: #339933;">,</span> <span style="color: #00007f;">esp</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401003</span> <span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ecx</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401004</span> <span style="color: #00007f; font-weight: bold;">call</span> <span style="color: #0000ff;">401019</span><span style="color: #666666; font-style: italic;">; V jazyku C++ je to riadok (prvé volanie): func()</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401004</span> <span style="color: #666666; font-style: italic;">; Tu voláme nejakú funkcie (voláme func())</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401004</span> <span style="color: #666666; font-style: italic;">; Jediným tkzv skrytým operandom je adresa začiatku funkcie,</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401004</span> <span style="color: #666666; font-style: italic;">; presnejšie povedané, je to offset v code segmente.</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401004</span> <span style="color: #666666; font-style: italic;">; Tento parameter je minimálne vždy pred každým volaním funkcie.</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401004</span> <span style="color: #666666; font-style: italic;">; Bez neho by sme sa nevedeli vrátiť naspäť.</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401009</span> <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #000000; font-weight: bold;">dword</span> <span style="color: #000000; font-weight: bold;">ptr</span> <span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">ebp</span><span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">666h</span> <span style="color: #666666; font-style: italic;">; V jazyku C++ je to riadok: a=0x666</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401010</span> <span style="color: #00007f; font-weight: bold;">call</span> <span style="color: #0000ff;">401019</span> <span style="color: #666666; font-style: italic;">;V jazyku C++ je to riadok (druhé volanie): func()</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401015</span> <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">esp</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ebp</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401017</span> <span style="color: #00007f; font-weight: bold;">pop</span> <span style="color: #00007f;">ebp</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401018</span> <span style="color: #00007f; font-weight: bold;">retn</span> <span style="color: #666666; font-style: italic;">; Koniec funkcie main()</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401019</span> <span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ebp</span> <span style="color: #666666; font-style: italic;">; Začiatok funkcie func().</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span>0040101A <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebp</span><span style="color: #339933;">,</span> <span style="color: #00007f;">esp</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span>0040101C <span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ecx</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span>0040101D <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">ebp</span><span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #666666; font-style: italic;">; premenná &quot;a&quot; je uložená na adrese [ebp-4], šupneme ju do eax</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401020</span> <span style="color: #00007f; font-weight: bold;">add</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">1</span> <span style="color: #666666; font-style: italic;">; V jazyku C++ je to riadok: a++</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401023</span> <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">ebp</span><span style="color: #339933;">-</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; a tu výsledok operácie uložíme naspäť do premennej &quot;a&quot;</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401026</span> <span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">esp</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ebp</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401028</span> <span style="color: #00007f; font-weight: bold;">pop</span> <span style="color: #00007f;">ebp</span>
<span style="color: #339933;">.</span>text<span style="color: #339933;">:</span><span style="color: #0000ff;">00401029</span> <span style="color: #00007f; font-weight: bold;">retn</span> <span style="color: #666666; font-style: italic;">; Koniec funkcie func()</span></pre></div></div>

<p>Ako je to vidno na predchádzajúcom príklade, program z C++ zapísaný do assembleru nie je taký hrôzostrašný. Museli sme si však sami vyznačiť kde začína funkcia a kde končí, aké má parametre, čo je premenná a pod. Samozrejme ak by sme to všetko museli robiť manuálne, neexistovalo by na internete toľko rôznych crackov a upraveného software. Existuje totiž veľké množstvo programov ktore disassemblerovanie robia omnoho jednoduchším. Najlepším z nich je program <strong>IDA (<a href="http://www.hex-rays.com/idapro/" onclick="pageTracker._trackPageview('/outgoing/www.hex-rays.com/idapro/?referer=');">http://www.hex-rays.com/idapro/</a>)</strong>. Ten dokáže vytvoriť grafy volania funkcíí, flow chart a podobne. Automaticky rozpozná lokálne a globálne premenné a win32 API volania!. Viď nasledujúci obrázok:<br />
<a href="http://www.hex-rays.com/idapro/" onclick="pageTracker._trackPageview('/outgoing/www.hex-rays.com/idapro/?referer=');"><img class="aligncenter" title="IDA" src="http://www.bloog.sk/wp-content/uploads/ida_image_big.gif" alt="IDA" /></a></p>
<p style="text-align: left;">Samozrejme softwarové firmy nie sú nadšené z toho ako sa im niekto hrabe v ich kóde alebo upravuje, preto vznikla rada ochranných technik, ktoré sa predovšetkým snažia čo najviac zkomplikovať čítanie disassemblerovaného kódu (Anti-disassembling). Robia to väčšinou tak, že tam pridajú mnoho zbytočného kódu, ktorý sa v skutočnosti preskakuje veľmi komplikovanými kombináciami jumpov.  Medzi týmto zbytočným kódom (ktorý vlastne procesor nevykonáva) sa nachádza aj skutočný kód, ktorý reálne beží. Lenže aj na takéto komplikované  miešanice sa našli talenty medzi crackarmi, ktorí venovali svoj čas a vytvorili nástroje likvidujúce túto nepríjemnosť.</p>
<p>Všetkým ktorých zaujíma cracking a chceli by sa tomu hlbšie venovať, odporúčam naštudovať si assembler, a sami si to skúšať. Naprogramujte si nejaký jednoduchý program v C++. Pridajte tam riadky napríklad a=0&#215;666666;, pomocou ktorých sa ľahšie zorientujete v disassemblerovanom kóde, pretože assemblerovský kód pre riadok a=0&#215;666666 nájdete veľmi jednoducho &#8211;  hľadaním hodnoty 666666. Vyskúšajte ako sa preloží niektorá konštrukcia v C++ do assembleru. Môžete si nastaviť rôzne úrovne optimalizácie a sledovať ako sa výsledný kód mení. Ak sa vám moc skúšať nechce, na internete nájdete veľa referenčných príručok a manuálov.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/08/26/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached
Page Caching using memcached (user agent is rejected)
Database Caching 12/23 queries in 0.007 seconds using memcached
Object Caching 274/281 objects using memcached
Content Delivery Network via N/A

Served from: www.bloog.sk @ 2012-02-09 01:03:22 -->
