-
-
Save anonymous/b8ce8b952fdd30918023 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
On 30.6.2012 02:36, <cenzored> wrote: | |
> Dobrý den,je mi 11 a měl bych dotaz ke článku ,,Jaks e stát | |
> hackerem",musím uznat že jste to vystih,ale teď ten dotaz,v čem se to | |
> programuje?Já nevim,tím pythovým jazykem píšete třeba do textovýho | |
> dokumentu a ono vám to vytvoří ten program?O hackování se zajímám ccl.2 | |
> měsíce ale zatím vím spíš něco z crackerování,ale díky vašemu článku sem | |
> to konečně trochu pochopil,teda to jak se dostat do jinýho počítače,to | |
> jak nabourat do stránky sem přibližně věděl už před tím,takže zatím díky | |
> za odpověď,jinak máte tam napsáno že nikoho nebudete učit hackovat takže | |
> to berte prostě jako zvědavost malýho haranta. :D | |
Ahoj. | |
Dle toho co jsi napsal, nechápeš skoro nic, což neber jako urážku, ale | |
jako konstatování. Na rozdíl od spousty ostatních lidí jsi byl schopný | |
napsat to slušnou češtinou, navíc jsi projevil jistou iniciativu, čímž | |
jsi projevil dostatek inteligence, aby sis zasloužil odpověď. | |
Odpověď je poněkud delší: | |
Existují v zásadě čtyři možné abstraktní úrovně programování něčeho: | |
1) Psaní přímo ve strojovém kódu. | |
2) Psaní v assembleru. | |
3) Psaní v kompilovaných jazycích. | |
4) Psaní v interpretovaných jazycích. | |
Jednotlivé úrovně se liší podle složitosti, možností, které ti to dává | |
při manipulaci s počítačem a efektivitou práce. | |
--- | |
1) PSANÍ VE STROJOVÉM KÓDU | |
Psaní ve strojovém kódu je nejtěžší, protože nepoužíváš programovací | |
jazyk, ale píšeš přímo instrukce procesoru, což jsou sekvence čísel. | |
Pokud chceš pochopit jak to vypadá, tady je malá ukázka (celý program má | |
45724 řádek těchto čísel) z programu pro smazání souboru s názvem | |
"soubor.txt": | |
00b5a80 6878 5a61 3176 5f35 645f 6c67 7469 7265 | |
00b5a90 6c61 3632 3532 464d 415a 6179 5f00 3344 | |
00b5aa0 7473 3864 6164 6574 6974 656d 3431 6579 | |
00b5ab0 7261 7349 654c 7061 6559 7261 4e46 4e61 | |
00b5ac0 6962 625a 5f00 3344 7473 3564 7473 6964 | |
00b5ad0 346f 6946 656c 4237 4379 7568 6b6e 6535 | |
00b5ae0 706d 7974 784d 4e46 5a64 0062 445f 6334 | |
00b5af0 726f 3665 6874 6572 6461 3431 6946 6562 | |
00b5b00 4572 6378 7065 6974 6e6f 5f37 435f 616c | |
00b5b10 7373 005a 445f 7333 6474 6334 6e6f 3176 | |
00b5b20 5f39 545f 7434 7865 5474 7941 5461 5477 | |
00b5b30 7941 5a61 7434 7865 4674 7941 7761 7941 | |
00b5b40 5a61 7941 0061 445f 7333 6474 6438 7461 | |
00b5b50 7465 6d69 3965 6954 656d 664f 6144 3679 | |
00b5b60 5f5f 7463 726f 464d 614e 6969 5a69 3353 | |
00b5b70 7473 3864 6164 6574 6974 656d 5439 6d69 | |
00b5b80 4f65 4466 7961 5f00 3344 7473 3564 6172 | |
00b5b90 676e 3565 5f33 545f 7235 7465 6f72 4154 | |
Jedná se o čísla v hexadecimálním formátu, což je způsob vyjádření | |
obsahu buněk v paměti. | |
Lidé si něco takového nejsou schopní zapamatovat, proto vznikl assembler. | |
2) PSANÍ V ASSEMBLERU | |
Viděl jsi předchozí čísla - nedá se z nich vůbec poznat, o co se jedná. | |
Proto existuje assembler - jazyk, který vyjadřuje, co daná čísla | |
znamenají. Dá se z nich jednodušeji (jednodušeji, ne jednoduše) | |
pochopit, co program dělá, ale pořád je to dost nízkoúrovňové a proto ho | |
většina programátorů nepoužívá, pokud vyloženě nemusí. | |
Čísla z předchozího programu dovede takzvaný disassembler (program pro | |
převod existujících programů na zdrojový kód v assembleru) převést na | |
zkratky instrukcí pro procesor. To může vypadat takto (nejedná se o | |
stejnou část programu jako v případě předchozího výpisu): | |
08082e74 <_Dmain>: | |
8082e74: 55 push %ebp | |
8082e75: 8b ec mov %esp,%ebp | |
8082e77: ff 35 b4 e2 0a 08 pushl 0x80ae2b4 | |
8082e7d: ff 35 b0 e2 0a 08 pushl 0x80ae2b0 | |
8082e83: e8 18 17 00 00 call 80845a0 <_D3std4file6removeFxAaZv> | |
8082e88: 31 c0 xor %eax,%eax | |
8082e8a: 5d pop %ebp | |
8082e8b: c3 ret | |
8082e8c: 90 nop | |
8082e8d: 90 nop | |
8082e8e: 90 nop | |
8082e8f: 90 nop | |
Jak je vidět, na začátku každého řádku je dlouhé číslo - to označuje | |
pořadí instrukce, kolikátá je v souboru. | |
Dále následuje sekvence čísel a znaků - například 55, nebo na druhém | |
řádku 8b ec. To jsou kódy instrukcí tak, jak je vidí procesor a jak byly | |
zobrazeny ve výpisu nahoře. | |
Napravo je pak příkaz assembleru, například 'push %ebp', nebo 'call | |
80845a0 <_D3std4file6removeFxAaZv>'. | |
Příkaz assembleru ti umožňuje zjistit (či specifikovat), co procesor udělá. | |
'mov' například znamená, že přesune informace z jedno paměťové buňky do | |
druhé. | |
'push' znamená, že obsah této buňky přidá na zásobník podobných buněk. | |
'call' znamená, že se zavolá podprogram, což je další sekvence podobných | |
instrukcí. V příkladu výše se pomocí call volá funkce na adrese 80845a0 | |
- tu bys našel tak, že na řádku úplně na začátku by bylo 80845a0. Jméno | |
podprogramu, který se volá je _D3std4file6removeFxAaZv. | |
Všimni si v něm slov std file remove, později se k tomu vrátím. | |
-- | |
Podle toho co má instrukce za parametry se mění způsob, jakým to | |
provede. Například určuješ, kterou buňku kam předá: | |
mov %esp,%ebp | |
Tohle v podstatě říká, ať procesor přesune obsah buňky s názvem 'ebp' do | |
buňky 'esp'. Kdybych to měl vyjádřit graficky, tak je to: | |
esp <- ebp | |
-- | |
Assembler pořád není moc intuitivní. Kdybys chtěl tímhle způsobem | |
naprogramovat něco užitečného pro moderní počítače, potřebuješ desítky | |
až stovky tisíc řádek podobných instrukcí. Není to dostatečně | |
abstraktní, ty chceš třeba napsat program, který smaže soubor - pokud | |
bys ho psal v assembleru, musíš prvně přesouvat čísla (či znaky) z buněk | |
do buněk a poté zavolat nějakou funkci jádra operačního systému, jako | |
podprogram, která informace z buněk vyzvedne, smaže soubor a pak o tom | |
uloží informace do dalších buněk v paměti. | |
Když se někdo koukne na tvůj kód, bude mít stovky až tisíce řádek | |
různých instrukcí a bude velice nepřehledný, takže se v něm za půl roku | |
ani ty sám nevyznáš. | |
Další věc je, že assemblery jsou pro každý druh počítače jiné. Jiný | |
assembler má tvůj počítač, jiný má tvůj mobil a jiný má počítač v autě, | |
nebo ten co řídí semafor. | |
Proto se moc nevyplatí v něm programovat, protože pro každý procesor se | |
musíš naučit nový assembler a programy, které jdou na procesoru typu | |
x86_64 nepůjdou na x86, či mipsel. | |
Jinak jen pro zajímavost: pokud se někde uvádí, že procesor funguje na | |
frekvenci třeba 3GHz, znamená to, že provede 3 000 000 000 taktů za | |
vteřinu. Během jednoho taktu moderní procesory zpracují jednu, či více | |
instrukcí, takže, když to pro názornost podstatně zjednoduším a vynechám | |
některé důležité detaily, dá se říct, že procesor vykoná za vteřinu 3 | |
000 000 000 řádek assembleru. Docela dobré, ne? | |
3) PSANÍ V KOMPILOVANÝCH JAZYCÍCH | |
Jak jsi viděl - assembler je sice o dost přehlednější než strojový kód, | |
ale pořád je dost nízkoúrovňový a programování v něm jej docela náročné | |
a složité. | |
Proto vznikly takzvané kompilované jazyky - jedná se o jazyky, kde | |
programátor popíše v nějakém relativně příjemném jazyku co chce aby se | |
stalo do textového souboru. Ten vypadá třeba takto: | |
import std.stdio; | |
import std.file : remove; | |
int main(string[] args){ | |
remove("soubor.txt"); | |
return 0; | |
} | |
Ten pak pomocí KOMPILÁTORU převede na STROJOVÝ KÓD, tedy spustelný | |
soubor třeba s příponou .exe, takže například 'remove.exe'. | |
Tenhle soubor se pak dá spouštět na počítačích se stejným typem | |
procesoru a operačního systému. Když přijdeš k počítači s jiným typem | |
procesoru a operačního systému, prostě si vezmeš znova Zdrojový kód, | |
opět se zkompiluje a převede se na Strojový kód daného procesoru. | |
Výše uvedená ukázka je v programovacím jazyce D. Je už docela přehledná | |
- všimni si řádku s nápisem: | |
remove("soubor.txt"); | |
To už je docela přehledné, ne? | |
-- | |
Osm řádků v programovacím jazyce D se přeloží na 74985 řádků kódu v | |
assembleru, což představuje 728KB strojového kódu. | |
To znamená, že KOMPILÁTOR za mě vytvořil desítky tisíc řádků v | |
assembleru. Prakticky by jich mohlo být o dost méně, ale použil jsem | |
jazyk, který mi to jako programátorovi dost usnadňuje. Kdybych použil | |
kompilovaný jazyk C, který není tak jednoduchý, bylo by těch řádek jen | |
několik tisíc. | |
4) PSANÍ V INTERPRETOVANÝCH JAZYCÍCH | |
Program v assembleru měl stovky až tísíce řádků. Zdrojový soubor v | |
KOMPILOVANÉM programovacím jazyce D měl osm řádků, program v | |
interpretovaném jazyce python jde ještě dále a bude mít jen dva: | |
import os | |
os.remove("soubor.txt") | |
Jednoduché, ne? Prvním řádkem řekneš, že chceš pracovat s operačním | |
systémem. Druhým řádkem operačnímu systému dáš příkaz, aby odstranil | |
soubor s názvem 'soubor.txt'. | |
Interpretované jazyky za tuto jednoduchost platí většími nároky na paměť | |
a procesor. | |
Na rozdíl od KOMPILOVANÝCH programovacích jazyků NEjsou překládány do | |
STROJOVÉHO KÓDU, se kterým umí pracovat procesor. Místo toho jsou | |
předané programu zvanému INTERPRETR, který je prochází řádek po řádku a | |
když narazí na nějakou instrukci, zavolá podprogram, který provede to | |
samé. Tento podprogram může mít třeba deset tisíc řádků v jazyce D a | |
stovky tisíc řádků v jazyce assembler. | |
V praxi to znamená, že INTERPRETOVANÉ jazyky nikdy nejdou do procesoru, | |
vždy jdou do INTERPRETRU, který je napsaný v KOMPILOVANÉM jazyce. V | |
procesoru jsou vykonávány příslušné části programu INTERPRETRU, podle | |
toho na který řádek zrovna narazí. | |
Díky tomu, že nejdou do procesoru přímo fungují na všech procesorech kde | |
jsi již prvně zkompiloval interpretr. | |
Python je dost silný jazyk - jeden jeho řádek vydá za 5 řádků v D, za 10 | |
až 20 v C a za několik set až tisíc v assembleru, proto jsem chtěl, aby | |
jste s ním začínali a v článku jsem ho tolik doporučoval. | |
--------------------------------------------------------------------- | |
Abych to shrnul, obecně platí následující vztahy: | |
Čím blíže k číslu 1 - strojovému kódu, tím složitěji se programuje, | |
klesá efektivita, ale na druhou stranu máš větší možnosti při manipulaci | |
s počítačem. | |
Čím výše k číslu 4 - interpretovaným jazykům, tím jednodušší a | |
efektivnější programování, na druhou stranu nemáš takové možnosti | |
ovládat hardware. | |
--- | |
Python spadá do kategorie 4 - je interpretovaný. To znamená, že je | |
lehký, efektivní, ale některé věci, jako třeba operační systém v něm | |
nikdy neuděláš. To se může zdát jako nevýhoda, ale jelikož to má být | |
tvůj první programovací jazyk, tak to taková nevýhoda ve skutečnosti není. | |
Jak už jsi asi pochopil, chce to sehnat někde interpretr pythonu, třeba | |
ze stránek http://python.org. | |
Potom ti stačí jednotlivé programy napsat do textového souboru a pomocí | |
interpretru je nechat provést. | |
Doufám že jsem to vysvětlil dostatečně jasně ;) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment