Skip to content

Instantly share code, notes, and snippets.

Created June 30, 2012 16:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/b8ce8b952fdd30918023 to your computer and use it in GitHub Desktop.
Save anonymous/b8ce8b952fdd30918023 to your computer and use it in GitHub Desktop.
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